Skip to main content

Métricas de uso e cobrança

Este guia mostra como ler contagens de tokens, utilização de janela de contexto, custo de crédito de IA e cota de conta de um aplicativo SDK Copilot. Exemplos são mostrados para TypeScript, Python, Go, .NET, Java e Rust.

Dica

Cada exemplo é funcionalmente equivalente entre idiomas. O snippet TypeScript é expandido por padrão; selecione seu idioma nos blocos recolhidos para ver a mesma lógica nesse SDK.

Visão Geral

O SDK apresenta dados de uso por meio de dois mecanismos complementares:

  • Eventos de sessão: eventos efêmeros que o runtime emite como uma execução de turno. Assine-os para obter dados de chamada por API em tempo real.
  • Métodos RPC: chamadas de solicitação/resposta feitas sob demanda. Use-os para instantâneo de totais acumulados ou pesquisar a cota no nível da conta.

A tabela abaixo mapeia cada sinal para a API que o expõe.

SinalAPIScopeTipo
Contagens de token por chamada
evento assistant.usageSessionEvent
Utilização da janela de contexto
evento session.usage_infoSessionEvent
Detalhamento da janela de contexto (sob demanda)session.metadata.contextInfoSessionRPC
Totais acumulados de token e crédito de IAsession.usage.getMetricsSessionRPC
Preços de crédito de IA por modelomodels.listServidorRPC
Cota de conta e interações premiumaccount.getQuotaServidorRPC

Observação

session.usage.getMetrics, session.metadata.contextInfoe session.metadata.recomputeContextTokens são marcados como experimentais na superfície RPC gerada. Em .NET eles geram o diagnóstico experimental, com o GHCP001 qual você suprime #pragma warning disable GHCP001 ou um nível <NoWarn>GHCP001</NoWarn>de projeto. Fixe o SDK e o runtime da CLI Copilot se o aplicativo depender deles.

As tabelas de campo abaixo listam apenas os campos usados nos exemplos nesta página. A referência de campo completa e sempre atual é os tipos de SDK gerados mais Eventos de sessão de streaming, que é regenerado do esquema da CLI em cada colisão de dependência. Trate-os como a fonte da verdade e esta página como um guia orientado para tarefas.

Contagens de token por chamada

O assistant.usage evento é emitido uma vez para cada chamada de API de modelo por vez (incluindo chamadas feitas por sub-agentes). Ele carrega as contagens de token e o multiplicador de cobrança para essa única chamada.

O exemplo a seguir usa esses campos. Consulte Eventos de sessão de streaming para obter a lista completa, incluindo cache, raciocínio, latência e campos de rastreamento.

CampoTipoDescription
modelstringIdentificador de modelo para esta chamada
inputTokensnumberTokens de entrada consumidos
outputTokensnumberTokens de saída produzidos
costnumberMultiplicador de solicitação Premium aplicado a essa chamada

Dica

assistant.usage é efêmero, portanto, ele é entregue ao vivo, mas não reproduzido quando você retoma uma sessão. Para ler totais acumulados após o fato, chame (consulte session.usage.getMetrics os totais de token e crédito de IA acumulados).

Idiomas de código 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}`,
    );
});

Utilização da janela de contexto

As contagens de tokens informam o que cada chamada consumiu. A utilização da janela de contexto informa o quão completa a janela de prompt do modelo está agora — útil para mostrar uma barra de progresso ou avisar o usuário antes que a compactação automática comece.

Atualizações ao vivo com session.usage_info

O runtime emite um session.usage_info evento sempre que o tamanho da janela de contexto é alterado. O exemplo usa currentTokens e tokenLimit; consulte Eventos de sessão de streaming para a carga completa.

CampoTipoDescription
currentTokensnumberTokens atualmente na janela de contexto
tokenLimitnumberTokens máximos para a janela de contexto do modelo

Idiomas de código 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}%)`);
});

Divisão sob demanda com session.metadata.contextInfo

Os eventos só são acionados quando o contexto é alterado. Para ler a divisão atual a qualquer momento , por exemplo, logo após retomar uma sessão , chame session.metadata.contextInfo. Passe 0 para promptTokenLimit usar o padrão de runtime; passe 0 para outputTokenLimit se o valor for desconhecido.

O resultado contextInfo é null até que a sessão tenha sido inicializada (o prompt do sistema e os metadados de ferramenta foram armazenados em cache). Ele divide o total em systemTokens, conversationTokense toolDefinitionsTokens, ao lado do promptTokenLimit.

Idiomas de código 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})`,
    );
}

Totais acumulados de token e crédito de IA

session.usage.getMetrics retorna os totais em execução para toda a sessão em uma única chamada. Essa é a maneira mais limpa de ler o custo de crédito de IA, pois agrega todas as chamadas à API (agente principal e subagentes) para você.

O exemplo usa os campos abaixo. O tipo gerado UsageGetMetricsResult é a referência completa.

CampoTipoDescription
totalNanoAiunumberCusto de crédito de IA em toda a sessão, em unidades de IA nano
totalPremiumRequestCostnumberCusto da solicitação Premium em todos os modelos, após multiplicadores
modelMetricsRecord<string, ModelMetric>Detalhamento por modelo; cada entrada tem usage.inputTokens, usage.outputTokense totalNanoAiu

Observação

O custo é relatado em unidades nano-IA (o campo é nomeado totalNanoAiu). A conversão exata em créditos de IA e o significado preciso da contabilidade de solicitação premium são definidos por GitHub Copilot cobrança, não pelo SDK — trate a documentação de cobrança Copilot do GitHub como a fonte da verdade e verifique antes de exibir valores semelhantes a moeda aos usuários. Os exemplos são divididos por 1e9 conveniência, seguindo o prefixo SI nano ; confirme se isso corresponde à cobrança atual antes de depender dele. Os modelMetrics mapas e tokenDetails os mapas são chaveados por cadeias de caracteres de runtime (IDs de modelo e nomes de tipo de token) que o sistema de tipo SDK não valida.

Idiomas de código 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}`,
    );
}

Preços de crédito de IA por modelo

Para estimar o custo antes de executar uma curva, leia os preços de token de cada modelo de models.list. Essa é uma chamada no escopo do servidor no cliente, portanto, ela não precisa de uma sessão. Os preços são expressos em créditos de IA por lote de cobrança de tokens. O tipo gerado ModelBillingTokenPrices lista todos os campos, incluindo cachePrice.

CampoTipoDescription
billing.multipliernumberMultiplicador de custo de solicitação Premium em relação à taxa base
billing.tokenPrices.inputPricenumberCusto de crédito de IA por lote de tokens de entrada
billing.tokenPrices.outputPricenumberCusto de crédito de IA por lote de tokens de saída
billing.tokenPrices.batchSizenumberNúmero de tokens por lote de cobrança

Observação

Os valores de preço mudam à medida que os planos e os modelos evoluem. Leia-os em runtime, conforme mostrado abaixo; nunca embutir os números em seu aplicativo.

Idiomas de código 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})`,
    );
}

Cota de conta e interações premium

account.getQuotarelata o direito de Copilot restante do usuário autenticado. O mapa do quotaSnapshots resultado é chaveado por tipo de cota— geralmente premium_interactions, chate completions. Use-o para mostrar aos usuários quanto de seu subsídio mensal é deixado ou para o trabalho de portão antes que eles atinjam um limite.

O exemplo usa os campos abaixo; o tipo gerado AccountQuotaSnapshot é a referência completa. As quotaSnapshots chaves são cadeias de caracteres de runtime que o sistema de tipo SDK não valida, portanto, proteja suas pesquisas.

CampoTipoDescription
entitlementRequestsnumberSolicitações incluídas no direito ou -1 para ilimitados
usedRequestsnumberSolicitações usadas até agora neste período
remainingPercentagenumberPorcentagem do direito restante
resetDatestringData do ISO 8601 em que a cota é redefinida

Dica

Para ler a cota de um usuário específico em vez do contexto de autenticação global da conexão (por exemplo, em um back-end multilocatário), passe o token GitHub desse usuário para getQuota. Consulte Multilocação e implantações de servidores.

Idiomas de código 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"})`,
    );
}

Escolhendo a API certa

Use este resumo para decidir qual API se encaixa em seu caso de uso:

  • Renderizar um medidor de token ou custo ativo como uma curva é executado: assine assistant.usage e session.usage_info.
  • Mostrar um resumo de custo final após uma curva ou sessão: chamada session.usage.getMetrics.
  • Exibir o uso da janela de contexto no currículo, antes de qualquer nova curva: chamar session.metadata.contextInfo.
  • Estimar o custo antes de executar o trabalho: leia os models.list preços do token.
  • Avisar os usuários antes que eles esgotem seu plano: chamar account.getQuota.

Leitura adicional