Skip to content

TokenMeter

Quanto da janela de contexto uma conversa está usando.

Use quando estiver construindo uma interface de chat contra um modelo com limite de contexto. Um cliente que não mostra isso funciona bem no começo e depois falha: cada turno reenvia todo o histórico, a requisição só cresce e em algum momento o provedor a rejeita por exceder o limite. Este componente mostra esse crescimento antes da rejeição.

Início rápido

Uso básico

html
<r-token-meter limit="65536" used="12800"></r-token-meter>
js
const meter = document.createElement('r-token-meter');
meter.limit = 65536;
meter.used = 41200; // o contexto que a próxima requisição vai carregar
meter.spent = 128431; // tokens cobrados ao longo da conversa, opcional
composer.append(meter);

A barra se enche até used / limit e escala por três níveis: ok, warn (a partir de 80% do limite) e over. level é refletido no host, então a página pode reagir à mesma escalada que a barra mostra:

css
r-token-meter[level='warn'] ~ .composer-hint {
  display: block;
}

used e spent são números diferentes

  • used: o que a próxima requisição vai carregar — o histórico, não a conversa inteira. É o número a que o limite se aplica e o que a barra desenha.
  • spent: o que já foi cobrado ao longo da conversa. Ele só cresce e não é limitado pela janela.

Truncar uma transcrição reduz used e deixa spent intacto. Mostrar apenas um deles responde só a uma das duas perguntas que o usuário tem ("a próxima mensagem vai caber?" e "quanto isso já me custou?").

Sem limite

Com limit indefinido ou zero a barra some e restam apenas as contagens, útil enquanto o tamanho da janela é desconhecido.

Trocar o rótulo

html
<r-token-meter label="Contexto" limit="65536" used="41200"></r-token-meter>
<!-- label="" deixa apenas as contagens -->

Referência da API

Propriedades

PropriedadeAtributoTipoPadrãoDescrição
limitlimitnumber0Tamanho da janela de contexto em tokens. Zero ou ausente esconde a barra.
usedusednumber0Tokens que a próxima requisição vai carregar.
spentspentnumber0Tokens cobrados na conversa até agora.
labellabelstring'Context'Prefixo do texto; '' deixa apenas as contagens.
levellevel'ok' | 'warn' | 'over'derivadoQuão cheia está a janela. Definido pelo elemento: escrevê-lo é sobrescrito.
sheetsheetstring''CSS injetado no shadow root.

As contagens são formatadas para leitura rápida: exatas abaixo de mil (847 é curto o bastante para ser lido exato) e abreviadas acima (41.2k, 128k); o terceiro dígito de 128.431 não muda o que o leitor faz com ele.

Partes

ParteElemento
meterO elemento inteiro
trackO fundo da barra
fillA porção preenchida
textO rótulo e as contagens

Acessibilidade

O elemento sempre carrega um title declarando os números, então a cor nunca é a única portadora do aviso: a barra ficar âmbar é um segundo sinal, não o único. Mantenha assim se você reestilizar os níveis.

Estilos

O <r-token-meter> expõe 9 propriedades personalizadas de CSS próprias, além dos tokens semânticos que lê do tema. Defina uma em qualquer lugar de onde ela seja herdada: :root, um contêiner ou o próprio elemento:

css
r-token-meter {
  --ran-token-meter-fill-background: var(--ran-color-bg-subtle);
}

Partes: fill · meter · text · track

A lista completa está em tokens de estilo; qual token escolher é assunto do design system.

Boas práticas

  • Atualize used no mesmo lugar em que você monta a requisição, não numa passada de renderização: o número em que as pessoas confiam é o que a próxima requisição vai de fato enviar.
  • Escale em volta do medidor, não dentro dele. Em level="over" a interface útil é uma sugestão (resumir, começar uma nova conversa), e isso pertence ao aplicativo.
  • Não anime o preenchimento numa troca de tema: veja as diretrizes de design.

Publicado sob a licença MIT.