python-resilience — скилл Claude Code: установка
Скилл подсказывает, как добавить в Python повторные попытки, таймауты и защиту от временных сбоев. Пригодится для сетевых вызовов и сервисов.
/plugin marketplace add wshobson/agents
/plugin install python-development@claude-code-workflowsЧто делает python-resilience
python-resilience помогает проектировать обработку временных ошибок в Python: повторяет запросы с экспоненциальной задержкой и jitter, ограничивает число попыток и общее время ожидания, задаёт таймауты для сетевых операций. Отдельно разбирается, какие ошибки и HTTP-коды стоит повторять, а какие указывают на постоянную проблему.
В примерах используются декораторы библиотеки tenacity и HTTP-вызовы через httpx. Есть варианты для исключений, кодов 429, 500, 502, 503, 504, а также логирование повторов и разделение инфраструктурной логики с кодом приложения. Расширенные примеры вынесены в references/details.md.
Ставьте скилл, если в Python-коде есть внешние сервисы или сетевые операции. Для простого локального кода с предсказуемыми ошибками он избыточен.
Какие задачи решает
- добавить повторы для сетевых запросов
- ограничить ожидание ответа таймаутом
- отделить временные ошибки от постоянных
- обработать HTTP-коды 429 и 5xx
- защитить сервис от бесконечных повторов
Примеры запросов агенту
- Добавь повторные попытки для вызова в `fetch_data` только при временных сетевых ошибках.
- Настрой для `httpx` экспоненциальную задержку, jitter и таймаут.
- Проверь, какие исключения и HTTP-коды можно повторять в этом API-вызове.
Как установить python-resilience
1Через маркетплейс плагинов
/plugin marketplace add wshobson/agents/plugin install python-development@claude-code-workflows2Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill python-resilience -a claude-code3Вручную: положить файлы
~/.claude/skills/python-resilience/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/python-resilience/
1Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill python-resilience -a codex2Вручную: положить файлы
.agents/skills/python-resilience/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill python-resilience -a cursor2Вручную: положить файлы
.cursor/skills/python-resilience/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install wshobson/agents python-resilience2Вручную: положить файлы
.github/skills/python-resilience/SKILL.mdКомандой платформы
gemini skills install https://github.com/wshobson/agents --path plugins/python-development/skills/python-resilienceВручную: положить файлы
.devin/skills/python-resilience/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Claude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Из того же набора213
Весь набор →Похожие
Вопросы о python-resilience
Как установить python-resilience в Claude Code?
Выполните npx skills add wshobson/agents --skill python-resilience -a claude-code. Файл скилла появится по пути ~/.claude/skills/python-resilience/SKILL.md.
Что делает python-resilience?
Скилл помогает добавить в Python повторные попытки, экспоненциальную задержку, jitter, таймауты и ограничение общего числа попыток. Он также объясняет обработку временных исключений и HTTP-кодов.
Какие библиотеки используются в примерах python-resilience?
В примерах применяются tenacity для логики повторов и httpx для HTTP-запросов.
Исходный текст
SKILL.md · MIT
---
name: python-resilience
description: 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.
---
# Python Resilience Patterns
Build fault-tolerant Python applications that gracefully handle transient failures, network issues, and service outages. Resilience patterns keep systems running when dependencies are unreliable.
## When to Use This Skill
- Adding retry logic to external service calls
- Implementing timeouts for network operations
- Building fault-tolerant microservices
- Handling rate limiting and backpressure
- Creating infrastructure decorators
- Designing circuit breakers
## Core Concepts
### 1. Transient vs Permanent Failures
Retry transient errors (network timeouts, temporary service issues). Don't retry permanent errors (invalid credentials, bad requests).
### 2. Exponential Backoff
Increase wait time between retries to avoid overwhelming recovering services.
### 3. Jitter
Add randomness to backoff to prevent thundering herd when many clients retry simultaneously.
### 4. Bounded Retries
Cap both attempt count and total duration to prevent infinite retry loops.
## Quick Start
```python
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()
```
## Fundamental Patterns
### Pattern 1: Basic Retry with Tenacity
Use the `tenacity` library for production-grade retry logic. For simpler cases, consider built-in retry functionality or a lightweight custom implementation.
```python
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()
```
### Pattern 2: Retry Only Appropriate Errors
Whitelist specific transient exceptions. Never retry:
- `ValueError`, `TypeError` - These are bugs, not transient issues
- `AuthenticationError` - Invalid credentials won't become valid
- HTTP 4xx errors (except 429) - Client errors are permanent
```python
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()
```
### Pattern 3: HTTP Status Code Retries
Retry specific HTTP status codes that indicate transient issues.
```python
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)
```
### Pattern 4: Combined Exception and Status Retry
Handle both network exceptions and HTTP status codes.
```python
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)
),
stop=stop_after_attempt(5),
wait=wait_exponential_jitter(initial=1, max=30),
before_sleep=before_sleep_log(logger, logging.WARNING),
)
def robust_http_call(
method: str,
url: str,
**kwargs,
) -> httpx.Response:
"""HTTP call with comprehensive retry handling."""
return httpx.request(method, url, timeout=30, **kwargs)
```
## Detailed worked examples and patterns
Detailed sections (starting with `## Advanced Patterns`) live in `references/details.md`. Read that file when the navigation summary above is insufficient.
## Best Practices Summary
1. **Retry only transient errors** - Don't retry bugs or authentication failures
2. **Use exponential backoff** - Give services time to recover
3. **Add jitter** - Prevent thundering herd from synchronized retries
4. **Cap total duration** - `stop_after_attempt(5) | stop_after_delay(60)`
5. **Log every retry** - Silent retries hide systemic problems
6. **Use decorators** - Keep retry logic separate from business logic
7. **Inject dependencies** - Make infrastructure testable
8. **Set timeouts everywhere** - Every network call needs a timeout
9. **Fail gracefully** - Return cached/default values for non-critical paths
10. **Monitor retry rates** - High retry rates indicate underlying issues
© Seth Hobson · MIT · wshobson/agents