<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Israel Junior</title>
    <description>The latest articles on Forem by Israel Junior (@israeljrs).</description>
    <link>https://forem.com/israeljrs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F120469%2F463ed4ba-cd7a-409e-b93c-22d4cb9156bb.jpg</url>
      <title>Forem: Israel Junior</title>
      <link>https://forem.com/israeljrs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/israeljrs"/>
    <language>en</language>
    <item>
      <title>Construindo um Agentic usando o google ADK</title>
      <dc:creator>Israel Junior</dc:creator>
      <pubDate>Mon, 22 Sep 2025 19:51:41 +0000</pubDate>
      <link>https://forem.com/israeljrs/construindo-um-agentic-usando-o-google-adk-2h6o</link>
      <guid>https://forem.com/israeljrs/construindo-um-agentic-usando-o-google-adk-2h6o</guid>
      <description>&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Este artigo apresenta um agente construído com o Google ADK (Agent Development Kit) que consulta cotações de ações via YFinance. O agente expõe a ferramenta &lt;code&gt;fetch_stock_info&lt;/code&gt; para responder perguntas sobre preço atual, mínima/máxima do dia e recomendação, usando o modelo Gemini. Abaixo estão a arquitetura, o passo a passo de configuração e execução, além de ideias de evolução.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que este projeto
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Acessar cotações de forma conversacional com contexto.&lt;/li&gt;
&lt;li&gt;Integrar modelos Gemini a uma fonte de dados prática (Yahoo Finance via YFinance).&lt;/li&gt;
&lt;li&gt;Demonstrar como publicar ferramentas Python em um agente com o Google ADK.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Arquitetura
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agente&lt;/strong&gt;: &lt;code&gt;query_yfinance_agent&lt;/code&gt; (modelo &lt;code&gt;gemini-2.0-flash&lt;/code&gt;), definido em &lt;code&gt;query-yfinance/agent.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ferramenta&lt;/strong&gt;: &lt;code&gt;fetch_stock_info(ticker_symbol: str)&lt;/code&gt;, que usa &lt;code&gt;yfinance&lt;/code&gt; para buscar:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;displayName&lt;/code&gt; (ou &lt;code&gt;shortName&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;currentPrice&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dayLow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dayHigh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;recommendationKey&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Orquestração&lt;/strong&gt;: Google ADK aciona o modelo e decide quando chamar a ferramenta com base no prompt do usuário.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Configuração&lt;/strong&gt;: variáveis em &lt;code&gt;query-yfinance/.env&lt;/code&gt; (carregadas automaticamente pelo ADK).&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Código-chave
&lt;/h2&gt;

&lt;p&gt;Arquivo &lt;code&gt;query-yfinance/agent.py&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ferramenta de consulta:

&lt;ul&gt;
&lt;li&gt;Recebe &lt;code&gt;ticker_symbol&lt;/code&gt; (ex.: &lt;code&gt;PETR4.SA&lt;/code&gt;, &lt;code&gt;AAPL&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;yfinance.Ticker(...).info&lt;/code&gt; e retorna um dicionário com campos úteis.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Agente ADK:

&lt;ul&gt;
&lt;li&gt;Define &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt; e &lt;code&gt;instruction&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Registra a ferramenta em &lt;code&gt;tools=[fetch_stock_info]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python &lt;code&gt;&amp;gt;= 3.12&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Chave de API do Google Generative AI (para a API pública): variável &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Opcional: Vertex AI (com &lt;code&gt;GOOGLE_GENAI_USE_VERTEXAI=TRUE&lt;/code&gt; + credenciais GCP).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Com &lt;code&gt;uv&lt;/code&gt; (recomendado):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instale o &lt;code&gt;uv&lt;/code&gt;: &lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer"&gt;https://docs.astral.sh/uv/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;No diretório do projeto, rode &lt;code&gt;uv sync&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ative o ambiente: &lt;code&gt;source .venv/bin/activate&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com &lt;code&gt;pip&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crie e ative o venv: &lt;code&gt;python3.12 -m venv .venv &amp;amp;&amp;amp; source .venv/bin/activate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Atualize o pip: &lt;code&gt;pip install -U pip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Instale o projeto: &lt;code&gt;pip install -e .&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As dependências principais estão em &lt;code&gt;pyproject.toml&lt;/code&gt;: &lt;code&gt;google-adk&lt;/code&gt; e &lt;code&gt;yfinance&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Copie o exemplo de variáveis: &lt;code&gt;cp query-yfinance/.env-sample query-yfinance/.env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Edite &lt;code&gt;query-yfinance/.env&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GOOGLE_API_KEY=...&lt;/code&gt; (quando não usa Vertex)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GOOGLE_GENAI_USE_VERTEXAI=FALSE&lt;/code&gt; (ou &lt;code&gt;TRUE&lt;/code&gt; + &lt;code&gt;gcloud auth application-default login&lt;/code&gt; + exporte &lt;code&gt;GOOGLE_CLOUD_PROJECT&lt;/code&gt; e &lt;code&gt;GOOGLE_CLOUD_REGION&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Observação: o ADK lê o &lt;code&gt;.env&lt;/code&gt; da pasta do agente; mantenha-o em &lt;code&gt;query-yfinance/&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Execução (CLI)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Ative o venv.&lt;/li&gt;
&lt;li&gt;Rode &lt;code&gt;adk run query-yfinance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Exemplos de perguntas:

&lt;ul&gt;
&lt;li&gt;“Qual o preço atual de &lt;code&gt;PETR4.SA&lt;/code&gt;?”&lt;/li&gt;
&lt;li&gt;“Mostre a mínima e a máxima do dia para &lt;code&gt;AAPL&lt;/code&gt;.”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplos de tickers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brasil (B3): &lt;code&gt;PETR4.SA&lt;/code&gt;, &lt;code&gt;VALE3.SA&lt;/code&gt; (note o sufixo &lt;code&gt;.SA&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;EUA: &lt;code&gt;AAPL&lt;/code&gt;, &lt;code&gt;GOOGL&lt;/code&gt;, &lt;code&gt;MSFT&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fluxo em tempo de execução
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Você conversa com o agente no terminal.&lt;/li&gt;
&lt;li&gt;O modelo Gemini interpreta a intenção e decide chamar &lt;code&gt;fetch_stock_info&lt;/code&gt; com o ticker.&lt;/li&gt;
&lt;li&gt;A ferramenta usa YFinance e retorna os campos.&lt;/li&gt;
&lt;li&gt;O agente compõe uma resposta natural com os dados retornados.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tratamento de erros e limitações
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ticker inválido&lt;/strong&gt;: YFinance pode retornar dados incompletos; o agente ainda responde com o nome/ticker fornecido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Campos ausentes&lt;/strong&gt;: nem todos os ativos possuem &lt;code&gt;currentPrice&lt;/code&gt;/&lt;code&gt;recommendationKey&lt;/code&gt;; o código já lida com &lt;code&gt;dict&lt;/code&gt; vazio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rede/limites&lt;/strong&gt;: YFinance depende do Yahoo Finance e pode falhar temporariamente; tente novamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Precisão e atraso&lt;/strong&gt;: dados são de terceiros e podem ter latência; valide antes de decisões financeiras.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Estrutura do repositório
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;query-yfinance/agent.py&lt;/code&gt;: agente e ferramenta &lt;code&gt;fetch_stock_info&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;query-yfinance/.env-sample&lt;/code&gt;: exemplo de variáveis.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;README.md&lt;/code&gt;: guia rápido.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pyproject.toml&lt;/code&gt;: metadados e dependências.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Com poucas linhas de código e o Google ADK, integramos um modelo Gemini a uma fonte de dados financeira prática (YFinance), criando um agente conversacional que responde consultas de mercado. A abordagem é extensível: novas ferramentas podem ser adicionadas para enriquecer análises, histórico e formatação de relatórios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/israeljrs/google-adk-yfinance" rel="noopener noreferrer"&gt;Sample Code google adk yfinance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>adk</category>
      <category>agentic</category>
      <category>python</category>
    </item>
    <item>
      <title>BaseModel vs DataClass no Python</title>
      <dc:creator>Israel Junior</dc:creator>
      <pubDate>Mon, 22 Sep 2025 13:37:03 +0000</pubDate>
      <link>https://forem.com/israeljrs/basemodel-vs-dataclass-no-python-2keo</link>
      <guid>https://forem.com/israeljrs/basemodel-vs-dataclass-no-python-2keo</guid>
      <description>&lt;p&gt;Em Python, tanto &lt;code&gt;pydantic.BaseModel&lt;/code&gt; quanto &lt;code&gt;dataclasses.dataclass&lt;/code&gt; são usados para definir estruturas de dados com atributos tipados, mas eles têm propósitos e características distintas. A seguir, explico as vantagens de usar &lt;code&gt;pydantic.BaseModel&lt;/code&gt; em vez de &lt;code&gt;dataclasses.dataclass&lt;/code&gt; na declaração da sua classe &lt;code&gt;Request&lt;/code&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens de usar &lt;code&gt;pydantic.BaseModel&lt;/code&gt;:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Validação automática de dados&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O &lt;code&gt;BaseModel&lt;/code&gt; do Pydantic realiza validação automática dos dados com base nos tipos definidos (por exemplo, &lt;code&gt;str&lt;/code&gt; para &lt;code&gt;text&lt;/code&gt;). Se você passar um valor inválido (como um inteiro para um campo &lt;code&gt;str&lt;/code&gt;), o Pydantic lançará uma exceção (&lt;code&gt;ValidationError&lt;/code&gt;) com detalhes claros.&lt;/li&gt;
&lt;li&gt;Exemplo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

 &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
     &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

 &lt;span class="c1"&gt;# Válido
&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Olá&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Request(text='Olá')
&lt;/span&gt;
 &lt;span class="c1"&gt;# Inválido
&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Levanta ValidationError
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Com &lt;code&gt;dataclass&lt;/code&gt;, não há validação automática. Você pode atribuir qualquer tipo de dado a um atributo, mesmo que ele não corresponda à anotação de tipo, a menos que implemente validações manualmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conversão automática de tipos&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Pydantic tenta converter automaticamente valores para o tipo esperado, quando possível. Por exemplo, se &lt;code&gt;text&lt;/code&gt; espera uma &lt;code&gt;str&lt;/code&gt;, mas você passa um número como &lt;code&gt;"123"&lt;/code&gt;, o Pydantic pode convertê-lo para string.&lt;/li&gt;
&lt;li&gt;Exemplo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Converte 123 para "123" automaticamente
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Em &lt;code&gt;dataclass&lt;/code&gt;, não há conversão automática; você precisa implementar isso manualmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suporte a tipos complexos e personalizados&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Pydantic suporta tipos complexos como &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Dict&lt;/code&gt;, &lt;code&gt;Optional&lt;/code&gt;, &lt;code&gt;Union&lt;/code&gt;, e até mesmo outros modelos aninhados, com validação automática para todos os níveis.&lt;/li&gt;
&lt;li&gt;Exemplo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
 &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;

 &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
     &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

 &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
     &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
     &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

 &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;teste&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Com &lt;code&gt;dataclass&lt;/code&gt;, você teria que implementar validações manuais para garantir que os dados aninhados sejam corretos.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Serialização e desserialização&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Pydantic facilita a conversão de objetos para formatos como JSON e dicionários (usando &lt;code&gt;model_dump()&lt;/code&gt; ou &lt;code&gt;model_dump_json()&lt;/code&gt;) e também a desserialização de JSON/dicionários para objetos.&lt;/li&gt;
&lt;li&gt;Exemplo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;teste&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_dump&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# {'text': 'teste'}
&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_dump_json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# '{"text":"teste"}'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Com &lt;code&gt;dataclass&lt;/code&gt;, você precisa usar bibliotecas adicionais (como &lt;code&gt;dataclasses.asdict&lt;/code&gt;) ou implementar métodos manuais para serialização/desserialização.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integração com APIs e frameworks web&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Pydantic é amplamente usado em frameworks como FastAPI porque ele se integra perfeitamente com validação de entrada/saída de APIs, parsing de JSON e geração automática de esquemas OpenAPI.&lt;/li&gt;
&lt;li&gt;Exemplo com FastAPI:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
 &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

 &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

 &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
     &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

 &lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Com &lt;code&gt;dataclass&lt;/code&gt;, você precisaria de lógica adicional para validar e parsear os dados de entrada.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuração flexível e personalização&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Pydantic permite configurações avançadas, como validações personalizadas usando decoradores (&lt;code&gt;@field_validator&lt;/code&gt;) ou configurações globais via &lt;code&gt;ConfigDict&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Exemplo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field_validator&lt;/span&gt;

 &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
     &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

     &lt;span class="nd"&gt;@field_validator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;text_must_not_be_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
         &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
             &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Text cannot be empty&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Em &lt;code&gt;dataclass&lt;/code&gt;, você precisa implementar validações manualmente, geralmente no método &lt;code&gt;__post_init__&lt;/code&gt;, o que pode ser menos elegante.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suporte a esquemas JSON&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Pydantic gera automaticamente esquemas JSON (JSON Schema) para seus modelos, o que é útil para documentação e validação de APIs.&lt;/li&gt;
&lt;li&gt;Exemplo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_json_schema&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Com &lt;code&gt;dataclass&lt;/code&gt;, você precisaria de bibliotecas adicionais ou implementações manuais para gerar esquemas JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tratamento de dados opcionais e padrão&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Pydantic lida bem com valores opcionais, valores padrão e campos obrigatórios, com validação automática.&lt;/li&gt;
&lt;li&gt;Exemplo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
 &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;

 &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
     &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
     &lt;span class="n"&gt;optional_field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Em &lt;code&gt;dataclass&lt;/code&gt;, você pode definir valores padrão, mas não há validação automática para garantir conformidade com tipos opcionais.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quando usar &lt;code&gt;dataclass&lt;/code&gt; em vez de &lt;code&gt;BaseModel&lt;/code&gt;?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Casos simples sem validação&lt;/strong&gt;: Se você precisa apenas de uma estrutura de dados leve, sem validação ou serialização automática, &lt;code&gt;dataclass&lt;/code&gt; é mais simples e tem menos sobrecarga.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: &lt;code&gt;dataclass&lt;/code&gt; é geralmente mais leve em termos de desempenho, pois não realiza validações automáticas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Projetos sem dependências externas&lt;/strong&gt;: &lt;code&gt;dataclass&lt;/code&gt; é parte da biblioteca padrão do Python (a partir do Python 3.7), enquanto o Pydantic é uma dependência externa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;A principal vantagem de usar &lt;code&gt;pydantic.BaseModel&lt;/code&gt; em vez de &lt;code&gt;dataclasses.dataclass&lt;/code&gt; na sua classe &lt;code&gt;Request&lt;/code&gt; é a &lt;strong&gt;validação automática&lt;/strong&gt;, &lt;strong&gt;conversão de tipos&lt;/strong&gt;, &lt;strong&gt;serialização/desserialização&lt;/strong&gt; e &lt;strong&gt;integração com APIs&lt;/strong&gt;. Se você está lidando com entrada de dados (como em APIs REST, parsing de JSON ou formulários), o Pydantic é uma escolha superior porque reduz a necessidade de código boilerplate para validação e parsing. No entanto, se você precisa apenas de uma estrutura de dados simples e não quer dependências externas, &lt;code&gt;dataclass&lt;/code&gt; pode ser suficiente.&lt;/p&gt;

</description>
      <category>python</category>
    </item>
  </channel>
</rss>
