Skip to main content

Métricas de uso e cobrança

Este guia mostra como ler a contagem de tokens, a utilização da janela de contexto, o custo em créditos de IA e a cota da conta em um aplicativo que usa o SDK do Copilot. Exemplos são mostrados para TypeScript, Python, Go, .NET, Java e Rust.

Dica

Cada exemplo é funcionalmente equivalente entre idiomas. O trecho de código em TypeScript é expandido por padrão; selecione seu idioma nos blocos expansíveis 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 ambiente de execução emite durante a execução de um turno. Assine estes para obter dados em tempo real por chamada de API.
  • Métodos RPC: chamadas de solicitação/resposta feitas sob demanda. Use-os para registrar os totais acumulados ou consultar a cota da conta.

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

SinalAPIScopeTipo
Contagem de tokens 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 créditos de IA e tokenssession.usage.getMetricsSessionRPC
Preços de crédito de IA por modelomodels.listServidorRPC
Quota da 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, é gerado o diagnóstico experimental GHCP001, que você suprime com #pragma warning disable GHCP001 ou com uma <NoWarn>GHCP001</NoWarn> no nível do 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 completa e sempre atualizada dos campos consiste nos tipos gerados do SDK e em Eventos de sessão de streaming, que é regenerado a partir do esquema da CLI a cada atualização de dependência. Trate-os como a fonte da verdade e esta página como um guia orientado para tarefas.

Contagem de tokens por chamada

O evento assistant.usage é emitido uma vez para cada chamada à API do modelo em uma rodada (incluindo chamadas feitas por sub-agentes). Ele inclui a contagem de tokens e o multiplicador de cobrança para essa chamada específica.

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 é transmitido ao vivo, mas não é reproduzido ao retomar uma sessão. Para ler os totais acumulados posteriormente, chame session.usage.getMetrics (consulte Totais acumulados de créditos de IA e tokens).

Idiomas de código navigation

TypeScript
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 indica o nível de ocupação da janela de contexto do modelo no momento — útil para exibir uma barra de progresso ou avisar o usuário antes que a compactação automática seja acionada.

Atualizações em tempo real 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
session.on("session.usage_info", (event) => {
    const { currentTokens, tokenLimit } = event.data;
    const pct = Math.round((currentTokens / tokenLimit) * 100);
    console.log(`Context: ${currentTokens}/${tokenLimit} (${pct}%)`);
});

Detalhamento sob demanda com session.metadata.contextInfo

Os eventos só são acionados quando o contexto é alterado. Para ler o detalhamento atual a qualquer momento, por exemplo, logo após retomar uma sessão, use session.metadata.contextInfo. Passe 0 em promptTokenLimit para usar o padrão do tempo de execução; passe 0 em 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
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 créditos de IA e tokens

session.usage.getMetrics retorna os totais acumulados de 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 entre todos os modelos, após a aplicação dos 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 contabilização de solicitações premium são definidos pela cobrança do GitHub Copilot, não pelo SDK — trate a documentação de cobrança do GitHub Copilot como fonte de referência e verifique isso antes de exibir valores monetários aos usuários. Os exemplos usam a divisão por 1e9 por conveniência, seguindo o prefixo nano do SI; confirme se isso corresponde à cobrança atual antes de confiar nisso. Os mapas modelMetrics e tokenDetails são indexados por strings de tempo de execução (IDs de modelo e nomes de tipos de token) que o sistema de tipos do SDK não valida.

Idiomas de código navigation

TypeScript
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 interação, leia os preços por token de cada modelo em models.list. Esta é uma chamada com escopo de servidor feita pelo cliente, portanto não requer 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éditos 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 tempo de execução, conforme mostrado abaixo; nunca codifique os números diretamente no seu aplicativo.

Idiomas de código navigation

TypeScript
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})`,
    );
}

Quota da conta e interações premium

account.getQuota informa a cota restante do Copilot 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 resta da cota mensal deles ou para bloquear o trabalho antes que 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 na franquia ou -1 para ilimitado
usedRequestsnumberSolicitações usadas até agora neste período
remainingPercentagenumberPorcentagem do direito restante
resetDatestringData em formato 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
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:

  • Exiba um medidor em tempo real de custo ou tokens à medida que uma interação é executada: assine assistant.usage e session.usage_info.
  • Mostrar um resumo final de custo após uma interação ou sessão: chame session.usage.getMetrics.
  • Exiba o uso da janela de contexto ao retomar, antes de qualquer nova interação: chame 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