Pular para o conteúdo
Skillpedia
APIs e servidores (backend)48 mil · #2163

api-rate-limit-handler

Ajuda seu agente a controlar o uso de APIs. Ele gerencia limites de requisições e lida com erros para evitar sobrecarga.

O que ela faz

Esta ferramenta ajuda seu programa a lidar com limites de velocidade de APIs externas. Se uma API recusar sua solicitação por estar sobrecarregada ou por outros motivos, ela tentará novamente após um tempo, de forma inteligente.

Quando usar

  • ✓Ao chamar APIs que têm limites de quantas vezes você pode pedir dados.
  • ✓Quando você recebe erros como '429 Too Many Requests' ou erros temporários do servidor.
  • ✓Ao construir um programa que precisa ser confiável ao usar serviços de terceiros.

Exemplo do que pedir para a IA

“Como posso fazer meu programa tentar novamente se a API estiver lenta?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/api-rate-limit-handler/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/api-rate-limit-handler/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Primeiro, ela verifica o tipo de erro para saber se deve tentar de novo. Se sim, ela espera um tempo (que pode ser definido pela própria API ou calculado automaticamente) antes de tentar novamente, evitando sobrecarregar a API.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add sickn33/agentic-awesome-skills --skill api-rate-limit-handler

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/api-rate-limit-handler/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Manipulador de Limite de Taxa da API

Visão Geral

Uma habilidade para implementar limite de taxa de nível de produção, backoff exponencial e estratégias de retentativa ao integrar com APIs externas. Evita falhas em cascata, respeita cotas upstream e mantém sua aplicação resiliente sob carga.

Quando Usar Esta Habilidade

  • Use ao chamar APIs externas que impõem limites de taxa (OpenAI, Stripe, GitHub, etc.)
  • Use quando você receber erros 429 Too Many Requests ou 5xx e precisar de recuperação graciosa
  • Use ao construir um cliente que deve respeitar os cabeçalhos Retry-After
  • Use ao projetar um sistema que se expande para vários provedores de API
  • Use quando o usuário disser "lidar com limites de taxa", "adicionar lógica de retentativa", "estratégia de backoff" ou "não ser estrangulado"

Como Funciona

Passo 1: Classificar a resposta

Determine se uma solicitação falha é retentável ou terminal.

Status Classificação Ação
200-299 Sucesso Retornar resposta
400, 401, 403, 404 Erro terminal do cliente Não retentar — corrigir a solicitação
408, 429 Retentável (limite de taxa / tempo limite) Retentar com backoff
500, 502, 503, 504 Retentável (erro do servidor) Retentar com backoff

Passo 2: Analisar cabeçalhos de limite de taxa

Sempre verifique as dicas upstream antes de calcular seu próprio atraso.

function getRetryDelay(
  response: Response,
  attempt: number,
  maxDelayMs = 60_000
): number {
  // Prefer upstream hints
  const retryAfter = response.headers.get("Retry-After");
  if (retryAfter) {
    const seconds = Number(retryAfter);
    if (Number.isFinite(seconds) && seconds >= 0) {
      return seconds * 1000;
    }
    // HTTP-date format
    const date = new Date(retryAfter).getTime();
    if (Number.isFinite(date)) {
      return Math.max(0, date - Date.now());
    }
  }

  // GitHub documents x-ratelimit-reset as Unix epoch seconds.
  const resetHeader = response.headers.get("x-ratelimit-reset");
  const githubReset = resetHeader === null || resetHeader.trim() === "" ? NaN : Number(resetHeader);
  if (Number.isFinite(githubReset)) {
    return Math.max(0, githubReset * 1000 - Date.now());
  }

  // Fallback: capped exponential backoff with full jitter.
  const cap = Math.min(1000 * 2 ** attempt, maxDelayMs);
  return Math.floor(Math.random() * cap);
}

As dicas upstream são esperas mínimas; nunca as trunque para retentar mais cedo. Se uma dica exceder o orçamento de operação restante, pare sem agendar outra solicitação. O limite se aplica apenas ao backoff de fallback.

Cabeçalhos de reinicialização específicos do provedor não compartilham uma unidade ou formato. Por exemplo, algumas APIs retornam durações enquanto o GitHub retorna segundos de época. Analise um cabeçalho adicional apenas após verificar a documentação atual desse provedor.

Passo 3: Implementar o loop de retentativa

async function fetchWithRetry(
  url: string,
  options: RequestInit,
  maxRetries = 3,
  maxElapsedMs = 120_000,
  retryNonIdempotent = false
): Promise<Response> {
  const startedAt = Date.now();
  const method = (options.method ?? "GET").toUpperCase();
  const replaySafe = ["GET", "HEAD", "OPTIONS", "PUT", "DELETE"].includes(method)
    || retryNonIdempotent;

  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const response = await fetch(url, options);

    if (response.ok) return response;

    // Terminal errors — do not retry
    if (![408, 429, 500, 502, 503, 504].includes(response.status)) {
      throw new Error(`Terminal error ${response.status}: ${response.statusText}`);
    }

    if (!replaySafe) {
      throw new Error(
        `${method} was not retried because replay safety was not explicitly established`
      );
    }

    // Retryable — but exhausted attempts
    if (attempt === maxRetries) {
      throw new Error(`Failed after ${maxRetries} retries: ${response.status}`);
    }

    const remaining = maxElapsedMs - (Date.now() - startedAt);
    const delay = getRetryDelay(response, attempt);
    if (remaining <= 0 || delay > remaining) {
      throw new Error(`Retry cannot be scheduled within ${maxElapsedMs}ms`);
    }

    // Release the connection before waiting when the body is not needed.
    await response.body?.cancel();
    console.warn(
      `Request failed (${response.status}), retrying in ${Math.round(delay)}ms (attempt ${attempt + 1}/${maxRetries})`
    );
    await new Promise(resolve => setTimeout(resolve, delay));
  }

  throw new Error("Unreachable");
}

Passo 4: Adicionar um limitador de taxa no lado do cliente (proativo)

…

Perguntas frequentes

O que são 'limites de velocidade' (rate limits)?

São regras impostas por serviços online para limitar o número de requisições que um usuário ou programa pode fazer em um certo período. Isso evita que um único usuário sobrecarregue o serviço.

O que significa 'tentar novamente com backoff'?

Significa que, se uma tentativa falhar, o programa espera um tempo antes de tentar de novo. Esse tempo aumenta a cada falha (backoff), dando tempo para o serviço se recuperar.

O que são erros '429' e '5xx'?

O erro '429' significa que você excedeu o limite de requisições. Os erros '5xx' (como 500, 503) indicam que o problema está no servidor da API, não no seu pedido, e geralmente são temporários.

Detalhes

Descrição original do autor

Implement bounded, idempotency-aware API throttling, backoff, and retry handling for 429 and transient 5xx responses.

repo: sickn33/agentic-awesome-skills

Popularidade

Estrelas no GitHub
48 mil
Posição no ranking
#2163
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas