Skip to main content

Метрики использования и выставления счетов

В этом руководстве показано, как считывать счетчики маркеров, использование контекстного окна, стоимость кредита ИИ и квоту учетной записи из приложения пакета SDK для Copilot. Примеры показаны для TypeScript, Python, Go, .NET, Java и Rust.

Совет

Каждый пример функционально эквивалентен для разных языков. Фрагмент кода TypeScript по умолчанию развернут; Выберите язык из свертых блоков, чтобы увидеть ту же логику в этом пакете SDK.

Overview

Пакет SDK предоставляет данные об использовании с помощью двух дополнительных механизмов:

  • События сеанса: временные события, которые среда выполнения выдает в качестве выполнения поворота. Подпишитесь на эти данные в режиме реального времени для каждого вызова API.
  • Методы RPC: вызовы запроса и ответа, которые вы выполняете по запросу. Используйте их для моментального снимка накопленных итогов или поиска квоты на уровне учетной записи.

В приведенной ниже таблице сопоставляется каждый сигнал с API, предоставляющим его.

СигналAPIОбъемType
Количество маркеров для каждого вызовасобытие assistant.usageSessionEvent
Использование контекстного окнасобытие session.usage_infoSessionEvent
Разбивка контекстного окна (по запросу)session.metadata.contextInfoSessionRPC
Совокупные суммы кредитов и маркеров ИИsession.usage.getMetricsSessionRPC
Цены на кредиты на ИИ для моделиmodels.listСерверRPC
Квота учетной записи и взаимодействие с премиумомaccount.getQuotaСерверRPC

Примечание.

session.usage.getMetrics, session.metadata.contextInfoи session.metadata.recomputeContextTokens помечены экспериментальными в созданной поверхности RPC. В .NET они вызывают экспериментальную GHCP001 диагностику, которая подавляется с помощью #pragma warning disable GHCP001 или уровня <NoWarn>GHCP001</NoWarn>проекта. Закрепление пакета SDK и среды выполнения cli Copilot, если приложение зависит от них.

В приведенных ниже таблицах полей перечислены только поля, используемые в примерах на этой странице. Полный, всегда текущий справочник по полю — это созданные типы ПАКЕТА SDK, а также События потоковых сессий, который повторно создается из схемы CLI на каждом ударе зависимостей. Относиться к ним как к источнику истины и этой странице в качестве ориентированного на задачи руководства.

Количество маркеров для каждого вызова

Событие assistant.usage создается один раз для каждого вызова API модели в свою очередь (включая вызовы, сделанные вложенными агентами). Он содержит количество маркеров и умножение выставления счетов для этого одного вызова.

В приведенном ниже примере используются эти поля. Полный список см. в разделе События потоковых сессий , включая кэш, причины, задержку и поля трассировки.

ПолеTypeDescription
modelstringИдентификатор модели для этого вызова
inputTokensnumberРасходуемые входные токены
outputTokensnumberВыпускные токены
costnumberУмножение запросов уровня "Премиум", примененное к этому вызову

Совет

assistant.usage является эфемерным, поэтому он поставляется в реальном времени, но не воспроизводился при возобновлении сеанса. Чтобы прочитать накопленные итоговые итоги после факта, вызов session.usage.getMetrics (см. сведения о накопленных кредитах и токенах ИИ).

Языки кода 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 событие при изменении размера контекстного окна. Пример использования currentTokens и tokenLimit; см. в разделе События потоковых сессий для полной полезных данных.

ПолеTypeDescription
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. Передайте для promptTokenLimit использования среды выполнения по умолчанию; передайте 0``0 значениеoutputTokenLimit, если значение неизвестно.

contextInfo Результат не null будет инициализирован до инициализации сеанса (системный запрос и метаданные инструмента были кэшированы). Он разбивает итог вниз systemTokensна , conversationTokensи toolDefinitionsTokens, наряду с promptTokenLimit.

Языки кода 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})`,
    );
}

Совокупные суммы кредитов и маркеров ИИ

session.usage.getMetrics возвращает итоги выполнения для всего сеанса в одном вызове. Это самый чистый способ чтения стоимости кредита ИИ, так как он агрегирует каждый вызов API (основной агент и вложенные агенты) для вас.

В примере используются приведенные ниже поля. Созданный UsageGetMetricsResult тип является полной ссылкой.

ПолеTypeDescription
totalNanoAiunumberСтоимость кредита на уровне сеанса ИИ в единицах nano-AI
totalPremiumRequestCostnumberСтоимость запроса уровня "Премиум" во всех моделях после умножения
modelMetricsRecord<string, ModelMetric>Разбивка на модель; каждая запись имеет usage.inputTokens, usage.outputTokensи totalNanoAiu

Примечание.

Стоимость сообщается в единицах nano-AI (это поле называется totalNanoAiu). Точное преобразование в кредиты ИИ и точное значение учета запросов уровня "Премиум" определяются GitHub Copilot выставлением счетов, а не пакетом SDK, рассматривать Copilot документации по выставлению счетов GitHub как источник истины и проверить перед отображением валюты, например значений для пользователей. Примеры делятся на 1e9 удобство, следуя префиксу SI nano ; убедитесь, что это соответствует текущему выставлению счетов, прежде чем полагаться на него. tokenDetails Карты modelMetrics ключом являются строки среды выполнения (идентификаторы модели и имена типов маркеров), которые система типов SDK не проверяет.

Языки кода 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}`,
    );
}

Цены на кредиты на ИИ для модели

Чтобы оценить стоимость перед выполнением поворота, ознакомьтесь с ценами на маркеры каждой модели.models.list Это вызов на уровне сервера на клиенте, поэтому он не нуждается в сеансе. Цены выражаются в кредитах ИИ на пакет токенов выставления счетов. Созданный тип перечисляет каждое ModelBillingTokenPrices поле, в том числе cachePrice.

ПолеTypeDescription
billing.multipliernumberУмножение затрат на премиум по отношению к базовой ставке
billing.tokenPrices.inputPricenumberЗатраты на кредит ИИ на пакет входных маркеров
billing.tokenPrices.outputPricenumberЗатраты на кредит ИИ на пакет выходных маркеров
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})`,
    );
}

Квота учетной записи и взаимодействие с премиумом

account.getQuotaсообщает о оставшейся Copilot права пользователя, прошедшего проверку подлинности. Карта результата quotaSnapshots определяется типом квоты, как правило premium_interactions, chatи completions. Используйте его, чтобы показать пользователям, сколько их ежемесячных пособий осталось, или ворот работы, прежде чем они достигли предела.

В примере используются приведенные ниже поля; Созданный AccountQuotaSnapshot тип является полной ссылкой. Ключи quotaSnapshots — это строки среды выполнения, которые система типов ПАКЕТА SDK не проверяет, поэтому защита подстановок.

ПолеTypeDescription
entitlementRequestsnumberЗапросы, включенные в право, или -1 для неограниченных
usedRequestsnumberЗапросы, используемые до сих пор в этот период
remainingPercentagenumberПроцент оставшихся прав
resetDatestringДата ISO 8601 при сбросе квоты

Совет

Чтобы считывать квоту для конкретного пользователя, а не глобального контекста проверки подлинности подключения (например, в серверной части с несколькими клиентами), передайте этот пользователь GitHub маркерgetQuota. См . раздел AUTOTITLE.

Языки кода 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.usage и session.usage_info.
  • Отображение итоговой суммы затрат после поворота или сеанса: вызов session.usage.getMetrics.
  • Отображение использования контекстного окна при возобновлении перед любым новым поворотом: вызов session.metadata.contextInfo.
  • Оценка стоимости перед выполнением работы: чтение models.list цен токенов.
  • Предупреждайте пользователей, прежде чем они исчерпают свой план: вызов account.getQuota.

Дополнительные материалы