Skip to main content

使用状況と課金のメトリック

このガイドでは、Copilot SDK アプリケーションからトークン数、コンテキスト ウィンドウ使用率、AI クレジット コスト、アカウント クォータを読み取る方法について説明します。 TypeScript、Python、Go、.NET、Java、Rust の例を示します。

ヒント

各例は、複数の言語で機能的に同等です。 TypeScript スニペットは既定で展開されます。折りたたみ可能なブロックから言語を選択して、その SDK で同じロジックを表示します。

概要

SDK は、次の 2 つの補完的なメカニズムを使用して使用状況データを表示します。

  • セッション イベント: ターンの実行時にランタイムが出力するエフェメラル イベント。 これらをサブスクライブして、リアルタイムの API 呼び出しごとのデータを取得します。
  • RPC メソッド: 要求時に行う要求/応答呼び出し。 累積合計のスナップショットを作成したり、アカウント レベルのクォータを検索したりするには、これらを使用します。

次の表は、各シグナルを公開する API にマップします。

信号APIScopeタイプ
呼び出しごとのトークン数
assistant.usage 出来事SessionEvent
コンテキスト ウィンドウの使用率
session.usage_info 出来事SessionEvent
コンテキスト ウィンドウの内訳 (オンデマンド)session.metadata.contextInfoSessionRPC
累積 AI クレジットとトークンの合計session.usage.getMetricsSessionRPC
モデルごとの AI クレジットの価格models.listサーバーRPC
アカウント クォータと Premium の相互作用account.getQuotaサーバーRPC

メモ

session.usage.getMetricssession.metadata.contextInfo、および session.metadata.recomputeContextTokens は、生成された RPC サーフェスで試験段階としてマークされます。 .NETでは、#pragma warning disable GHCP001またはプロジェクト レベルの<NoWarn>GHCP001</NoWarn>で抑制する、GHCP001試験的な診断が発生します。 アプリケーションがそれらに依存している場合は、SDK と Copilot CLI ランタイムの両方をピン留めします。

次のフィールド テーブルには、このページの例で使用されているフィールドのみが一覧表示されます。 完全で常に最新のフィールド参照は、生成された SDK の種類と AUTOTITLE です。AUTOTITLE は、依存関係のバンプごとに CLI スキーマから再生成されます。 それらを真理の源として扱い、このページをタスク指向のガイドとして扱います。

呼び出しごとのトークン数

assistant.usage イベントは、モデル API 呼び出しごとに 1 回だけ生成されます (サブエージェントによる呼び出しを含む)。 トークン数と、その 1 回の呼び出しの課金乗数が含まれます。

次の例では、これらのフィールドを使用します。 キャッシュ、推論、待機時間、トレース フィールドなど、完全な一覧については AUTOTITLE を 参照してください。

フィールドタイプDescription
modelstringこの呼び出しのモデル識別子
inputTokensnumber使用された入力トークン
outputTokensnumber生成された出力トークン
costnumberこの呼び出しに適用される Premium 要求乗数

ヒント

assistant.usage はエフェメラルであるため、ライブ配信されますが、セッションを再開するときに再生されません。 その後の累積合計を読み取るために、 session.usage.getMetrics を呼び出します ( 「累積 AI クレジットとトークンの合計」を参照)。

コード言語 navigation

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
const session = await client.createSession({ streaming: true });

session.on("assistant.usage", (event) => {
    const { model, inputTokens, outputTokens, cost } = event.data;
    console.log(
        `${model}: in=${inputTokens ?? 0} out=${outputTokens ?? 0} cost=${cost ?? 0}`,
    );
});
session.on("assistant.usage", (event) => {
    const { model, inputTokens, outputTokens, cost } = event.data;
    console.log(
        `${model}: in=${inputTokens ?? 0} out=${outputTokens ?? 0} cost=${cost ?? 0}`,
    );
});

コンテキスト ウィンドウの使用率

トークン数は、各呼び出しで使用された内容を示します。 コンテキスト ウィンドウの使用率は、モデルのプロンプト ウィンドウが現在どの程度満たされているかを示します。これは、自動圧縮が開始される前に進行状況バーを表示したり、ユーザーに警告したりするのに役立ちます。

ライブアップデート session.usage_info

ランタイムは、コンテキスト ウィンドウのサイズが変更されるたびに、 session.usage_info イベントを生成します。 この例では、 currentTokenstokenLimitを使用しています。完全なペイロードについては ストリーミング セッション イベント を参照してください。

フィールドタイプDescription
currentTokensnumber現在コンテキスト ウィンドウ内のトークン
tokenLimitnumberモデルのコンテキスト ウィンドウの最大トークン数

コード言語 navigation

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
const session = await client.createSession({ streaming: true });

session.on("session.usage_info", (event) => {
    const { currentTokens, tokenLimit } = event.data;
    const pct = Math.round((currentTokens / tokenLimit) * 100);
    console.log(`Context: ${currentTokens}/${tokenLimit} (${pct}%)`);
});
session.on("session.usage_info", (event) => {
    const { currentTokens, tokenLimit } = event.data;
    const pct = Math.round((currentTokens / tokenLimit) * 100);
    console.log(`Context: ${currentTokens}/${tokenLimit} (${pct}%)`);
});

オンデマンドの内訳 session.metadata.contextInfo

イベントは、コンテキストが変更されたときにのみ発生します。 セッションの再開直後など、いつでも現在の内訳を読み取るために、 session.metadata.contextInfoを呼び出します。 ランタイムの既定値を使用するpromptTokenLimit0を渡します。値が不明な場合は、outputTokenLimit0を渡します。

結果の contextInfo は、セッションが初期化されるまで null されます (システム プロンプトとツールメタデータがキャッシュされています)。 合計は、promptTokenLimitと共にsystemTokensconversationTokenstoolDefinitionsTokensに分割されます。

コード言語 navigation

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
const session = await client.createSession({});

const { contextInfo } = await session.rpc.metadata.contextInfo({
    promptTokenLimit: 0,
    outputTokenLimit: 0,
});

if (contextInfo) {
    console.log(
        `Total ${contextInfo.totalTokens}/${contextInfo.promptTokenLimit} ` +
            `(system=${contextInfo.systemTokens}, conversation=${contextInfo.conversationTokens})`,
    );
}
const { contextInfo } = await session.rpc.metadata.contextInfo({
    promptTokenLimit: 0,
    outputTokenLimit: 0,
});

if (contextInfo) {
    console.log(
        `Total ${contextInfo.totalTokens}/${contextInfo.promptTokenLimit} ` +
            `(system=${contextInfo.systemTokens}, conversation=${contextInfo.conversationTokens})`,
    );
}

累積 AI クレジットとトークンの合計

session.usage.getMetrics は、1 回の呼び出しでセッション全体の実行合計を返します。 これは、すべての API 呼び出し (メイン エージェントとサブエージェント) を集計するため、AI クレジット コストを読み取る最もクリーンな方法です。

この例では、次のフィールドを使用します。 生成された UsageGetMetricsResult 型は完全な参照です。

フィールドタイプDescription
totalNanoAiunumberセッション全体の AI クレジット コスト (nano-AI ユニット単位)
totalPremiumRequestCostnumber乗数の後、すべてのモデルの Premium 要求コスト
modelMetricsRecord<string, ModelMetric>モデルごとの内訳。各エントリには、 usage.inputTokensusage.outputTokens、および totalNanoAiu

メモ

コストは nano-AI ユニット で報告されます (フィールドの名前は totalNanoAiu)。 AI クレジットへの正確な変換と Premium 要求アカウンティングの正確な意味は、SDK ではなくGitHub Copilot課金によって定義されます。GitHubのCopilot課金ドキュメントを真実のソースとして扱い、通貨のような値をユーザーに表示する前に検証します。 例では、SI nano プレフィックスに従って、1e9で除算します。これは、現在の課金と一致することを確認してから、それに依存します。 modelMetricsマップとtokenDetails マップは、SDK 型システムが検証しないランタイム文字列 (モデル ID とトークン型名) によってキー付けされます。

コード言語 navigation

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
const session = await client.createSession({});

const metrics = await session.rpc.usage.getMetrics();

const aiCredits = (metrics.totalNanoAiu ?? 0) / 1e9;
console.log(`AI credits used: ${aiCredits.toFixed(6)}`);
console.log(`Premium requests: ${metrics.totalPremiumRequestCost}`);

for (const [model, m] of Object.entries(metrics.modelMetrics)) {
    if (!m) continue;
    console.log(
        `${model}: in=${m.usage.inputTokens} out=${m.usage.outputTokens} ` +
            `nanoAiu=${m.totalNanoAiu ?? 0}`,
    );
}
const metrics = await session.rpc.usage.getMetrics();

const aiCredits = (metrics.totalNanoAiu ?? 0) / 1e9;
console.log(`AI credits used: ${aiCredits.toFixed(6)}`);
console.log(`Premium requests: ${metrics.totalPremiumRequestCost}`);

for (const [model, m] of Object.entries(metrics.modelMetrics)) {
    if (!m) continue;
    console.log(
        `${model}: in=${m.usage.inputTokens} out=${m.usage.outputTokens} ` +
            `nanoAiu=${m.totalNanoAiu ?? 0}`,
    );
}

モデルごとの AI クレジットの価格

ターンを実行する前にコストを見積もるために、各モデルのトークン価格を models.listから読み取ってください。 これはクライアントでのサーバー スコープの呼び出しであるため、セッションは必要ありません。 価格は、トークンの課金バッチごとに AI クレジットで表されます。 生成された ModelBillingTokenPrices 型には、 cachePriceを含むすべてのフィールドが一覧表示されます。

フィールドタイプDescription
billing.multipliernumber基本レートに対する Premium 要求コスト乗数
billing.tokenPrices.inputPricenumber入力トークンのバッチあたりの AI クレジット コスト
billing.tokenPrices.outputPricenumber出力トークンのバッチあたりの AI クレジット コスト
billing.tokenPrices.batchSizenumber課金バッチあたりのトークン数

メモ

価格の値は、プランとモデルの進化に伴って変化します。 次に示すように、実行時にそれらを読み取ります。アプリケーションに番号をハードコーディングしないでください。

コード言語 navigation

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();

const { models } = await client.rpc.models.list({});

for (const model of models) {
    const prices = model.billing?.tokenPrices;
    if (!prices) continue;
    console.log(
        `${model.id}: input=${prices.inputPrice} output=${prices.outputPrice} ` +
            `per ${prices.batchSize} tokens (x${model.billing?.multiplier ?? 1})`,
    );
}
const { models } = await client.rpc.models.list({});

for (const model of models) {
    const prices = model.billing?.tokenPrices;
    if (!prices) continue;
    console.log(
        `${model.id}: input=${prices.inputPrice} output=${prices.outputPrice} ` +
            `per ${prices.batchSize} tokens (x${model.billing?.multiplier ?? 1})`,
    );
}

アカウント クォータと Premium の相互作用

account.getQuotaは、認証されたユーザーの残りのCopilot資格を報告します。 結果の quotaSnapshots マップは、クォータの種類 (一般的に premium_interactionschatcompletions) によってキーが設定されます。 これを使用して、毎月の許容量がどれだけ残っているかをユーザーに示したり、制限に達する前に作業を制限したりします。

この例では、次のフィールドを使用します。生成された AccountQuotaSnapshot 型は完全な参照です。 quotaSnapshots キーは、SDK 型システムでは検証されないランタイム文字列であるため、参照を保護します。

フィールドタイプDescription
entitlementRequestsnumber権利に含まれる要求、または無制限の-1
usedRequestsnumberこの期間にこれまでに使用された要求
remainingPercentagenumber残りの権利の割合
resetDatestringクォータがリセットされた ISO 8601 日付

ヒント

接続のグローバル認証コンテキスト (マルチテナント バックエンドなど) ではなく、特定のユーザーのクォータを読み取るために、そのユーザーのGitHub トークンをgetQuotaに渡します。 「マルチテナントとサーバーの展開」を参照してください。

コード言語 navigation

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();

const { quotaSnapshots } = await client.rpc.account.getQuota({});
const premium = quotaSnapshots["premium_interactions"];

if (premium) {
    console.log(
        `Premium interactions: ${premium.usedRequests}/${premium.entitlementRequests} ` +
            `(${premium.remainingPercentage.toFixed(1)}% left, resets ${premium.resetDate ?? "n/a"})`,
    );
}
const { quotaSnapshots } = await client.rpc.account.getQuota({});
const premium = quotaSnapshots["premium_interactions"];

if (premium) {
    console.log(
        `Premium interactions: ${premium.usedRequests}/${premium.entitlementRequests} ` +
            `(${premium.remainingPercentage.toFixed(1)}% left, resets ${premium.resetDate ?? "n/a"})`,
    );
}

適切な API の選択

この概要を使用して、ユース ケースに適した API を決定します。

  • ターンの実行時にライブ コストまたはトークン メーターをレンダリングします。 assistant.usagesession.usage_infoをサブスクライブします。
  • ターンまたはセッション後の最終的なコストの概要を表示する: session.usage.getMetricsを呼び出します。
  • 新しいターンの前に、再開時にコンテキスト ウィンドウの使用状況を表示する: session.metadata.contextInfoを呼び出します。
  • 作業を実行する前にコストを見積もる: トークンの価格 models.list 読み取る。
  • プランを使い果たす前にユーザーに警告する: account.getQuotaを呼び出します。

詳細については、次を参照してください。