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

python-resilience

Faz seu agente lidar melhor com falhas temporárias. Ele tenta novamente ações que falharam, tornando o programa mais confiável.

O que ela faz

Esta ferramenta ajuda a criar programas de computador mais confiáveis. Ela faz com que o programa tente novamente automaticamente se algo der errado temporariamente, como uma falha de rede, e espera um pouco antes de tentar de novo.

Quando usar

  • ✓Quando uma parte do seu programa precisa se conectar a outro serviço e pode falhar.
  • ✓Se você quer que seu programa continue funcionando mesmo com pequenos problemas temporários.
  • ✓Para evitar sobrecarregar um serviço que está com problemas, tentando de novo aos poucos.

Exemplo do que pedir para a IA

“Faça meu programa tentar novamente até 3 vezes se a conexão com o site falhar, esperando um pouco mais a cada tentativa.”

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/wshobson/agents/blob/main/plugins/python-development/skills/python-resilience/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/wshobson/agents/blob/main/plugins/python-development/skills/python-resilience/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Por dentro, o código usa uma técnica chamada 'retry' (tentar de novo). Se uma operação falha, ele espera um tempo que aumenta a cada tentativa (exponential backoff) antes de tentar novamente, evitando que o programa trave.

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 wshobson/agents --skill python-resilience

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/wshobson/agents/main/plugins/python-development/skills/python-resilience/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.

Padrões de Resiliência em Python

Crie aplicações Python tolerantes a falhas que lidam graciosamente com falhas transitórias, problemas de rede e interrupções de serviço. Padrões de resiliência mantêm os sistemas funcionando quando as dependências são não confiáveis.

Quando Usar Esta Habilidade

  • Adicionar lógica de retentativa a chamadas de serviço externas
  • Implementar timeouts para operações de rede
  • Construir microsserviços tolerantes a falhas
  • Lidar com limitação de taxa e backpressure
  • Criar decoradores de infraestrutura
  • Projetar circuit breakers

Conceitos Principais

1. Falhas Transitórias vs. Permanentes

Retente erros transitórios (timeouts de rede, problemas temporários de serviço). Não retente erros permanentes (credenciais inválidas, requisições ruins).

2. Backoff Exponencial

Aumente o tempo de espera entre as retentativas para evitar sobrecarregar serviços em recuperação.

3. Jitter

Adicione aleatoriedade ao backoff para evitar o "thundering herd" (manada trovejante) quando muitos clientes tentam novamente simultaneamente.

4. Retentativas Limitadas

Limite tanto o número de tentativas quanto a duração total para evitar loops infinitos de retentativa.

Início Rápido

from tenacity import retry, stop_after_attempt, wait_exponential_jitter

@retry(
    stop=stop_after_attempt(3),
    wait=wait_exponential_jitter(initial=1, max=10),
)
def call_external_service(request: dict) -> dict:
    return httpx.post("https://api.example.com", json=request).json()

Padrões Fundamentais

Padrão 1: Retentativa Básica com Tenacity

Use a biblioteca tenacity para lógica de retentativa de nível de produção. Para casos mais simples, considere a funcionalidade de retentativa integrada ou uma implementação customizada leve.

from tenacity import (
    retry,
    stop_after_attempt,
    stop_after_delay,
    wait_exponential_jitter,
    retry_if_exception_type,
)

TRANSIENT_ERRORS = (ConnectionError, TimeoutError, OSError)

@retry(
    retry=retry_if_exception_type(TRANSIENT_ERRORS),
    stop=stop_after_attempt(5) | stop_after_delay(60),
    wait=wait_exponential_jitter(initial=1, max=30),
)
def fetch_data(url: str) -> dict:
    """Fetch data with automatic retry on transient failures."""
    response = httpx.get(url, timeout=30)
    response.raise_for_status()
    return response.json()

Padrão 2: Retentar Apenas Erros Apropriados

Liste especificamente exceções transitórias. Nunca retente:

  • ValueError, TypeError - Estes são bugs, não problemas transitórios
  • AuthenticationError - Credenciais inválidas não se tornarão válidas
  • Erros HTTP 4xx (exceto 429) - Erros do cliente são permanentes
from tenacity import retry, retry_if_exception_type
import httpx

# Define what's retryable
RETRYABLE_EXCEPTIONS = (
    ConnectionError,
    TimeoutError,
    httpx.ConnectTimeout,
    httpx.ReadTimeout,
)

@retry(
    retry=retry_if_exception_type(RETRYABLE_EXCEPTIONS),
    stop=stop_after_attempt(3),
    wait=wait_exponential_jitter(initial=1, max=10),
)
def resilient_api_call(endpoint: str) -> dict:
    """Make API call with retry on network issues."""
    return httpx.get(endpoint, timeout=10).json()

Padrão 3: Retentativas de Código de Status HTTP

Retente códigos de status HTTP específicos que indicam problemas transitórios.

from tenacity import retry, retry_if_result, stop_after_attempt
import httpx

RETRY_STATUS_CODES = {429, 502, 503, 504}

def should_retry_response(response: httpx.Response) -> bool:
    """Check if response indicates a retryable error."""
    return response.status_code in RETRY_STATUS_CODES

@retry(
    retry=retry_if_result(should_retry_response),
    stop=stop_after_attempt(3),
    wait=wait_exponential_jitter(initial=1, max=10),
)
def http_request(method: str, url: str, **kwargs) -> httpx.Response:
    """Make HTTP request with retry on transient status codes."""
    return httpx.request(method, url, timeout=30, **kwargs)

Padrão 4: Retentativa Combinada de Exceção e Status

Lide com exceções de rede e códigos de status HTTP.

from tenacity import (
    retry,
    retry_if_exception_type,
    retry_if_result,
    stop_after_attempt,
    wait_exponential_jitter,
    before_sleep_log,
)
import logging
import httpx

logger = logging.getLogger(__name__)

TRANSIENT_EXCEPTIONS = (
    ConnectionError,
    TimeoutError,
    httpx.ConnectError,
    httpx.ReadTimeout,
)
RETRY_STATUS_CODES = {429, 500, 502, 503, 504}

def is_retryable_response(response: httpx.Response) -> bool:
    return response.status_code in RETRY_STATUS_CODES

@retry(
    retry=(
        retry_if_exception_type(TRANSIENT_EXCEPTIONS) |
        retry_if_result(is_retryable_response)
    ),

…
Perguntas frequentes

O que são falhas temporárias?

São problemas que se resolvem sozinhos, como uma rede que ficou lenta por um momento ou um serviço que estava fora do ar mas já voltou.

Por que esperar mais a cada tentativa?

Para dar tempo para o serviço que falhou se recuperar. Se você tentar muitas vezes seguidas, pode piorar o problema.

O que é 'jitter'?

É adicionar um pequeno tempo aleatório às esperas. Isso evita que muitos programas tentem de novo exatamente ao mesmo tempo, o que poderia sobrecarregar o serviço.

Detalhes

Descrição original do autor

Python resilience patterns including automatic retries, exponential backoff, timeouts, and fault-tolerant decorators. Use when adding retry logic, implementing timeouts, building fault-tolerant services, or handling transient failures.

repo: wshobson/agents

Popularidade

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

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas