\n\n\n\n Commento sobre como implementar a lógica de nova tentativa com PydanticAI (Passo a passo) - AgntBox Commento sobre como implementar a lógica de nova tentativa com PydanticAI (Passo a passo) - AgntBox \n

Commento sobre como implementar a lógica de nova tentativa com PydanticAI (Passo a passo)

📖 7 min read1,333 wordsUpdated Apr 3, 2026

Implementação da lógica de novas tentativas com PydanticAI: Um tutorial passo a passo

Estamos construindo um serviço de recuperação de dados confiável que lida com interrupções de rede como um profissional — pois ninguém quer que seu aplicativo trave por causa de um simples timeout.

Pré-requisitos

  • Python 3.11+
  • pip install pydantic-ai
  • Compreensão básica dos modelos Pydantic
  • Conhecimento das bibliotecas de requisições de rede (como requests ou httpx)

Passo 1: Configuração do seu ambiente

Antes de implementar a lógica de novas tentativas, precisamos configurar nosso ambiente de desenvolvimento. Isso envolverá instalar o pacote PydanticAI e garantir que temos todas as bibliotecas necessárias.


# Prepare seu ambiente Python
# Instale as bibliotecas pydantic-ai e httpx
!pip install pydantic-ai httpx

Esse comando instala PydanticAI e httpx, que é crucial para realizar requisições HTTP. Eu escolhi httpx ao invés de requests devido ao seu suporte nativo para operações assíncronas, o que é uma grande vantagem para o desempenho. Agora, se você vem do mundo das requisições, esteja preparado para uma leve curva de aprendizado, mas acredite em mim, vale a pena.

Passo 2: Criação de um modelo Pydantic básico

Com o ambiente pronto, vamos criar nosso primeiro modelo Pydantic. Um modelo no Pydantic define o esquema para seus dados – é como um projeto. Vamos criar um que gerencia uma resposta de API simulada.


from pydantic import BaseModel

class ApiResponseModel(BaseModel):
 status: str
 data: dict

Esse modelo possui dois campos: status e data. O campo status indica se a requisição foi bem-sucedida, e data contém o conteúdo da resposta. A parte inteligente aqui é que o Pydantic irá validar a estrutura da resposta da API em relação a esse modelo.

Passo 3: Implementação da lógica de requisição HTTP

Agora, vamos criar uma função para realizar uma requisição HTTP. Usaremos Pydantic para validar a resposta. Aqui está a boa notícia: vamos adicionar uma lógica de novas tentativas, então se nossa requisição falhar, poderemos tentar novamente ao invés de ficar em pânico.


import httpx
import time

async def fetch_data(url: str) -> ApiResponseModel:
 async with httpx.AsyncClient() as client:
 response = await client.get(url)
 response.raise_for_status()
 return ApiResponseModel(**response.json())

Esse código recupera dados da URL especificada. Se falhar, precisamos implementar a lógica de novas tentativas. Ninguém quer lidar com erros HTTP em produção, certo?

Passo 4: Adicionando a lógica de novas tentativas

É hora de adicionar essa lógica de novas tentativas tão importante. Vamos implementar um mecanismo simples para tentar a requisição um número especificado de vezes antes de desistir.


async def fetch_with_retries(url: str, retries: int = 3, delay: int = 2) -> ApiResponseModel:
 for i in range(retries):
 try:
 return await fetch_data(url)
 except httpx.HTTPStatusError as e:
 print(f"Tentativa {i + 1} falhou: {e}. Nova tentativa...")
 time.sleep(delay) # Aguardar antes de tentar novamente
 except Exception as e:
 print(f"Erro inesperado: {e}. Nova tentativa...")
 time.sleep(delay)
 raise Exception(f"Falha na recuperação dos dados após {retries} tentativas.")

Nesta função, temos um parâmetro opcional retries para nos permitir especificar quantas vezes tentar a requisição antes de desistir. Também temos um parâmetro delay, então se nossa requisição falhar, fazemos uma pausa de alguns segundos ao invés de bombardear o servidor com requisições.

Os armadilhas

Até agora, tudo bem, mas aqui estão algumas armadilhas nas quais eu caí várias vezes e que podem fazer você tropeçar em produção:

  • Exponential Backoff: É crucial evitar sobrecarregar o servidor após uma falha. Certifique-se de aumentar o delay a cada nova tentativa. Simples delays estáticos não serão suficientes quando o sistema começa a sobrecarregar o servidor.
  • Gerenciamento de diferentes exceções: Você pode querer tentar novamente apenas em problemas temporários. Nem todas as exceções merecem uma nova tentativa, então refine seu gerenciamento de exceções para capturar erros específicos.
  • Registro de falhas: Não se esqueça de registrar detalhes sobre as falhas. Isso é uma testemunha valiosa para diagnosticar problemas mais tarde.
  • Gerenciadores de contexto assíncronos: Se você misturar código síncrono e assíncrono, tenha cuidado com os gerenciadores de contexto. Eles não funcionam da mesma maneira, e isso pode levar a bugs desagradáveis.
  • Latência de rede: Esteja ciente de que a latência da rede pode afetar significativamente suas novas tentativas. Teste em diferentes condições para estruturar sua lógica em torno de cenários realistas.

Exemplo de código completo

Aqui está uma versão completa do que construímos, totalmente funcional. Isso facilita a cópia e uso imediato. Basta substituir YOUR_API_URL_HERE pelo seu endpoint alvo.


import httpx
import time
from pydantic import BaseModel

class ApiResponseModel(BaseModel):
 status: str
 data: dict

async def fetch_data(url: str) -> ApiResponseModel:
 async with httpx.AsyncClient() as client:
 response = await client.get(url)
 response.raise_for_status()
 return ApiResponseModel(**response.json())

async def fetch_with_retries(url: str, retries: int = 3, delay: int = 2) -> ApiResponseModel:
 for i in range(retries):
 try:
 return await fetch_data(url)
 except httpx.HTTPStatusError as e:
 print(f"Tentativa {i + 1} falhou: {e}. Nova tentativa...")
 time.sleep(delay)
 except Exception as e:
 print(f"Erro inesperado: {e}. Nova tentativa...")
 time.sleep(delay)
 raise Exception(f"Falha na recuperação dos dados após {retries} tentativas.")

# Exemplo de uso
# Certifique-se de que isso seja executado em um contexto assíncrono, como asyncio.run()
url = "YOUR_API_URL_HERE"
data = await fetch_with_retries(url)
print(data)

Qual é o próximo passo?

Seu próximo passo? Experimente adicionar logs personalizados e métricas à sua lógica de novas tentativas. Você vai querer monitorar com que frequência as requisições falham, o tempo gasto nas tentativas de novas tentativas, etc. Ter esses dados pode melhorar significativamente a confiabilidade do seu aplicativo.

FAQ

P: Por que usar PydanticAI ao invés das opções tradicionais?

R: PydanticAI permite uma gestão estruturada dos dados e uma validação automática de suas respostas da API, algo desagradável de lidar manualmente. Com 15.593 estrelas no GitHub, PydanticAI provou seu sucesso, o que pode significar melhor suporte comunitário e recursos.

P: O que fazer se minha API requer autenticação?

R: Você precisará estender o cliente HTTP para incluir cabeçalhos de autenticação. Isso pode ser feito modificando a inicialização de httpx.AsyncClient() para incluir um parâmetro auth se sua API suportar autenticação básica, ou usando tokens OAuth conforme necessário.

P: Existe uma alternativa à lógica de novas tentativas em aplicativos em tempo real?

R: Embora a lógica de novas tentativas seja essencial, considere implementar padrões de disjuntor como uma camada adicional de resiliência. Isso permite que seu aplicativo reagia mais graciosamente às falhas e pode reduzir a carga no servidor durante as quebras.

Recomendações para diferentes perfis de desenvolvedores

Se você é novo neste universo de recuperação de dados:

  • Novo desenvolvedor: Concentre-se em dominar o básico, familiarize-se com o envio de requisições HTTP e estruture seus modelos de acordo com APIs reais.
  • Desenvolvedor intermediário: Observe mecanismos avançados de novas tentativas e estratégias de otimização de desempenho. Considere criar um método de nova tentativa personalizado para mais flexibilidade.
  • Desenvolvedor sênior: Dedique um tempo para aprimorar o gerenciamento de erros e os padrões de observação que podem fornecer melhores insights sobre o comportamento de seu aplicativo sob carga. Métricas e logging são seus amigos!

Dados até 20 de março de 2026. Fontes: pydantic/pydantic-ai, Pydantic AI Retries, Adicione comportamento personalizado de novas tentativas às requisições.

Artigos relacionados

🕒 Published:

🧰
Written by Jake Chen

Software reviewer and AI tool expert. Independently tests and benchmarks AI products. No sponsored reviews — ever.

Learn more →
Browse Topics: AI & Automation | Comparisons | Dev Tools | Infrastructure | Security & Monitoring
Scroll to Top