<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Desenvolvedores BR articles</title>
    <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/bg-p/DesenvolvedoresBR</link>
    <description>Desenvolvedores BR articles</description>
    <pubDate>Fri, 15 May 2026 04:06:23 GMT</pubDate>
    <dc:creator>DesenvolvedoresBR</dc:creator>
    <dc:date>2026-05-15T04:06:23Z</dc:date>
    <item>
      <title>GitHub Copilot Dev Days Online</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/github-copilot-dev-days-online/ba-p/4518608</link>
      <description>&lt;P&gt;After a series of in-person events, GitHub Copilot Dev Days is now going online, bringing developers from around the world together to explore modern AI-assisted software development in practice.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Through live sessions focused on agentic development, modern workflows, and hands-on learning in VS Code, attendees will learn how to use GitHub Copilot beyond autocomplete and apply it across real development scenarios.&lt;/P&gt;
&lt;H2 data-section-id="11zls3u" data-start="517" data-end="582"&gt;&lt;STRONG&gt;Register for the session that fits your language and community&lt;/STRONG&gt;&lt;/H2&gt;
&lt;H3 data-section-id="1ivtktk" data-start="971" data-end="1013"&gt;&lt;STRONG&gt;GitHub Copilot Dev Days LATAM [Spanish] - May 26&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1015" data-end="1180"&gt;A hands-on session for Spanish-speaking developers across Latin America focused on building modern applications with GitHub Copilot, TypeScript, React, and Tailwind.&lt;/P&gt;
&lt;P data-start="1182" data-end="1330"&gt;Attendees will explore agentic workflows, context engineering, and practical ways to use GitHub Copilot as an active development partner in VS Code.&lt;/P&gt;
&lt;UL data-start="1332" data-end="1592"&gt;
&lt;LI data-section-id="1klv0sd" data-start="1332" data-end="1354"&gt;&lt;STRONG&gt;Date: May 26, 2026, 12 PM (Mexico City / CDMX)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-section-id="abynt6" data-start="1466" data-end="1592"&gt;&lt;STRONG&gt;Register: &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/events/27094/" target="_blank" rel="noopener" data-start="1478" data-end="1592" data-lia-auto-title-active="0" data-lia-auto-title="GitHub Copilot Dev Days LATAM | Microsoft Reactor"&gt;GitHub Copilot Dev Days LATAM | Microsoft Reactor&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-section-id="1loccch" data-start="1594" data-end="1650"&gt;&lt;STRONG&gt;GitHub Copilot Dev Days Brazil [Portuguese] - May 25&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1652" data-end="1788"&gt;This edition focuses on AI-assisted development with Python, FastAPI, and HTMX using GitHub Copilot throughout the development workflow.&lt;/P&gt;
&lt;P data-start="1790" data-end="1932"&gt;The session covers practical workflows for code generation, refactoring, debugging, and day-to-day development with GitHub Copilot in VS Code.&lt;/P&gt;
&lt;UL data-start="1934" data-end="2224"&gt;
&lt;LI data-section-id="1m9l41q" data-start="1934" data-end="1956"&gt;&lt;STRONG&gt;Date: May 25, 2026, 7 PM (Brasilia Time)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-section-id="19jysof" data-start="2098" data-end="2224"&gt;&lt;STRONG&gt;Register: &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/events/27091/" target="_blank" rel="noopener" data-start="2110" data-end="2224" data-lia-auto-title-active="0" data-lia-auto-title="GitHub Copilot Dev Days Brasil | Microsoft Reactor"&gt;GitHub Copilot Dev Days Brasil | Microsoft Reactor&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-section-id="2qu2hq" data-start="2811" data-end="2851"&gt;&lt;STRONG&gt;GitHub Copilot Dev Days 中文版 [Simplified Chinese] - May 26&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2853" data-end="2989"&gt;This session explores how GitHub Copilot and GitHub Actions can work together to create intelligent and automated development workflows.&lt;/P&gt;
&lt;P data-start="2991" data-end="3155"&gt;Topics include ChatOps, automated summaries, syncing content into GitHub Issues, and agentic workflows designed to improve collaboration and engineering efficiency.&lt;/P&gt;
&lt;UL data-start="3157" data-end="3430"&gt;
&lt;LI data-section-id="1klv0sd" data-start="3157" data-end="3179"&gt;&lt;STRONG&gt;Date: May 26, 2026, 7:30 PM (China Standard Time - CST)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-section-id="1fdwxsq" data-start="3304" data-end="3430"&gt;&lt;STRONG&gt;Register: &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/events/27114/" target="_blank" rel="noopener" data-start="3316" data-end="3430" data-lia-auto-title-active="0" data-lia-auto-title="GitHub Copilot Dev Days - 中文版 | Microsoft Reactor"&gt;GitHub Copilot Dev Days - 中文版 | Microsoft Reactor&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-section-id="1et0tch" data-start="2226" data-end="2262"&gt;&lt;STRONG&gt;GitHub Copilot Dev Days [English] - May 27&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2264" data-end="2390"&gt;An English-language workshop for developers who want to learn how to build modern applications with GitHub Copilot in VS Code.&lt;/P&gt;
&lt;P data-start="2392" data-end="2547"&gt;The session focuses on TypeScript, React, Tailwind, and Agent Mode workflows, showing how better context and prompting can improve AI-assisted development.&lt;/P&gt;
&lt;UL data-start="2549" data-end="2809"&gt;
&lt;LI data-section-id="1dag7ng" data-start="2549" data-end="2571"&gt;&lt;STRONG&gt;Date: May 27, 2026, 9 AM (PST)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-section-id="1y4gma0" data-start="2683" data-end="2809"&gt;&lt;STRONG&gt;Register: &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/events/27096/" target="_blank" rel="noopener" data-start="2695" data-end="2809" data-lia-auto-title-active="0" data-lia-auto-title="GitHub Copilot Dev Days | Microsoft Reactor"&gt;GitHub Copilot Dev Days | Microsoft Reactor&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P data-start="3432" data-end="3624" data-is-last-node="" data-is-only-node=""&gt;All sessions are hosted through &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/" target="_blank" rel="noopener" data-start="3464" data-end="3548"&gt;Microsoft Reactor&lt;/A&gt;. Check the registration pages for local times and additional event details.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;</description>
      <pubDate>Thu, 14 May 2026 13:38:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/github-copilot-dev-days-online/ba-p/4518608</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2026-05-14T13:38:38Z</dc:date>
    </item>
    <item>
      <title>APIM Circuit Breaker com Azure OpenAI</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/apim-circuit-breaker-com-azure-openai/ba-p/4514008</link>
      <description>&lt;H1 data-line="0"&gt;APIM Circuit Breaker com Azure OpenAI&lt;/H1&gt;
&lt;H2 data-line="9"&gt;Visão Geral&lt;/H2&gt;
&lt;P data-line="12"&gt;Ao consumir modelos do&amp;nbsp;&lt;STRONG&gt;Azure OpenAI&lt;/STRONG&gt;&amp;nbsp;em produção, depender de um único endpoint representa um risco real. Basta uma instância ficar indisponível ou atingir limites de throttling para que toda a aplicação seja impactada.&lt;/P&gt;
&lt;P data-line="14"&gt;Neste artigo, construímos uma arquitetura resiliente utilizando o&amp;nbsp;&lt;STRONG&gt;Azure API Management (APIM)&lt;/STRONG&gt;&amp;nbsp;como camada de proteção entre o cliente e os serviços de IA.&lt;/P&gt;
&lt;P data-line="16"&gt;O ponto de partida são&amp;nbsp;&lt;STRONG&gt;dois backends do Azure OpenAI&lt;/STRONG&gt;&amp;nbsp;(oiaws01&amp;nbsp;e&amp;nbsp;oiaws02), ambos configurados com&amp;nbsp;&lt;STRONG&gt;Managed Identity&lt;/STRONG&gt;. A partir deles, criamos um&amp;nbsp;&lt;STRONG&gt;Load Balancer Pool&lt;/STRONG&gt;&amp;nbsp;no APIM, distribuindo o tráfego em um modelo 50/50 entre os dois endpoints.&lt;/P&gt;
&lt;P data-line="18"&gt;Em seguida, habilitamos o&amp;nbsp;&lt;STRONG&gt;Circuit Breaker&lt;/STRONG&gt;, que detecta falhas consecutivas e "abre o circuito", impedindo que novas requisições sejam enviadas a um backend com problemas. Nesse estado, o APIM passa a responder com&amp;nbsp;&lt;STRONG&gt;503 – Service Unavailable&lt;/STRONG&gt;, incluindo o header&amp;nbsp;Retry-After, até que o backend se recupere.&lt;/P&gt;
&lt;P data-line="20"&gt;O ponto mais crítico está na&amp;nbsp;&lt;STRONG&gt;configuração das políticas XML&lt;/STRONG&gt;. Posicionar o&amp;nbsp;set-backend-service&amp;nbsp;&lt;STRONG&gt;dentro&lt;/STRONG&gt;&amp;nbsp;do bloco&amp;nbsp;&amp;lt;retry&amp;gt;&amp;nbsp;garante que cada tentativa seja roteada novamente pelo Load Balancer, evitando que as retentativas atinjam sempre o mesmo backend com falha.&lt;/P&gt;
&lt;P data-line="22"&gt;Todo o fluxo foi validado usando o&amp;nbsp;&lt;STRONG&gt;Trace do APIM&lt;/STRONG&gt;, onde é possível acompanhar, passo a passo:&lt;/P&gt;
&lt;UL data-line="24"&gt;
&lt;LI data-line="24"&gt;Seleção do backend no pool&lt;/LI&gt;
&lt;LI data-line="25"&gt;Autenticação via Managed Identity&lt;/LI&gt;
&lt;LI data-line="26"&gt;Fallback para o segundo endpoint&lt;/LI&gt;
&lt;LI data-line="27"&gt;Resposta final ao cliente&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="29"&gt;Por fim, exploramos a&amp;nbsp;&lt;STRONG&gt;camada de observabilidade&lt;/STRONG&gt;. Os eventos de abertura do Circuit Breaker são capturados e enviados para uma&amp;nbsp;&lt;STRONG&gt;Storage Queue&lt;/STRONG&gt;, de onde um&amp;nbsp;&lt;STRONG&gt;Logic App&lt;/STRONG&gt;&amp;nbsp;os exporta via HTTP POST para o&amp;nbsp;&lt;STRONG&gt;Elastic Observability&lt;/STRONG&gt;, permitindo monitoramento em tempo real de quando e por que os circuitos são abertos.&lt;/P&gt;
&lt;H2 data-line="17"&gt;Diagrama&lt;/H2&gt;
&lt;img&gt;Diagrama do fluxo da Requisição http, Load balancer falhas e Circuit Break&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-line="21"&gt;1. Criando os Backends para Azure OpenAI&lt;/H2&gt;
&lt;P data-line="26"&gt;O primeiro passo é registrar no APIM os endpoints que representam as instâncias do Azure OpenAI. Neste cenário, criamos dois backends apontando para:&lt;/P&gt;
&lt;UL data-line="28"&gt;
&lt;LI data-line="28"&gt;https://oiaws01.openai.azure.com/openai&lt;/LI&gt;
&lt;LI data-line="29"&gt;https://oiaws02.openai.azure.com/openai&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="31"&gt;Cada backend funciona como uma abstração dentro do APIM — ele encapsula a URL, as credenciais e as configurações de resiliência (como o Circuit Breaker) em um único recurso reutilizável.&lt;/P&gt;
&lt;P data-line="79"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;Dois backends registrados no APIM: openapi01-openai-endpoint e openapi02-openai-endpoint, apontando para os respectivos endpoints do Azure OpenAI.&lt;/img&gt;
&lt;H3 data-line="81"&gt;Configuração de Managed Identity&lt;/H3&gt;
&lt;P data-line="39"&gt;Para que o APIM consiga se autenticar nos backends sem expor chaves de API, configuramos&amp;nbsp;&lt;STRONG&gt;Managed Identity&lt;/STRONG&gt;. O Azure API Management pode apresentar credenciais ao backend utilizando cabeçalhos de autorização, parâmetros de consulta ou certificados de cliente — mas a abordagem mais segura e moderna é usar a identidade gerenciada.&lt;/P&gt;
&lt;P data-line="41"&gt;Com essa configuração, o APIM solicita um token OAuth ao Azure AD usando sua própria identidade (System Assigned), e o apresenta ao backend como um Bearer token. Não há segredos para rotacionar, não há chaves para vazar.&lt;/P&gt;
&lt;P data-line="90"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;Backend openia02-openai-endpoint configurado com Managed Identity (System Assigned) apontando para https://cognitiveservices.azure.com/.&lt;/img&gt;
&lt;P&gt;Em alguns cenários — especialmente quando a configuração via portal não é suficiente ou quando precisamos de controle granular — é necessário configurar a autenticação diretamente nas políticas XML do APIM:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;authentication-managed-identity resource="https://cognitiveservices.azure.com" output-token-variable-name="msi-access-token" /&amp;gt;
&amp;lt;!-- Add Authorization header with token --&amp;gt;
&amp;lt;set-header name="Authorization" exists-action="override"&amp;gt;
    &amp;lt;value&amp;gt;@("Bearer " + (string)context.Variables["msi-access-token"])&amp;lt;/value&amp;gt;
&amp;lt;/set-header&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Essa abordagem é útil quando você precisa reutilizar o token em múltiplas policies ou quando o backend exige um formato específico de apresentação das credenciais.&lt;/P&gt;
&lt;H3 data-line="92"&gt;Teste Básico&lt;/H3&gt;
&lt;P&gt;Com os backends e a autenticação configurados, o próximo passo é validar que tudo funciona. Um teste simples direto no console do APIM confirma a conectividade:&lt;/P&gt;
&lt;P data-line="94"&gt;&lt;STRONG&gt;Parâmetros:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;deployment-id: o1
api-version: 2025-01-01-preview&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Request body:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{
    "messages": [
        {
            "role": "user",
            "content": "I am going to Paris, what should I see?"
        }
    ],
    "max_completion_tokens": 40000,
    "model": "o1"
}&lt;/LI-CODE&gt;&lt;img&gt;Teste no console do APIM confirmando resposta 200 OK do Azure OpenAI (modelo o1) via Managed Identity.&lt;/img&gt;
&lt;H2 data-line="58"&gt;2. Criando o Load Balancer (LB)&lt;/H2&gt;
&lt;P data-line="92"&gt;Ter dois backends funcionando individualmente é um bom começo, mas não garante resiliência por si só. Se a API estiver apontada para um backend fixo e ele cair, o serviço para. É aqui que entra o&amp;nbsp;&lt;STRONG&gt;Load Balancer Pool&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-line="94"&gt;O Load Balancer Pool é um recurso do APIM que agrupa múltiplos backends e distribui o tráfego entre eles segundo regras configuráveis. Em vez de apontar a política set-backend-service para um backend individual, apontamos para o pool — e o APIM se encarrega de escolher para qual instância enviar cada requisição.&lt;/P&gt;
&lt;H3 data-line="122"&gt;Criação do Load Balancer Pool&lt;/H3&gt;
&lt;P data-line="98"&gt;Criamos um pool chamado&amp;nbsp;LB01&amp;nbsp;contendo os dois backends OpenAI. A distribuição foi configurada como&amp;nbsp;&lt;STRONG&gt;50/50 com pesos customizados&lt;/STRONG&gt;, o que significa que cada backend recebe metade do tráfego em condições normais.&lt;/P&gt;
&lt;P data-line="100"&gt;&lt;STRONG&gt;Benefícios imediatos:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-line="102"&gt;
&lt;LI data-line="102"&gt;&lt;STRONG&gt;Distribuição de carga&lt;/STRONG&gt;&amp;nbsp;— nenhum backend recebe 100% das requisições&lt;/LI&gt;
&lt;LI data-line="103"&gt;&lt;STRONG&gt;Alta disponibilidade&lt;/STRONG&gt;&amp;nbsp;— se um backend falhar, o outro absorve o tráfego (quando combinado com retry)&lt;/LI&gt;
&lt;LI data-line="104"&gt;&lt;STRONG&gt;Flexibilidade&lt;/STRONG&gt; — pesos e prioridades podem ser ajustados sem alterar código&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;Criação do Load Balancer Pool com os dois backends OpenAI, peso 50/50 e prioridades customizadas.&lt;/img&gt;
&lt;P&gt;Com o pool criado, qualquer política que referencia backend-id="LB01" passa automaticamente a ter balanceamento de carga. Mas distribuir tráfego não é suficiente — precisamos também&amp;nbsp;&lt;STRONG&gt;detectar e isolar falhas&lt;/STRONG&gt;. É o que o Circuit Breaker faz.&lt;/P&gt;
&lt;H2 data-line="75"&gt;3. Entendendo e Configurando o Circuit Breaker&lt;/H2&gt;
&lt;H3 data-line="116"&gt;O que é o Circuit Breaker?&lt;/H3&gt;
&lt;P data-line="118"&gt;O&amp;nbsp;&lt;STRONG&gt;Circuit Breaker&lt;/STRONG&gt;&amp;nbsp;é um padrão de resiliência para sistemas distribuídos, inspirado nos disjuntores elétricos. Assim como um disjuntor corta a energia quando detecta uma sobrecarga para proteger o circuito, o Circuit Breaker em software&amp;nbsp;&lt;STRONG&gt;interrompe temporariamente as chamadas a um serviço que está falhando&lt;/STRONG&gt;, evitando que falhas em cascata derrubem toda a aplicação.&lt;/P&gt;
&lt;P data-line="120"&gt;Sem Circuit Breaker, quando um backend começa a falhar, o sistema continua enviando requisições para ele — consumindo recursos, aumentando latência e potencialmente causando timeout em cadeia. Com o Circuit Breaker, o sistema "aprende" que aquele backend está com problemas e para de enviar tráfego até que ele se recupere.&lt;/P&gt;
&lt;H3 data-line="122"&gt;Os Três Estados do Circuit Breaker&lt;/H3&gt;
&lt;P data-line="124"&gt;O Circuit Breaker opera em três estados bem definidos:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Estado&lt;/th&gt;&lt;th&gt;Comportamento&lt;/th&gt;&lt;th&gt;Analogia&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Closed (Fechado)&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Tráfego flui normalmente para o backend. Falhas são contadas silenciosamente.&lt;/td&gt;&lt;td&gt;Disjuntor ligado — energia passa.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Open (Aberto)&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Todas as requisições são&amp;nbsp;&lt;STRONG&gt;imediatamente rejeitadas&lt;/STRONG&gt;&amp;nbsp;com&amp;nbsp;503 Service Unavailable&amp;nbsp;+ header&amp;nbsp;Retry-After. Nenhuma chamada chega ao backend.&lt;/td&gt;&lt;td&gt;Disjuntor desligado — energia cortada para proteger o circuito.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Half-Open (Meio-aberto)&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Após o&amp;nbsp;trip duration&amp;nbsp;expirar, o circuito permite&amp;nbsp;&lt;STRONG&gt;uma requisição de teste&lt;/STRONG&gt;. Se ela for bem-sucedida, volta para Closed. Se falhar, volta para Open.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;A transição entre os estados segue este fluxo:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-line="141"&gt;Por que isso importa para Azure OpenAI?&lt;/H3&gt;
&lt;P data-line="143"&gt;No contexto de IA generativa, uma chamada ao Azure OpenAI pode levar vários segundos. Se o backend está retornando erros (429 throttling, 500 internal error, 404 modelo não encontrado), cada tentativa desperdiça tempo precioso. O Circuit Breaker garante&amp;nbsp;&lt;STRONG&gt;fail-fast&lt;/STRONG&gt;: em vez de esperar 30 segundos por um timeout, o cliente recebe imediatamente um 503 com a informação de quando pode tentar novamente.&lt;/P&gt;
&lt;H3 data-line="145"&gt;Configuração no APIM&lt;/H3&gt;
&lt;img&gt;Configuração do Circuit Breaker: 1 falha dispara abertura, status codes 400–599, trip duration de 1 minuto e Retry-After habilitado.&lt;/img&gt;
&lt;P data-line="151"&gt;Os parâmetros configurados foram:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Parâmetro&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;th&gt;Significado&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Rule name&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;rulecb&lt;/td&gt;&lt;td&gt;Identificador da regra&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Failure count&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Basta 1 falha para abrir o circuito (agressivo, ideal para testes)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Failure interval&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;1 hora&lt;/td&gt;&lt;td&gt;Janela de tempo para contagem de falhas&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Failure status code range&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;400-599&lt;/td&gt;&lt;td&gt;Qualquer resposta 4xx ou 5xx conta como falha&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Failure error reason&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;BackendConnectionFailure&lt;/td&gt;&lt;td&gt;Tipo de erro que dispara o Circuit Breaker&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Trip duration&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;1 minuto&lt;/td&gt;&lt;td&gt;Tempo que o circuito permanece aberto antes de tentar Half-Open&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Check Retry-After header&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;True (Accept)&lt;/td&gt;&lt;td&gt;Respeita o header Retry-After do backend&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P data-line="163"&gt;&lt;STRONG&gt;Nota sobre o Failure Count:&lt;/STRONG&gt; Em produção, um valor de&amp;nbsp;1&amp;nbsp;é muito agressivo — uma única falha transitória abriria o circuito. Valores entre 3 e 5 são mais comuns. Para este artigo, usamos&amp;nbsp;1&amp;nbsp;para facilitar a demonstração.&lt;/P&gt;
&lt;H3 data-line="146"&gt;Comportamento Observado&lt;/H3&gt;
&lt;UL data-line="148"&gt;
&lt;LI data-line="148"&gt;Após falhas consecutivas, o APIM retorna&amp;nbsp;&lt;STRONG&gt;503 – Service Unavailable&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL data-line="148"&gt;
&lt;LI data-line="149"&gt;O Circuit Breaker aparece como &lt;STRONG&gt;aberto&lt;/STRONG&gt;&amp;nbsp;no portal do Azure&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL data-line="148"&gt;
&lt;LI data-line="150"&gt;O header &lt;STRONG&gt;Retry-After&lt;/STRONG&gt; é incluído na resposta&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-line="94"&gt;4. Configurando as Políticas para usar o LB&lt;/H2&gt;
&lt;P data-line="178"&gt;Com backends, Load Balancer e Circuit Breaker configurados, o último passo é garantir que as&amp;nbsp;&lt;STRONG&gt;políticas XML&lt;/STRONG&gt;&amp;nbsp;do APIM conectem tudo corretamente. Aqui estão os pontos que fazem toda a diferença entre uma configuração que funciona e uma que parece funcionar.&lt;/P&gt;
&lt;H3 data-line="180"&gt;Ponto Importante #1 — Apontar para o Pool, não para o Backend&lt;/H3&gt;
&lt;P data-line="182"&gt;A política&amp;nbsp;set-backend-service&amp;nbsp;deve referenciar o&amp;nbsp;&lt;STRONG&gt;Load Balancer Pool&lt;/STRONG&gt;, e não um backend individual:&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;set-backend-service id="apim-generated-policy" backend-id="LB01" /&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Se você apontar diretamente para openapi01-openai-endpoint, perde todo o benefício do balanceamento e do failover automático.&lt;/P&gt;
&lt;H3 data-line="190"&gt;Ponto Importante #2 — Buffer do Request Body&lt;/H3&gt;
&lt;P data-line="192"&gt;A política de retry deve usar forward-request com buffer-request-body="true". Sem isso, o body da requisição é consumido na primeira tentativa e não está disponível para retentativas:&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;backend&amp;gt;
    &amp;lt;retry condition="@(context.Response.StatusCode == 404)" count="2" interval="1" first-fast-retry="true"&amp;gt;
        &amp;lt;forward-request buffer-request-body="true" /&amp;gt;
    &amp;lt;/retry&amp;gt;
&amp;lt;/backend&amp;gt;&lt;/LI-CODE&gt;
&lt;H3 data-line="202"&gt;Ponto Importante #3 — Retry balanceado pelo LB&lt;/H3&gt;
&lt;P data-line="204"&gt;Este é o ponto mais crítico e o que diferencia uma configuração robusta de uma ingênua. Se o&amp;nbsp;set-backend-service&amp;nbsp;estiver&amp;nbsp;&lt;STRONG&gt;fora&lt;/STRONG&gt;&amp;nbsp;do bloco&amp;nbsp;&amp;lt;retry&amp;gt;, o backend é selecionado uma única vez — e todas as retentativas vão para o mesmo endpoint. Se esse endpoint está falhando, todas as retentativas falham também.&lt;/P&gt;
&lt;P data-line="206"&gt;A solução é colocar o&amp;nbsp;set-backend-service&amp;nbsp;&lt;STRONG&gt;dentro&lt;/STRONG&gt; do&amp;nbsp;&amp;lt;retry&amp;gt;:&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;backend&amp;gt;
    &amp;lt;retry condition="@(context.Response.StatusCode == 404)" count="2" interval="1" first-fast-retry="true"&amp;gt;
        &amp;lt;set-backend-service id="apim-generated-policy" backend-id="LB01" /&amp;gt;
        &amp;lt;forward-request buffer-request-body="true" /&amp;gt;
    &amp;lt;/retry&amp;gt;
&amp;lt;/backend&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Com essa configuração, a cada tentativa o Load Balancer é consultado novamente e pode rotear para um backend diferente. O resultado prático: se oiaws02 falha, a retentativa vai para oiaws01 automaticamente.&lt;/P&gt;
&lt;H3 data-line="129"&gt;Explicação dos Elementos&lt;/H3&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Elemento&lt;/th&gt;&lt;th&gt;Descrição&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;lt;retry&amp;gt;&lt;/td&gt;&lt;td&gt;Define lógica de repetição (retry) para chamadas a serviços de backend&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;condition="@(context.Response.StatusCode == 404)"&lt;/td&gt;&lt;td&gt;Condição para acionar a repetição: resposta HTTP 404 (Not Found)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;count="2"&lt;/td&gt;&lt;td&gt;Número máximo de tentativas adicionais (além da original)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;interval="1"&lt;/td&gt;&lt;td&gt;Intervalo de 1 segundo entre as tentativas&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;first-fast-retry="true"&lt;/td&gt;&lt;td&gt;A primeira repetição é imediata, sem aguardar o intervalo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;lt;forward-request /&amp;gt;&lt;/td&gt;&lt;td&gt;Envia a requisição ao serviço de backend&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2 data-line="142"&gt;5. Trace — Validação do Fluxo&lt;/H2&gt;
&lt;P data-line="235"&gt;onfiguração feita, é hora de validar. O&amp;nbsp;&lt;STRONG&gt;Trace do APIM&lt;/STRONG&gt;&amp;nbsp;permite acompanhar passo a passo o que acontece com cada requisição — desde a entrada até a resposta final ao cliente. É a ferramenta definitiva para confirmar que o Load Balancer, o Circuit Breaker e o retry estão funcionando em conjunto.&lt;/P&gt;
&lt;P data-line="237"&gt;No cenário de teste, o backend&amp;nbsp;oiaws02&amp;nbsp;&lt;STRONG&gt;não possui o modelo&amp;nbsp;o1&lt;/STRONG&gt;&amp;nbsp;deployado, então retorna&amp;nbsp;404. O Trace mostra exatamente como o APIM lida com isso:&lt;/P&gt;
&lt;OL&gt;
&lt;LI data-line="239"&gt;&lt;STRONG&gt; Backend selecionado no pool:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Backend '(, https://oiaws02.openai.azure.com/openai)' was selected in Backend pool 'LB01'.&lt;/LI-CODE&gt;
&lt;P data-line="212"&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI data-line="244"&gt;&lt;STRONG&gt; Autenticação via Managed Identity:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Managed identity token is added to Authorization header.&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="3"&gt;
&lt;LI data-line="249"&gt;&lt;STRONG&gt; Primeira tentativa — falha (oiaws02 não possui o modelo o1):&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Request sent to https://oiaws02.openai.azure.com/openai/deployments/o1/chat/completions → Response: 404 Not Found&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI data-line="255"&gt;&lt;STRONG&gt; Retry com novo backend selecionado pelo LB:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Backend service URL was changed. oldBackendServiceUrl: https://oiaws02.openai.azure.com/openai newBackendServiceUrl: https://oiaws01.openai.azure.com/openai&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="5"&gt;
&lt;LI data-line="262"&gt;&lt;STRONG&gt; Segunda tentativa — sucesso:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Request sent to https://oiaws01.openai.azure.com/openai/deployments/o1/chat/completions → Response: 200 OK&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="6"&gt;
&lt;LI data-line="268"&gt;&lt;STRONG&gt; Resposta final ao cliente:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Response has been sent to the caller in full&lt;/LI-CODE&gt;
&lt;P data-line="273"&gt;O cliente recebeu a resposta com sucesso, sem saber que houve uma falha nos bastidores. Isso é resiliência transparente.&lt;/P&gt;
&lt;H2 data-line="168"&gt;6. Events — Monitoramento do Circuit Breaker&lt;/H2&gt;
&lt;P&gt;Ter resiliência é essencial, mas &lt;STRONG&gt;saber quando ela está sendo acionada&lt;/STRONG&gt; é igualmente importante. Se o Circuit Breaker está abrindo com frequência, pode indicar um problema que precisa de atenção — um backend degradado, um modelo removido, ou limites de throttling sendo atingidos repetidamente.&lt;/P&gt;
&lt;H3 data-line="238"&gt;Captura de Eventos via Storage Queue&lt;/H3&gt;
&lt;P data-line="283"&gt;O APIM foi configurado para capturar eventos de abertura do Circuit Breaker e enviá-los para uma&amp;nbsp;&lt;STRONG&gt;Storage Queue&lt;/STRONG&gt;. Cada vez que um circuito abre, um evento é publicado com todos os detalhes relevantes.&lt;/P&gt;
&lt;P data-line="285"&gt;&lt;STRONG&gt;Observação:&lt;/STRONG&gt; Após essa configuração, a abertura do Circuit Breaker pode não aparecer mais no Trace, embora continue sendo registrada na fila.&lt;/P&gt;
&lt;img&gt;
&lt;P aria-live="polite"&gt;Criação da Event Subscription no Event Grid com os tipos "Circuit Breaker Opened" e "Circuit Breaker Closed" selecionados para capturar eventos de abertura e fechamento do circuito.&lt;/P&gt;
&lt;/img&gt;&lt;img&gt;Painel de Events do APIM mostrando 20 eventos publicados e entregues com sucesso à Storage Queue via subscription cbapim (Circuit Breaker Opened/Closed).&lt;/img&gt;
&lt;H3 data-line="244"&gt;Exemplo de Evento&lt;/H3&gt;
&lt;LI-CODE lang="json"&gt;{
    "id": "e5da5756-61b9-42cf-8097-f8a684f1b74c",
    "topic": "/subscriptions/.../resourceGroups/apimappgw/providers/Microsoft.ApiManagement/service/apimappgwws01",
    "subject": "/backends/openapi01-openai-endpoint/circuit-breaker/rules/cb01",
    "data": {
        "backendName": "openapi01-openai-endpoint",
        "circuitBreaker": {
            "rules": {
                "cb01": {
                    "tripDuration": "00:00:15"
                }
            }
        }
    },
    "eventType": "Microsoft.ApiManagement.CircuitBreaker.Opened",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "eventTime": "2025-08-14T15:41:30.948673Z"
}&lt;/LI-CODE&gt;
&lt;P&gt;O evento nos diz exatamente:&amp;nbsp;&lt;STRONG&gt;qual backend&lt;/STRONG&gt;&amp;nbsp;foi isolado (openapi01-openai-endpoint),&amp;nbsp;&lt;STRONG&gt;qual regra&lt;/STRONG&gt;&amp;nbsp;foi violada (cb01), e&amp;nbsp;&lt;STRONG&gt;por quanto tempo&lt;/STRONG&gt; o circuito ficará aberto (15 segundos).&lt;/P&gt;
&lt;H2 data-line="202"&gt;7. Export Events com Logic Apps → Elastic Observability&lt;/H2&gt;
&lt;P data-line="317"&gt;A Storage Queue resolve o problema de captura, mas para monitoramento em tempo real e dashboards operacionais, precisamos levar esses dados para uma plataforma de observabilidade. Neste caso, utilizamos o&amp;nbsp;&lt;STRONG&gt;Elastic Observability&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3 data-line="319"&gt;Fluxo de Integração&lt;/H3&gt;
&lt;P data-line="321"&gt;O pipeline completo funciona assim:&lt;/P&gt;
&lt;OL data-line="323"&gt;
&lt;LI data-line="334"&gt;&lt;STRONG&gt;Circuit Breaker abre&lt;/STRONG&gt;&amp;nbsp;→ evento é publicado na Storage Queue&lt;/LI&gt;
&lt;LI data-line="335"&gt;&lt;STRONG&gt;Logic App&lt;/STRONG&gt;&amp;nbsp;é acionado pelo trigger da fila&lt;/LI&gt;
&lt;LI data-line="336"&gt;Logic App recupera a&amp;nbsp;&lt;STRONG&gt;API Key&lt;/STRONG&gt;&amp;nbsp;no&amp;nbsp;&lt;STRONG&gt;Key Vault&lt;/STRONG&gt;&amp;nbsp;(via Managed Identity — sem segredos hardcoded)&lt;/LI&gt;
&lt;LI data-line="337"&gt;Logic App envia os dados via&amp;nbsp;&lt;STRONG&gt;HTTP POST&lt;/STRONG&gt; para o Elastic Observability&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H3 data-line="276"&gt;Exemplo de Chamada HTTP&lt;/H3&gt;
&lt;LI-CODE lang="http"&gt;POST https://apim-a5eaba.es.eastus.azure.elastic.cloud/apim/_doc
Content-Type: application/json
Authorization: ApiKey ...&lt;/LI-CODE&gt;
&lt;P data-line="284"&gt;&lt;STRONG&gt;Body:&lt;/STRONG&gt;&amp;nbsp;JSON do evento do Circuit Breaker.&lt;/P&gt;
&lt;H3 data-line="337"&gt;Configuração no Elastic&lt;/H3&gt;
&lt;P data-line="339"&gt;Para receber e visualizar os eventos, é necessário:&lt;/P&gt;
&lt;OL data-line="341"&gt;
&lt;LI data-line="352"&gt;&lt;STRONG&gt;Criar um índice&lt;/STRONG&gt;&amp;nbsp;(apim) para armazenar os documentos&lt;/LI&gt;
&lt;LI data-line="353"&gt;&lt;STRONG&gt;Criar uma API Key&lt;/STRONG&gt;&amp;nbsp;com permissão de escrita no índice&lt;/LI&gt;
&lt;LI data-line="354"&gt;&lt;STRONG&gt;Obter a URL do projeto&lt;/STRONG&gt;&amp;nbsp;Elastic Cloud&lt;/LI&gt;
&lt;LI data-line="355"&gt;&lt;STRONG&gt;Criar uma View/Dashboard&lt;/STRONG&gt;&amp;nbsp;para visualizar os eventos de abertura do Circuit Breaker&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-line="346"&gt;Com esse pipeline completo, a equipe de operações consegue responder rapidamente a perguntas como: "Quantas vezes o circuito abriu nas últimas 24 horas?", "Qual backend está mais instável?", "Os problemas coincidem com horários de pico?".&lt;/P&gt;
&lt;H2 data-line="350"&gt;Conclusão&lt;/H2&gt;
&lt;P data-line="352"&gt;A combinação de&amp;nbsp;&lt;STRONG&gt;Load Balancer + Circuit Breaker + Retry inteligente&lt;/STRONG&gt;&amp;nbsp;no APIM transforma uma arquitetura frágil em uma arquitetura resiliente — onde falhas em backends individuais são tratadas de forma transparente, sem impacto para o cliente.&lt;/P&gt;
&lt;P data-line="354"&gt;Os pontos-chave para levar:&lt;/P&gt;
&lt;OL data-line="356"&gt;
&lt;LI data-line="367"&gt;&lt;STRONG&gt;Nunca exponha um único endpoint&lt;/STRONG&gt;&amp;nbsp;de Azure OpenAI diretamente — use o APIM como abstração&lt;/LI&gt;
&lt;LI data-line="368"&gt;&lt;STRONG&gt;Managed Identity&lt;/STRONG&gt;&amp;nbsp;elimina o gerenciamento manual de segredos entre APIM e backends&lt;/LI&gt;
&lt;LI data-line="369"&gt;&lt;STRONG&gt;O&amp;nbsp;set-backend-service&amp;nbsp;deve estar dentro do&amp;nbsp;&amp;lt;retry&amp;gt;&lt;/STRONG&gt;&amp;nbsp;para que retentativas sejam distribuídas pelo Load Balancer&lt;/LI&gt;
&lt;LI data-line="370"&gt;&lt;STRONG&gt;Circuit Breaker protege contra falhas em cascata&lt;/STRONG&gt;&amp;nbsp;— fail-fast é melhor que timeout lento&lt;/LI&gt;
&lt;LI data-line="371"&gt;&lt;STRONG&gt;Observabilidade não é opcional&lt;/STRONG&gt; — se o circuito está abrindo, você precisa saber&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-line="229"&gt;Referências&lt;/H2&gt;
&lt;UL data-line="231"&gt;
&lt;LI data-line="231"&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/api-management/backends?tabs=portal" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/azure/api-management/backends?tabs=portal"&gt;Azure API Management backends | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="232"&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/api-management/backends?tabs=portal#circuit-breaker" target="_blank" rel="noopener"&gt;Azure API Management Backends | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="232"&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker" target="_blank" rel="noopener"&gt;Circuit Breaker Pattern - Azure Architecture Center | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 28 Apr 2026 20:46:40 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/apim-circuit-breaker-com-azure-openai/ba-p/4514008</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2026-04-28T20:46:40Z</dc:date>
    </item>
    <item>
      <title>Uso de contextos no Entra ID</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/uso-de-contextos-no-entra-id/ba-p/4513725</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-line="8"&gt;Visão Geral&lt;/H2&gt;
&lt;P data-line="10"&gt;Com a crescente necessidade de segurança adaptativa, o Microsoft Entra ID oferece recursos avançados para aplicar políticas dinâmicas de acesso. Em cenários corporativos, autenticação e autorização tradicionais, baseadas apenas em roles e claims estáticos, nem sempre são suficientes. Imagine que um usuário já está logado e possui permissão para acessar uma API, mas você precisa garantir que, para uma operação crítica como deletar um registro, ele esteja dentro da rede corporativa, em um dispositivo gerenciado ou tenha assinado um termo de confidencialidade. É exatamente isso que os&amp;nbsp;&lt;STRONG&gt;contextos de autenticação do Microsoft Entra ID&lt;/STRONG&gt;&amp;nbsp;resolvem.&lt;/P&gt;
&lt;P data-line="12"&gt;Neste artigo vou detalhar todo o processo, desde a habilitação do&amp;nbsp;&lt;STRONG&gt;Continuous Access Evaluation (CAE)&lt;/STRONG&gt;, passando pela configuração dos contextos e das políticas de acesso condicional no portal do Entra ID, até a integração prática com uma aplicação .NET dividida em&amp;nbsp;&lt;STRONG&gt;frontend web&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;API de backend&lt;/STRONG&gt;. No código, veremos como o MSAL intercepta o fluxo, verifica se o token contém a claim&amp;nbsp;acrs&amp;nbsp;com o contexto exigido e, caso não contenha, dispara um&amp;nbsp;&lt;STRONG&gt;challenge&lt;/STRONG&gt;&amp;nbsp;que leva o usuário de volta ao Entra ID para cumprir o requisito adicional. Se o contexto já estiver satisfeito, o fluxo é transparente para o usuário.&lt;/P&gt;
&lt;P data-line="14"&gt;O objetivo é destacar a granularidade no controle de acesso, a estrutura de contexto, os desafios de implementação e potenciais aplicações práticas.&lt;/P&gt;
&lt;H2 data-line="210"&gt;Diagrama de Arquitetura&lt;/H2&gt;
&lt;img /&gt;
&lt;H2 data-line="18"&gt;1. Caso de Uso&lt;/H2&gt;
&lt;P data-line="63"&gt;Para exemplificar, utilizamos uma aplicação&amp;nbsp;&lt;STRONG&gt;.NET&lt;/STRONG&gt;&amp;nbsp;simples, dividida em dois componentes:&lt;/P&gt;
&lt;UL data-line="65"&gt;
&lt;LI data-line="65"&gt;&lt;STRONG&gt;API de backend&lt;/STRONG&gt;, que expõe endpoints protegidos&lt;/LI&gt;
&lt;LI data-line="66"&gt;&lt;STRONG&gt;Aplicação web frontend&lt;/STRONG&gt;, que consome a API via tokens&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-line="25"&gt;Fluxo Básico&lt;/H3&gt;
&lt;OL data-line="70"&gt;
&lt;LI data-line="70"&gt;A aplicação web é protegida pelo&amp;nbsp;&lt;STRONG&gt;Entra ID&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-line="71"&gt;Ao iniciar, o&amp;nbsp;&lt;STRONG&gt;MSAL&lt;/STRONG&gt;&amp;nbsp;(SDK de identidade da Microsoft) verifica se o usuário está autenticado&lt;/LI&gt;
&lt;LI data-line="72"&gt;Se não estiver, solicita a autenticação&lt;/LI&gt;
&lt;LI data-line="73"&gt;Após autenticado, a aplicação armazena um&amp;nbsp;&lt;STRONG&gt;token&lt;/STRONG&gt;&amp;nbsp;para consumir a API&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 data-line="32"&gt;O Diferencial&lt;/H3&gt;
&lt;P data-line="77"&gt;&lt;STRONG&gt;Não basta um token de acesso convencional&lt;/STRONG&gt;&amp;nbsp;para consumir um endpoint específico da API. É necessário um token com uma&amp;nbsp;&lt;STRONG&gt;claim especial&lt;/STRONG&gt;&amp;nbsp;(acrs), contendo exatamente o valor do&amp;nbsp;&lt;STRONG&gt;contexto esperado&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H2 data-line="38"&gt;2. Configuração do Entra ID&lt;/H2&gt;
&lt;H3 data-line="40"&gt;App Registration e Contextos&lt;/H3&gt;
&lt;P data-line="85"&gt;O processo inicia com o registro das aplicações (cliente e API) no Entra ID, mantendo as etapas tradicionais de permissionamento e definição de escopos.&lt;/P&gt;
&lt;P data-line="87"&gt;A novidade está na&amp;nbsp;&lt;STRONG&gt;configuração de contextos&lt;/STRONG&gt;, que são pares chave-valor criados no Entra ID e utilizados em políticas de acesso condicional.&lt;/P&gt;
&lt;P data-line="89"&gt;&lt;STRONG&gt;Pré-requisito:&lt;/STRONG&gt;&amp;nbsp;Licença&amp;nbsp;&lt;STRONG&gt;Entra ID P1&lt;/STRONG&gt;&amp;nbsp;para uso de acesso condicional.&lt;/P&gt;
&lt;P data-line="91"&gt;O contexto é configurado em uma aba específica dentro das&amp;nbsp;&lt;STRONG&gt;políticas de acesso condicional&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ao criar um novo contexto, define-se o nome, descrição e o ID sequencial (ex:&amp;nbsp;c1). O checkbox&amp;nbsp;&lt;STRONG&gt;"Publish to apps"&lt;/STRONG&gt; torna o contexto disponível para as aplicações consumirem:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-line="50"&gt;Estrutura e Limitações dos Contextos&lt;/H3&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspecto&lt;/th&gt;&lt;th&gt;Detalhe&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Identificação&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Número sequencial (ex:&amp;nbsp;c1,&amp;nbsp;c2, até&amp;nbsp;c99)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Limite&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Vinculado ao número máximo de regras de acesso condicional (&lt;STRONG&gt;195&lt;/STRONG&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Composição&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Nome + Descrição&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Utilidade&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Depende da implementação na aplicação&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3 data-line="59"&gt;Aplicação Prática dos Contextos&lt;/H3&gt;
&lt;P data-line="104"&gt;O contexto permite&amp;nbsp;&lt;STRONG&gt;granularidade adicional&lt;/STRONG&gt;&amp;nbsp;além das tradicionais roles e claims do token JWT:&lt;/P&gt;
&lt;UL data-line="106"&gt;
&lt;LI data-line="106"&gt;&lt;STRONG&gt;Rede corporativa&lt;/STRONG&gt;: restringir acesso a uma área apenas para usuários dentro da rede interna&lt;/LI&gt;
&lt;LI data-line="107"&gt;&lt;STRONG&gt;Dispositivos gerenciados&lt;/STRONG&gt;: exigir que o dispositivo esteja em compliance&lt;/LI&gt;
&lt;LI data-line="108"&gt;&lt;STRONG&gt;Assinatura de termos&lt;/STRONG&gt;: exigir ações adicionais (ex: NDA) antes do acesso a dados sensíveis, mesmo que o token permita o acesso&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Por fim, o contexto é vinculado a uma&amp;nbsp;&lt;STRONG&gt;política de acesso condicional&lt;/STRONG&gt;. No exemplo abaixo, a policy "Teste - C10" associa o contexto "Teste WebApp" como target resource:&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="69"&gt;3. Implementação no Código&lt;/H2&gt;
&lt;H3 data-line="71"&gt;3.1 Configuração no Cliente (Startup.cs)&lt;/H3&gt;
&lt;P data-line="116"&gt;No processo de inicialização, utiliza-se o método&amp;nbsp;AddMicrosoftIdentityWebAppAuthentication&amp;nbsp;para configurar a autenticação, incluindo o parâmetro&amp;nbsp;&lt;STRONG&gt;ClientCapabilities&lt;/STRONG&gt;, que habilita o uso de contexto.&lt;/P&gt;
&lt;P data-line="118"&gt;Além disso, é adicionado o handler&amp;nbsp;MicrosoftIdentityConsentAndConditionalAccessHandler&amp;nbsp;para gerenciar o fluxo de acesso condicional.&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;// Habilita autenticação com suporte a contexto e acesso condicional
services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi(
        Configuration.GetSection("TodoList:Scopes").Get&amp;lt;string[]&amp;gt;()
    )
    .AddInMemoryTokenCaches();

// Handler para gerenciar challenge de acesso condicional
services.AddScoped&amp;lt;MicrosoftIdentityConsentAndConditionalAccessHandler&amp;gt;();&lt;/LI-CODE&gt;
&lt;H3 data-line="89"&gt;3.2 Configuração (appsettings.json)&lt;/H3&gt;
&lt;P data-line="134"&gt;O ponto-chave é o&amp;nbsp;&lt;STRONG&gt;ClientCapabilities: ["cp1"]&lt;/STRONG&gt;, que habilita o suporte a Continuous Access Evaluation:&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "cyber.meudominio.com.br",
    "TenantId": "...-8888-4400-8c9c-...",
    "ClientId": "...-e635-...-bb9f-...",
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-oidc",
    "ClientCapabilities": [ "cp1" ],
    "ClientSecret": "XHm8Q~6_rNy_ib-....~KbcvF"
  }
}&lt;/LI-CODE&gt;
&lt;P data-line="151"&gt;A classe&amp;nbsp;Configuration, passada para&amp;nbsp;AddMicrosoftIdentityWebAppAuthentication, localiza e carrega automaticamente a seção&amp;nbsp;AzureAd&amp;nbsp;do arquivo de configuração.&lt;/P&gt;
&lt;H3 data-line="110"&gt;3.3 Método Crítico: Validação do Contexto&lt;/H3&gt;
&lt;P data-line="155"&gt;No endpoint crítico (ex: deletar item), o código verifica se o token do usuário contém a claim&amp;nbsp;acrs&amp;nbsp;com o valor do contexto exigido:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;// GET: TodoList/Delete/5
public async Task&amp;lt;ActionResult&amp;gt; DeleteItem(int id)
{
    string requiredAuthContextId = "c10";
    string acrsClaimType = "acrs";

    // Construção do claimsChallenge
    var claimsChallengeObj = new
    {
        id_token = new
        {
            acrs = new
            {
                essential = true,
                value = requiredAuthContextId
            }
        }
    };
    string claimsChallenge = System.Text.Json.JsonSerializer.Serialize(claimsChallengeObj);

    // Verifica se o usuário possui o claim necessário
    Claim acrsClaim = User.FindAll(acrsClaimType)
        .FirstOrDefault(x =&amp;gt; x.Value == requiredAuthContextId);

    if (acrsClaim?.Value != requiredAuthContextId)
    {
        // Dispara challenge para cumprir o contexto exigido
        _consentHandler.ChallengeUser(
            new[]
            {
                "api://ce845259-3c67-43c1-9816-43f82f4d7704/ToDoList.Read",
                "api://ce845259-3c67-43c1-9816-43f82f4d7704/ToDoList.ReadWrite"
            },
            claimsChallenge
        );
    }

    try
    {
        var todo = await _downstreamApi.GetForUserAsync&amp;lt;Todo&amp;gt;(
            "TodoList",
            options =&amp;gt; options.RelativePath = $"api/todolist/{id}");

        if (todo == null) return NotFound();
        return View(todo);
    }
    catch (Exception)
    {
        return RedirectToAction("Index");
    }
}&lt;/LI-CODE&gt;
&lt;H3 data-line="168"&gt;Lógica do Fluxo&lt;/H3&gt;
&lt;OL data-line="213"&gt;
&lt;LI data-line="213"&gt;&lt;STRONG&gt;Claim presente e válida&lt;/STRONG&gt;: a operação é permitida normalmente&lt;/LI&gt;
&lt;LI data-line="214"&gt;&lt;STRONG&gt;Claim ausente&lt;/STRONG&gt;: o&amp;nbsp;&lt;STRONG&gt;ChallengeUser()&lt;/STRONG&gt;&amp;nbsp;abre a tela do Entra ID para o usuário cumprir o requisito (ex: MFA, assinatura de termo)&lt;/LI&gt;
&lt;LI data-line="215"&gt;&lt;STRONG&gt;Contexto já satisfeito&lt;/STRONG&gt;: o fluxo é transparente para o usuário&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-line="176"&gt;4. Fluxo de Challenge e Resposta&lt;/H2&gt;
&lt;H3 data-line="178"&gt;Do lado da API (Backend)&lt;/H3&gt;
&lt;P data-line="223"&gt;Quando o contexto&amp;nbsp;&lt;STRONG&gt;não é atendido&lt;/STRONG&gt;, a API retorna:&lt;/P&gt;
&lt;UL data-line="225"&gt;
&lt;LI data-line="225"&gt;&lt;STRONG&gt;401 Unauthorized&lt;/STRONG&gt;&amp;nbsp;com headers customizados&lt;/LI&gt;
&lt;LI data-line="226"&gt;Informações sobre o contexto exigido no corpo/headers da resposta&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-line="185"&gt;Do lado do Cliente (Frontend)&lt;/H3&gt;
&lt;OL data-line="230"&gt;
&lt;LI data-line="230"&gt;O cliente captura exceções específicas (WebApiMsalUiRequiredException)&lt;/LI&gt;
&lt;LI data-line="231"&gt;Extrai informações do header da resposta&lt;/LI&gt;
&lt;LI data-line="232"&gt;Executa o fluxo de challenge conforme necessário&lt;/LI&gt;
&lt;LI data-line="233"&gt;Após cumprido o requisito, o token é renovado com a claim&amp;nbsp;acrs&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-line="194"&gt;5. Considerações Finais&lt;/H2&gt;
&lt;UL data-line="239"&gt;
&lt;LI data-line="239"&gt;O uso de contextos no Entra ID&amp;nbsp;&lt;STRONG&gt;amplia as possibilidades&lt;/STRONG&gt;&amp;nbsp;de controle de acesso, permitindo requisitos dinâmicos e contextuais além das roles tradicionais&lt;/LI&gt;
&lt;LI data-line="240"&gt;A implementação exige&amp;nbsp;&lt;STRONG&gt;integração cuidadosa&lt;/STRONG&gt;&amp;nbsp;entre backend e frontend, além de testes para garantir o correto tratamento dos fluxos de challenge e resposta&lt;/LI&gt;
&lt;LI data-line="241"&gt;A&amp;nbsp;&lt;STRONG&gt;documentação limitada&lt;/STRONG&gt;&amp;nbsp;reforça a importância de compartilhar experiências e boas práticas para fomentar o uso do recurso&lt;/LI&gt;
&lt;LI data-line="242"&gt;Requer&amp;nbsp;&lt;STRONG&gt;licença Entra ID P1&lt;/STRONG&gt;&amp;nbsp;para acesso condicional&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="203"&gt;Referências&lt;/H2&gt;
&lt;UL data-line="248"&gt;
&lt;LI data-line="248"&gt;&lt;A href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-continuous-access-evaluation" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-continuous-access-evaluation"&gt;Continuous Access Evaluation in Microsoft Entra - Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="249"&gt;&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview"&gt;Visão geral da plataforma de identidade da Microsoft - Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 23 Apr 2026 12:53:59 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/uso-de-contextos-no-entra-id/ba-p/4513725</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2026-04-23T12:53:59Z</dc:date>
    </item>
    <item>
      <title>Anonimização de Dados Sensíveis com a plataforma de IA do Azure</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anonimiza%C3%A7%C3%A3o-de-dados-sens%C3%ADveis-com-a-plataforma-de-ia-do-azure/ba-p/4481313</link>
      <description>&lt;P&gt;A&amp;nbsp;&lt;A href="https://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm" target="_blank" rel="noopener"&gt;Lei Geral de Proteção de Dados (LGPD)&lt;/A&gt; estabelece padrões rigorosos para o tratamento de dados pessoais e sensíveis no Brasil. Dados pessoais incluem informações que identificam diretamente um indivíduo, como nome, endereço, telefone, CPF, RG e data de nascimento. Já os dados sensíveis abrangem categorias especiais, como origem racial ou étnica, crenças religiosas, opiniões políticas, dados de saúde ou genéticos, biometria, orientação sexual e filiação sindical. Esses dados exigem cuidados adicionais, pois impactam diretamente a privacidade e os direitos dos titulares.&lt;/P&gt;
&lt;P&gt;No contexto do processamento e compartilhamento de documentos — especialmente em setores como o público e o médico — é essencial reconhecer e classificar corretamente esses tipos de dados. Documentos oficiais ou registros de saúde frequentemente contêm tanto informações pessoais quanto dados altamente sensíveis, tornando a anonimização uma necessidade prática além de uma exigência legal.&lt;/P&gt;
&lt;H2 id="proposta-de-arquitetura"&gt;Proposta de Arquitetura&lt;/H2&gt;
&lt;P&gt;Para atender à demanda de anonimização de dados sensíveis em documentos, soluções modernas de inteligência artificial, como Azure Document Intelligence e Azure Language Service, oferecem capacidade para detectar e classificar automaticamente informações pessoais. Esses serviços aceleram o processo de proteção de dados, mas seus modelos genéricos podem não abranger totalmente todas as categorias previstas pela LGPD — especialmente aquelas mais complexas ou dependentes de contexto, como opiniões políticas, crenças religiosas ou informações específicas de saúde.&lt;/P&gt;
&lt;P&gt;Um caso simbólico pode ilustrar esse cenário: imagine uma plataforma responsável pelo armazenamento e compartilhamento de documentos administrativos. Para garantir que conteúdos sensíveis possam ser divulgados sem violar a privacidade das pessoas citadas, é possível implementar uma solução de anonimização baseada em IA. Ao utilizar modelos genéricos dos serviços de linguagem do Azure, conseguimos cobrir aproximadamente metade das classes previstas na LGPD, mas essas já abrangem a maior parte das classes determinísticas da legislação.&lt;/P&gt;
&lt;P&gt;Abaixo, a arquitetura sugerida é detalhada de forma segmentada:&lt;/P&gt;
&lt;img /&gt;
&lt;H3 id="-azure-document-intelligence-https-learn-microsoft-com-azure-ai-services-document-intelligence-"&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/document-intelligence/" target="_blank" rel="noopener"&gt;Azure Document Intelligence&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;O Azure Document Intelligence compõe a primeira camada do processamento, responsável por extrair texto, estrutura e coordenadas dos elementos presentes nos documentos — como tabelas, formulários, assinaturas e marcações visuais. Essa leitura estrutural permite compreender não apenas o que está escrito, mas onde cada informação se encontra.&lt;/P&gt;
&lt;P&gt;A escolha por esse serviço se deve à sua capacidade de fornecer OCR avançado, interpretar layouts complexos e identificar elementos adicionais, como códigos de barras e QR Codes, que muitas vezes carregam metadados sensíveis. Esse mapeamento preciso é essencial para aplicar anonimização diretamente nas regiões corretas, preservando a integridade visual do documento.&lt;/P&gt;
&lt;H3 id="-azure-language-service-pii-e-classifica-o-https-learn-microsoft-com-azure-ai-services-language-service-"&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/language-service/" target="_blank" rel="noopener"&gt;Azure Language Service — PII e Classificação&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Nesta segunda etapa, o Azure Language Service é utilizado para identificar automaticamente informações pessoalmente identificáveis (PII), como nomes, endereços, dados de contato e números de documentos. O modelo analisa o conteúdo com foco semântico, classificando entidades conforme categorias previstas na LGPD.&lt;/P&gt;
&lt;P&gt;A motivação para empregá-lo está em sua capacidade de fornecer uma base abrangente e pronta para uso, permitindo detectar rapidamente grande parte dos dados sensíveis encontrados em documentos reais. Isso reduz a necessidade de regras manuais e acelera o processo de anonimização.&lt;/P&gt;
&lt;H3 id="-azure-language-service-modelos-personalizados-custom-ner-https-learn-microsoft-com-azure-ai-services-language-service-named-entity-recognition-"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/ai-services/language-service/named-entity-recognition/overview" target="_blank" rel="noopener"&gt;Azure Language Service — Modelos Personalizados (Custom NER)&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Embora os modelos genéricos atendam a boa parte dos cenários, documentos reais costumam conter entidades específicas do domínio — expressões próprias da instituição, cargos incomuns, nomes de sistemas internos, termos de contexto ou siglas não previstas pelo modelo padrão.&lt;/P&gt;
&lt;P&gt;Para suprir essas lacunas, são usados modelos personalizados de Reconhecimento de Entidades Nomeadas (NER). Eles permitem treinar novas categorias sensíveis e adaptar o processamento à realidade da organização. A motivação principal é reduzir falsos positivos/negativos e garantir maior precisão nos casos de uso mais complexos.&lt;/P&gt;
&lt;H3 id="-azure-computer-vision-https-learn-microsoft-com-azure-cognitive-services-computer-vision-"&gt;&lt;A href="https://learn.microsoft.com/azure/cognitive-services/computer-vision/" target="_blank" rel="noopener"&gt;Azure Computer Vision&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Quando documentos incluem imagens, fotografias ou capturas de telas, a anonimização precisa ir além do texto. O Azure Computer Vision é utilizado para detectar rostos e outras características visuais que possam identificar indivíduos.&lt;/P&gt;
&lt;P&gt;Sua inclusão no processamento permite aplicar desfocagem ou mascaramento diretamente nos elementos encontrados, garantindo proteção também em conteúdo multimídia. Isso se torna especialmente relevante em documentos digitalizados que podem conter retratos, crachás, assinaturas digitalizadas ou imagens que exponham a identidade de terceiros.&lt;/P&gt;
&lt;H3 id="orchestrator-python-l-gica-de-anonimiza-o-baseada-em-coordenadas"&gt;Orchestrator Python — Lógica de Anonimização Baseada em Coordenadas&lt;/H3&gt;
&lt;P&gt;A última camada da solução é desenvolvida em Python, responsável por orquestrar os serviços de IA e aplicar a anonimização final no documento. Com base nas coordenadas extraídas pelo Document Intelligence e nas entidades classificadas pelo Language Service, o componente Redaction realiza o mascaramento diretamente sobre a área correspondente.&lt;/P&gt;
&lt;P&gt;A escolha pelo Python se justifica pela sua flexibilidade, ampla disponibilidade de bibliotecas para manipulação de PDFs e imagens, e facilidade para integrar diferentes serviços do Azure em um único fluxo. Além disso, permite criar filtros adicionais — como evitar mascarar nomes de organizações ou estruturas fixas — garantindo precisão e consistência no resultado final.&lt;/P&gt;
&lt;H2 id="recomenda-es"&gt;Recomendações&lt;/H2&gt;
&lt;P&gt;Veja o repositório de uma demonstração simplificada com arquivos fictícios: &lt;A href="https://github.com/anaritakrs/document-anonymization" target="_blank" rel="noopener"&gt;Repo&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Se você deseja implantar essa solução, pode utilizar o código disponível no repositório e adaptá-lo aos seus filtros e regras específicas. A estratégia recomendada é empacotar a aplicação em contêineres para facilitar a escalabilidade e a integração com diferentes ambientes.&lt;/P&gt;
&lt;P&gt;Além disso, é possível consumir os serviços do Azure diretamente via APIs, garantindo flexibilidade na arquitetura e integração com outras aplicações. Todas essas informações, incluindo exemplos e orientações detalhadas, estão disponíveis na documentação oficial dos serviços Azure.&lt;/P&gt;
&lt;P&gt;Essa abordagem integrada garante que documentos públicos possam ser compartilhados de forma segura, respeitando a legislação e protegendo a privacidade das pessoas. A evolução para modelos personalizados representa um salto importante, permitindo identificar e anonimizar dados que hoje passam despercebidos pelos modelos padrão, elevando o nível de conformidade e confiança no tratamento de dados sensíveis.&lt;/P&gt;
&lt;H2 id="agradecimentos"&gt;Agradecimentos&lt;/H2&gt;
&lt;P&gt;Agradeço especialmente ao Gilberto Santos, meu colega Cloud Solution Architect &lt;A href="https://www.linkedin.com/in/gilbertossoares/" target="_blank" rel="noopener"&gt;Linkedin&lt;/A&gt;, pela generosidade em compartilhar sua expertise sobre os serviços do Azure e pelo apoio essencial no desenvolvimento desta arquitetura.&lt;/P&gt;
&lt;P&gt;Também registro meu agradecimento ao Alexandre Teoi, Cloud Solution Architect &lt;A href="https://www.linkedin.com/in/ateoi/" target="_blank" rel="noopener"&gt;Linkedin&lt;/A&gt;, pela revisão criteriosa e pelas contribuições valiosas para o aprimoramento deste artigo.&lt;/P&gt;</description>
      <pubDate>Fri, 26 Dec 2025 17:51:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anonimiza%C3%A7%C3%A3o-de-dados-sens%C3%ADveis-com-a-plataforma-de-ia-do-azure/ba-p/4481313</guid>
      <dc:creator>anaritak</dc:creator>
      <dc:date>2025-12-26T17:51:22Z</dc:date>
    </item>
    <item>
      <title>Alta Disponibilidade e Resiliência com App Gateway e Múltiplos APIMs: Uma Arquitetura Estratégica</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/alta-disponibilidade-e-resili%C3%AAncia-com-app-gateway-e-m%C3%BAltiplos/ba-p/4451312</link>
      <description>&lt;H2 data-selectable-paragraph=""&gt;Resiliência como Pilar do Azure Well-Architected Framework&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A&amp;nbsp;&lt;STRONG&gt;resiliência&lt;/STRONG&gt;&amp;nbsp;é um dos pilares fundamentais do&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/framework/" target="_blank" rel="noopener"&gt;WAF&lt;/A&gt;&amp;nbsp;e desempenha papel crítico na construção de arquiteturas modernas em nuvem. Este artigo explora o design de&amp;nbsp;&lt;STRONG&gt;alta disponibilidade (HA)&lt;/STRONG&gt;&amp;nbsp;utilizando a oferta&amp;nbsp;&lt;STRONG&gt;Premium Tier do Azure API Management (APIM)&lt;/STRONG&gt;&amp;nbsp;em cenários&amp;nbsp;&lt;STRONG&gt;multi-região&lt;/STRONG&gt;&amp;nbsp;ou mesmo&amp;nbsp;&lt;STRONG&gt;intra-região&lt;/STRONG&gt;, com foco na aplicação de&amp;nbsp;&lt;STRONG&gt;Availability Zones&lt;/STRONG&gt;&amp;nbsp;— uma prática recomendada no&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/principles" target="_blank" rel="noopener"&gt;pilar de Confiabilidade&lt;/A&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A configuração Premium permite que as regiões primária e secundária compartilhem a mesma instância de APIM. No entanto, dependendo dos requisitos de negócio e tolerância a falhas, pode ser estratégico operar com&amp;nbsp;&lt;STRONG&gt;duas instâncias separadas&lt;/STRONG&gt;, garantindo&amp;nbsp;&lt;STRONG&gt;continuidade de serviço mesmo diante de falhas regionais ou em uma das instâncias&lt;/STRONG&gt;. Essa abordagem está alinhada ao modelo de&amp;nbsp;&lt;STRONG&gt;DR Ativo-Ativo&lt;/STRONG&gt;, promovendo&amp;nbsp;&lt;STRONG&gt;tolerância a falhas&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;escalabilidade horizontal&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;resiliência operacional&lt;/STRONG&gt;, conforme descrito no&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/maturity-model" target="_blank" rel="noopener"&gt;modelo de maturidade de confiabilidade&lt;/A&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A imagem acima representa os componentes do APIM nas regiões primária e secundária. Em cenários com instâncias separadas, esses componentes também estariam presentes em cada região. Já em uma configuração com Availability Zones, os elementos podem escalar dentro da mesma região, conforme a demanda — prática que também se conecta ao pilar de&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/" target="_blank" rel="noopener"&gt;excelência operacional&lt;/A&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/overview," target="_blank" rel="noopener"&gt;,&lt;/A&gt;&amp;nbsp;ao permitir automação e monitoramento contínuo.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O fluxo de comunicação entre a API e os serviços de backend pode ocorrer por rotas diretas ou por meio de&amp;nbsp;&lt;STRONG&gt;balanceadores de carga&lt;/STRONG&gt;, dependendo do caso de uso. Essa arquitetura inspirou uma&amp;nbsp;&lt;STRONG&gt;solução personalizada&lt;/STRONG&gt;&amp;nbsp;para um de nossos clientes, que buscava&amp;nbsp;&lt;STRONG&gt;alta disponibilidade com baixa latência&lt;/STRONG&gt;, mesmo em cenários de falha regional.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Configuração do APIM como gateway de saída para o cluster de aplicações&lt;/H3&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-selectable-paragraph=""&gt;Em alguns casos, por questões de compliance, não é possível operar fora de um regions específica . Ainda assim, essa arquitetura já proporciona ganhos significativos mesmo dentro da mesma região, como maior resiliência, escalabilidade e eficiência operacional.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Visão Geral da Arquitetura&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Componentes principais:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Usuário&lt;/STRONG&gt;: Inicia a requisição.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;WAF&lt;/STRONG&gt;: Protege contra ameaças e ataques na borda.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;AKS&lt;/STRONG&gt;: Gerencia APIs e aplicações containerizadas.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;App Gateway (AppGW)&lt;/STRONG&gt;: Roteia o tráfego para os APIMs.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;APIM001 e APIM002&lt;/STRONG&gt;: Instâncias do Azure API Management, com IPs distintos e potencialmente em regiões diferentes.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Sistemas legados (kubernets / VMS)&lt;/STRONG&gt;: Integração com sistemas on-premises.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa arquitetura é interessante, pois, neste caso de uso, o APIM atua como ponto de saída do cluster de aplicações — exatamente o caminho crítico que queremos proteger&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Com duas instâncias de APIM atrás do AppGW, é possível:&lt;/H3&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Realizar&amp;nbsp;&lt;STRONG&gt;manutenções planejadas&lt;/STRONG&gt;&amp;nbsp;em uma instância sem impactar os usuários.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Redirecionar o tráfego automaticamente para a instância saudável.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Garantir&amp;nbsp;&lt;STRONG&gt;zero downtime&lt;/STRONG&gt;, mesmo durante atualizações críticas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa abordagem é especialmente útil em ambientes com alta exigência de SLA, como bancos, governo e telecom.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Testes Blue-Green com Segurança e Controle&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A arquitetura permite implementar&amp;nbsp;&lt;STRONG&gt;estratégias Blue-Green&lt;/STRONG&gt;&amp;nbsp;com facilidade:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Uma instância do APIM pode representar o ambiente “Blue” (produção atual).&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;A outra instância representa o ambiente “Green” (nova versão).&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;O AppGW pode direcionar parte do tráfego para o ambiente Green para testes controlados.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após validação, o tráfego pode ser totalmente migrado para o Green, promovendo a nova versão com segurança.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Isso reduz riscos de regressão e permite&amp;nbsp;&lt;STRONG&gt;deploys mais confiáveis&lt;/STRONG&gt;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Redução de Riscos em Caminhos Críticos&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Ao distribuir o tráfego entre dois APIMs:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Reduz-se o risco de&amp;nbsp;&lt;STRONG&gt;ponto único de falha&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;A arquitetura se torna mais resiliente a falhas regionais ou de serviço.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em caso de falha de uma instância, o AppGW garante continuidade do serviço.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa redundância é essencial para&amp;nbsp;&lt;STRONG&gt;caminhos críticos de negócio&lt;/STRONG&gt;, como autenticação, transações financeiras ou integrações com sistemas legados.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Outros Benefícios Estratégicos&lt;/H2&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Disaster Recovery Ativo-Ativo&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;As duas instâncias do APIM funcionam simultaneamente em modo &lt;STRONG data-start="225" data-end="240"&gt;ativo-ativo&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em caso de falha em uma das instâncias, o tráfego é &lt;STRONG data-start="298" data-end="331"&gt;automaticamente redirecionado&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Reduz significativamente o &lt;STRONG data-start="364" data-end="371"&gt;RTO&lt;/STRONG&gt; e assegura a &lt;STRONG data-start="385" data-end="414"&gt;continuidade dos serviços&lt;/STRONG&gt;..&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Mitigação de Esgotamento de IPs&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;O uso de múltiplas instâncias permite &lt;STRONG data-start="504" data-end="535"&gt;distribuir o consumo de IPs&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Evita &lt;STRONG data-start="547" data-end="567"&gt;gargalos de rede&lt;/STRONG&gt; e problemas de &lt;STRONG data-start="583" data-end="608"&gt;limitação de recursos&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Escalabilidade Regional&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;A arquitetura possibilita &lt;STRONG data-start="678" data-end="720"&gt;escalabilidade horizontal simplificada&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Suporta o crescimento de demanda em &lt;STRONG data-start="762" data-end="784"&gt;diferentes regiões&lt;/STRONG&gt; de forma eficiente.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Como configurar o APPGW para uma POC de balanceamento entre dois APIMs&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;O&amp;nbsp;&lt;STRONG&gt;Azure Application Gateway&lt;/STRONG&gt;&amp;nbsp;é um balanceador de carga de&amp;nbsp;&lt;STRONG&gt;camada 7 (HTTP/HTTPS)&lt;/STRONG&gt;&amp;nbsp;que permite gerenciar o tráfego de aplicações web com&amp;nbsp;&lt;STRONG&gt;inteligência, segurança e escalabilidade&lt;/STRONG&gt;. Ele opera com base em um conjunto de configurações como Listeners, Routing Rules, Backend Targets entre outras.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Além disso, o Application Gateway oferece recursos avançados como&amp;nbsp;&lt;STRONG&gt;WAF (Web Application Firewall)&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;SSL offloading&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;redirecionamento baseado em caminho&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;afinidade de sessão&lt;/STRONG&gt;, tornando-o ideal para cenários que exigem alta disponibilidade e proteção contra ameaças web.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;📦 Descrição de cada componente do diagrama&lt;/H2&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Listener (porta 80):&lt;/STRONG&gt;&amp;nbsp;Detecta conexões de entrada na porta especificada (ex: 80 para HTTP). É o ponto inicial onde o tráfego chega ao gateway.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Routing Rule:&lt;/STRONG&gt;&amp;nbsp;Define como o tráfego será roteado com base em critérios como URL, cabeçalhos ou métodos. É o cérebro da decisão de encaminhamento.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Targets:&lt;/STRONG&gt;&amp;nbsp;Especifica os destinos finais para o tráfego, como VMs, instâncias de App Service ou containers. 🔁 Relação com Backend Pools:&amp;nbsp;&lt;STRONG&gt;1 para N&lt;/STRONG&gt;&amp;nbsp;— uma regra pode apontar para vários destinos.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Setting:&lt;/STRONG&gt;&amp;nbsp;Configurações aplicadas ao tráfego, como tempo de timeout, protocolo (HTTP/HTTPS), e afinidade de sessão. 🔁 Relação com Health Probes:&amp;nbsp;&lt;STRONG&gt;1 para 1&lt;/STRONG&gt;&amp;nbsp;— cada configuração tem uma sonda associada.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Pools:&lt;/STRONG&gt;&amp;nbsp;Agrupamento lógico dos destinos (targets). Permite distribuir carga entre múltiplas instâncias. 🔁 Relação com Backend Targets:&amp;nbsp;&lt;STRONG&gt;1 para N&lt;/STRONG&gt;&amp;nbsp;— um pool pode conter vários destinos.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Health Probes (path:/status-0123456789abcdef)&lt;/STRONG&gt;&lt;BR /&gt;Verifica a saúde dos destinos usando um caminho específico. Se um destino estiver inativo, ele é automaticamente removido do balanceador.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 data-selectable-paragraph=""&gt;Vamos apresentar algumas telas de configuração e destacar pontos de atenção no&amp;nbsp;&lt;STRONG&gt;Application Gateway (AppGW)&lt;/STRONG&gt;.&lt;/H3&gt;
&lt;P data-selectable-paragraph=""&gt;Um detalhe importante que acabei não mencionando:&amp;nbsp;&lt;STRONG&gt;à frente do Listener existe uma configuração de Frontend IP&lt;/STRONG&gt;, que define se o IP do AppGW será&amp;nbsp;&lt;STRONG&gt;público ou privado&lt;/STRONG&gt;. Para facilitar os testes iniciais, recomendo começar com o&amp;nbsp;&lt;STRONG&gt;Frontend IP público&lt;/STRONG&gt;,alem disso mantenha o Listener configurado na porta 80. Isso evita complicações com certificados SSL durante os testes.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Observe a imagem abaixo:&lt;/STRONG&gt;&amp;nbsp;o&amp;nbsp;&lt;STRONG&gt;Frontend IP&lt;/STRONG&gt;&amp;nbsp;está corretamente vinculado ao&amp;nbsp;&lt;STRONG&gt;Listener1&lt;/STRONG&gt;, como indicado. Essa associação é essencial para garantir que o tráfego seja direcionado corretamente, conforme a configuração do IP público ou privado definida no Frontend.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O&amp;nbsp;&lt;STRONG&gt;Listener1&lt;/STRONG&gt;, configurado na&amp;nbsp;&lt;STRONG&gt;porta 80&lt;/STRONG&gt;, está associado à&amp;nbsp;&lt;STRONG&gt;Rule1&lt;/STRONG&gt;, que define como o tráfego será roteado para o backend correspondente.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A&amp;nbsp;&lt;STRONG&gt;Rule1&lt;/STRONG&gt;&amp;nbsp;está associada às configurações de&amp;nbsp;&lt;STRONG&gt;Backend Settings&lt;/STRONG&gt;, que definem como o tráfego será encaminhado para os recursos de backend — incluindo o pool de servidores, o protocolo, a porta e os critérios de saúde.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;As&amp;nbsp;&lt;STRONG&gt;Backend Settings&lt;/STRONG&gt;&amp;nbsp;do Application Gateway incluem configurações importantes, como&amp;nbsp;&lt;STRONG&gt;“Pick host name from backend target”&lt;/STRONG&gt;&amp;nbsp;e a associação a um&amp;nbsp;&lt;STRONG&gt;Custom Probe&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Por padrão, o AppGW encaminha ao backend o mesmo cabeçalho HTTP&amp;nbsp;Host&amp;nbsp;recebido do cliente. No entanto, se o serviço ou aplicação no backend exigir um valor específico para o cabeçalho&amp;nbsp;Host, é possível sobrescrevê-lo utilizando essa configuração. Com isso, o Application Gateway passa a usar o&amp;nbsp;&lt;STRONG&gt;host do backend&lt;/STRONG&gt;&amp;nbsp;para resolver o balanceamento e validar o&amp;nbsp;&lt;STRONG&gt;probe de integridade&lt;/STRONG&gt;, garantindo compatibilidade com serviços que dependem de hostname específico para funcionar corretamente.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Perceba que o Health Probe também está vinculado às Backend Settings&lt;/STRONG&gt;, e utiliza a configuração&amp;nbsp;&lt;STRONG&gt;“Pick host name from backend settings”&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Essa associação é fundamental para garantir que o probe de integridade seja executado corretamente, especialmente em cenários onde o backend exige um cabeçalho&amp;nbsp;Host&amp;nbsp;específico. Ao ativar essa opção, o Application Gateway passa a usar o&amp;nbsp;&lt;STRONG&gt;hostname do backend&lt;/STRONG&gt;&amp;nbsp;tanto para o roteamento quanto para a validação do probe, assegurando compatibilidade com serviços que dependem dessa configuração.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Esse endereço /status-0123456789abcdef é o endereço de sondagem do apim (helth cehck) do APIM&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Voltando à Rule1&lt;/STRONG&gt;, podemos observar que ela também define o&amp;nbsp;&lt;STRONG&gt;Backend Target&lt;/STRONG&gt;, que neste caso aponta para o&amp;nbsp;&lt;STRONG&gt;serviço de backend do APIM (Azure API Management)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Essa configuração é essencial para garantir que o tráfego roteado pelo Application Gateway seja direcionado corretamente ao endpoint do APIM, respeitando as regras de roteamento, cabeçalhos e probes definidos nas Backend Settings.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Nos&amp;nbsp;&lt;STRONG&gt;Backend Pools&lt;/STRONG&gt;, temos o&amp;nbsp;&lt;STRONG&gt;pool de backend do APIM&lt;/STRONG&gt;, que contém&amp;nbsp;&lt;STRONG&gt;duas instâncias do serviço Azure API Management&lt;/STRONG&gt;. Essa configuração permite distribuir o tráfego entre as instâncias, garantindo alta disponibilidade e escalabilidade para os serviços expostos via AppGW.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Do lado do APIM&lt;/H3&gt;
&lt;P data-selectable-paragraph=""&gt;Para observar o processo de&amp;nbsp;&lt;STRONG&gt;balanceamento entre instâncias do APIM&lt;/STRONG&gt;&amp;nbsp;(por exemplo, APIM A e APIM B), podemos criar uma&amp;nbsp;&lt;STRONG&gt;API de mock&lt;/STRONG&gt;&amp;nbsp;que responda de forma simples, identificando qual instância está respondendo.&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Principais Objetos do APIM&lt;/H3&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Políticas&lt;/STRONG&gt;: São regras aplicadas às requisições HTTP, permitindo manipulações como transformação de payloads, controle de acesso, limitação de chamadas (rate limiting), entre outras.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;API&lt;/STRONG&gt;: Representa um conjunto de operações agrupadas sob um único endpoint. Cada API pode conter múltiplas operações.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Operações&lt;/STRONG&gt;: São as ações HTTP específicas, como os verbos&amp;nbsp;GET,&amp;nbsp;POST,&amp;nbsp;PUT,&amp;nbsp;DELETE, etc. Cada operação define o comportamento de uma rota dentro da API.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Como criar um mock no Azure API Management (APIM)&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Adicionar uma nova API&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Acesse o menu lateral e clique em&amp;nbsp;&lt;STRONG&gt;“Add API”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Selecione a opção para&amp;nbsp;&lt;STRONG&gt;criar uma API manualmente&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Na caixa de diálogo exibida, preencha os dados necessários (nome, URL base, etc.).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;eu criei uma APIA, com sufixo apim&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Definir o response da operação&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Clique em “add operation” e preencha o verbo como get a url como /moq&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após criar a operação desejada, clique na aba&amp;nbsp;&lt;STRONG&gt;“Responses”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Clique em&amp;nbsp;&lt;STRONG&gt;“Add response”&lt;/STRONG&gt;&amp;nbsp;e selecione o código&amp;nbsp;&lt;STRONG&gt;200&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em&amp;nbsp;&lt;STRONG&gt;Content type&lt;/STRONG&gt;, escolha&amp;nbsp;&lt;STRONG&gt;application/json&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;No campo&amp;nbsp;&lt;STRONG&gt;Sample&lt;/STRONG&gt;, insira um JSON de exemplo para identificar a instância, como:&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;JSON&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-selectable-paragraph=""&gt;{&lt;BR /&gt;"name": "APIMA"&lt;BR /&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Adicionar a política de mock&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Vá para a aba&amp;nbsp;&lt;STRONG&gt;“Design”&lt;/STRONG&gt;&amp;nbsp;da operação.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Na seção&amp;nbsp;&lt;STRONG&gt;Inbound processing&lt;/STRONG&gt;, clique em&amp;nbsp;&lt;STRONG&gt;“Add policy”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Selecione a política&amp;nbsp;&lt;STRONG&gt;“Mock response”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Verificação&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Após salvar, o pipeline da requisição exibirá uma&amp;nbsp;&lt;STRONG&gt;tarja amarela&lt;/STRONG&gt;, indicando que o mock está ativo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Repita esse processo para a instância dois. Agora já podemos testar o balanceamento de carga pelo Application Gateway&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Sincronização das Instâncias com o API OPS&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Conforme mencionado no início deste artigo, a arquitetura “by the book” foi projetada para utilizar o recurso nativo de&amp;nbsp;&lt;STRONG&gt;multi-região do Azure API Management (APIM)&lt;/STRONG&gt;, o que elimina a necessidade de esforços adicionais para sincronizar configurações entre instâncias.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;No entanto, ao optarmos por manter&amp;nbsp;&lt;STRONG&gt;duas instâncias separadas na mesma região&lt;/STRONG&gt;, com o objetivo de obter os benefícios citados anteriormente, passamos a ter o desafio de&amp;nbsp;&lt;STRONG&gt;manter ambas sincronizadas&lt;/STRONG&gt;&amp;nbsp;— ou seja, com as mesmas APIs, endpoints e políticas.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Para atender a essa necessidade de sincronização, utilizaremos o&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/example-scenario/devops/automated-api-deployments-apiops" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;API Ops&lt;/STRONG&gt;&lt;/A&gt;, que automatiza o processo de publicação e atualização das configurações entre as instâncias, garantindo consistência e reduzindo o risco de divergências operacionais.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Resumo do Fluxo de API Ops para Sincronização com o APIM&lt;/H3&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Operadores de API&lt;/STRONG&gt;&amp;nbsp;executam o pipeline de extração para sincronizar o repositório Git com a instância do API Management, populando o repositório com os objetos no formato necessário.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Se houver alterações detectadas na instância do APIM, é criado um&amp;nbsp;&lt;STRONG&gt;Pull Request (PR)&lt;/STRONG&gt;&amp;nbsp;para revisão. Após aprovação, os operadores fazem o merge das mudanças no repositório.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Desenvolvedores de API&lt;/STRONG&gt;&amp;nbsp;clonam o repositório, criam uma branch e definem as APIs usando especificações OpenAPI ou ferramentas de sua preferência.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Quando um desenvolvedor envia alterações para o repositório, um novo PR é gerado para revisão.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;O PR pode ser&amp;nbsp;&lt;STRONG&gt;aprovado automaticamente&lt;/STRONG&gt;&amp;nbsp;ou&amp;nbsp;&lt;STRONG&gt;revisado manualmente&lt;/STRONG&gt;, conforme o nível de controle exigido.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após a aprovação e o merge, o&amp;nbsp;&lt;STRONG&gt;pipeline de publicação&lt;/STRONG&gt;&amp;nbsp;implanta as alterações na instância do API Management.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Os operadores também podem criar ou modificar políticas, diagnósticos, produtos e outros objetos relevantes, e então&amp;nbsp;&lt;STRONG&gt;comitar&lt;/STRONG&gt;&amp;nbsp;essas alterações.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após o merge, o pipeline publica as mudanças usando o processo de definição de APIs.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Conclusão&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A adoção de uma arquitetura com&amp;nbsp;&lt;STRONG&gt;App Gateway à frente de múltiplos APIMs&lt;/STRONG&gt;, integrada com&amp;nbsp;&lt;STRONG&gt;Akamai WAF&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;Azure Functions&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;Key Vault&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;sistemas legados&lt;/STRONG&gt;, oferece uma solução robusta, segura e altamente disponível. Essa abordagem não apenas melhora a experiência do usuário, mas também reduz riscos operacionais e facilita a evolução contínua da plataforma.&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Referencias&lt;/H3&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/" target="_blank" rel="noopener"&gt;Estrutura de Well-Architected do Azure — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/principles" target="_blank" rel="noopener"&gt;Princípios de design de confiabilidade — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/maturity-model?tabs=level1" target="_blank" rel="noopener"&gt;Modelo de maturidade de confiabilidade — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/" target="_blank" rel="noopener"&gt;Links rápidos de excelência operacional — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/example-scenario/devops/automated-api-deployments-apiops" target="_blank" rel="noopener"&gt;Implantações de API automatizadas usando APIOps — Azure Architecture Center | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;</description>
      <pubDate>Tue, 09 Sep 2025 18:54:23 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/alta-disponibilidade-e-resili%C3%AAncia-com-app-gateway-e-m%C3%BAltiplos/ba-p/4451312</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2025-09-09T18:54:23Z</dc:date>
    </item>
    <item>
      <title>AKS - Problemas de desempenho do NGINX Ingress Controller Gerenciado</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aks-problemas-de-desempenho-do-nginx-ingress-controller/ba-p/4447419</link>
      <description>&lt;P&gt;O&amp;nbsp;&lt;A href="https://learn.microsoft.com/azure/aks/app-routing" target="_blank"&gt;NGINX ingress controller gerenciado&lt;/A&gt; é um complemento de roteamento que permite direcionar tráfego HTTP e HTTPS para aplicações executando em um cluster &lt;A href="https://learn.microsoft.com/azure/aks/" target="_blank"&gt;Azure Kubernetes Service (AKS)&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Em problemas relacionados à performance, o sistema de roteamento pode ser a causa raiz. Este artigo fornece um guia passo a passo para solucionar problemas de performance do NGINX ingress controller.&lt;/P&gt;
&lt;H2 id="pr-requisitos"&gt;Pré-requisitos&lt;/H2&gt;
&lt;P&gt;Antes de começar, certifique-se de ter as seguintes ferramentas instaladas:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Kubernetes CLI (&lt;CODE&gt;kubectl&lt;/CODE&gt;)&lt;/STRONG&gt;: Use o Azure CLI para instalar executando o comando &lt;CODE&gt;az aks install-cli&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="sintomas-comuns"&gt;Sintomas Comuns&lt;/H2&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Sintoma&lt;/th&gt;&lt;th&gt;Descrição&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Erros de Gateway HTTP&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Códigos de erro como 502, 504 podem indicar um problema de exaustão do NGINX.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Alta Diferença no Tempo de Resposta&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Diferença significativa entre o tempo de resposta do seu serviço e o tempo de resposta fim a fim. Existe uma latência comum adicionada pelo NGINX, mas quando é muito grande, pode indicar exaustão do NGINX.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2 id="passo-1-verifique-o-comportamento-do-hpa"&gt;Passo 1: Verifique o Comportamento do HPA&lt;/H2&gt;
&lt;P&gt;A razão mais comum para problemas de performance no NGINX é exaustão de CPU. Durante picos de carga no sistema, uma boa abordagem é observar o comportamento do &lt;A href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/" target="_blank"&gt;HPA&lt;/A&gt;. Por padrão, o plugin de roteamento cria um &lt;A href="https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" target="_blank"&gt;namespace&lt;/A&gt; chamado &lt;CODE&gt;app-routing-system&lt;/CODE&gt;.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Obtenha o nome do HPA&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Observe o comportamento do HPA&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa &lt;SPAN class="hljs-symbol"&gt;&amp;lt;HPA_NAME&amp;gt;&lt;/SPAN&gt; -n app-routing-&lt;SPAN class="hljs-built_in"&gt;system&lt;/SPAN&gt; -&lt;SPAN class="hljs-keyword"&gt;w&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Avalie o resultado&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; $ kubectl get hpa &amp;lt;HPA_NAME&amp;gt; -n app-routing-system -w&lt;BR /&gt;
 NAME    REFERENCE          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
 nginx   Deployment/nginx   cpu: 83%/70%  &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;         77m
 nginx   Deployment/nginx   cpu: 83%/70%  &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         77m
 nginx   Deployment/nginx   cpu: 106%/70%       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         79m
 nginx   Deployment/nginx   cpu: 133%/70%       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         80m
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;A coluna &lt;STRONG&gt;TARGETS&lt;/STRONG&gt; mostra o limite de CPU onde o &lt;CODE&gt;HPA&lt;/CODE&gt; irá acionar o aumento de replicas. Você deve interpretar esse comportamento. Existem algumas possibilidades:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;O &lt;CODE&gt;HPA&lt;/CODE&gt; atingiu o número máximo de pods.&lt;/LI&gt;
&lt;LI&gt;Não há &lt;A href="https://kubernetes.io/docs/concepts/architecture/nodes" target="_blank"&gt;nodes&lt;/A&gt; disponíveis para agendar os pods.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="passo-2-procure-por-pods-em-estado-pending"&gt;Passo 2: Procure por Pods em Estado Pending&lt;/H2&gt;
&lt;P&gt;Se no passo anterior você viu que o &lt;CODE&gt;NGINX HPA&lt;/CODE&gt; não atingiu o número máximo de pods, o &lt;A href="https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/#kube-scheduler" target="_blank"&gt;kube-scheduler&lt;/A&gt; pode estar tendo dificuldades para encontrar nodes disponíveis para agendar os pods do &lt;CODE&gt;NGINX&lt;/CODE&gt;.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Obtenha Pods em Pending&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-meta"&gt;get&lt;/SPAN&gt; pod --&lt;SPAN class="hljs-meta"&gt;field&lt;/SPAN&gt;-&lt;SPAN class="hljs-keyword"&gt;selector=status.phase=Pending &lt;/SPAN&gt;-n app-routing-system
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Se houver pods em Pending, o cluster provavelmente está enfrentando um problema de exaustão de recursos. Nesse caso, consulte&amp;nbsp;&lt;A href="https://learn.microsoft.com/troubleshoot/azure/azure-kubernetes/availability-performance/troubleshoot-pod-scheduler-errors" target="_blank"&gt;Solucionar erros do agendador de pods no Azure Kubernetes Service&lt;/A&gt;.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H2 id="passo-3-verifique-se-existem-limites-aplicados-ao-deployment-do-nginx"&gt;Passo 3: Verifique se Existem Limites Aplicados ao Deployment do NGINX&lt;/H2&gt;
&lt;P&gt;Qualquer configuração incorreta nos &lt;A href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" target="_blank"&gt;limites ou requests de recursos&lt;/A&gt; do &lt;CODE&gt;NGINX&lt;/CODE&gt; pode fazer com que o &lt;CODE&gt;HPA&lt;/CODE&gt; escale mais pods do que o necessário.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Descreva o Deployment do NGINX&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;describe&lt;/SPAN&gt; deploy nginx -n app-routing-&lt;SPAN class="hljs-built_in"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Verifique Requests e Limits&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; $ kubectl describe deploy nginx -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
 Name:                   nginx
 ....
 Selector:               app=nginx
 ....
 Pod Template:
 ....
 Containers:
 controller:
     ...
     Limits:
     ...
     Requests:
     ...
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 id="solu-o"&gt;Solução&lt;/H2&gt;
&lt;P&gt;Por padrão, a versão atual do NGINX ingress controller não define limites para os pods do NGINX e define requests &lt;CODE&gt;500m&lt;/CODE&gt; de CPU, que é usado pelo &lt;CODE&gt;HPA&lt;/CODE&gt;. Não é recomendado alterar esses valores diretamente na definição do deployment.&lt;/P&gt;
&lt;P&gt;Se o seu &lt;CODE&gt;HPA&lt;/CODE&gt; está atingindo o número máximo de pods e os requests e limits do deployment permanecem inalterados, você deve configurar o &lt;A href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/" target="_blank"&gt;custom resource definition (CRD)&lt;/A&gt; chamado &lt;A href="https://github.com/Azure/aks-app-routing-operator/blob/main/config/crd/bases/approuting.kubernetes.azure.com_nginxingresscontrollers.yaml" target="_blank"&gt;NginxIngressController&lt;/A&gt;.&lt;/P&gt;
&lt;H3 id="op-es-de-configura-o"&gt;Opções de Configuração&lt;/H3&gt;
&lt;P&gt;As opções de configuração abaixo impactam diretamente o comportamento do &lt;CODE&gt;HPA&lt;/CODE&gt;:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Propriedade&lt;/th&gt;&lt;th&gt;Tipo&lt;/th&gt;&lt;th&gt;Descrição&lt;/th&gt;&lt;th&gt;Obrigatório&lt;/th&gt;&lt;th&gt;Padrão&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;scaling&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;objeto&lt;/td&gt;&lt;td&gt;Configuração para escalonamento do controller. Contém propriedades aninhadas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;maxReplicas&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;inteiro&lt;/td&gt;&lt;td&gt;Limite superior de réplicas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;minReplicas&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;inteiro&lt;/td&gt;&lt;td&gt;Limite inferior de réplicas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;threshold&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;Limite de escalonamento definindo quão agressivo será o scaling. Opções: &lt;CODE&gt;rapid&lt;/CODE&gt;, &lt;CODE&gt;steady&lt;/CODE&gt;, &lt;CODE&gt;balanced&lt;/CODE&gt;.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;balanced&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3 id="como-aplicar-a-configura-o"&gt;Como Aplicar a Configuração&lt;/H3&gt;
&lt;P&gt;Siga os passos abaixo para aplicar a configuração:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Edite o CRD NginxIngressController&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-keyword"&gt;edit&lt;/SPAN&gt; nginxingresscontroller -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Adicione ou modifique a configuração de scaling&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-yaml"&gt;&lt;SPAN class="hljs-symbol"&gt; spec:&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;   scaling:&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     maxReplicas:&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;10&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     minReplicas:&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     threshold:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;"balanced"&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Salve e saia&lt;/STRONG&gt; do editor para aplicar as alterações.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Verifique as alterações&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;O HPA será atualizado automaticamente com base na nova configuração, e o NGINX ingress controller irá escalar conforme os parâmetros especificados.&lt;/P&gt;
&lt;H2 id="recursos-adicionais"&gt;Recursos adicionais&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com//azure/aks/best-practices" target="_blank"&gt;Saiba mais sobre boas práticas do Azure Kubernetes Service (AKS)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze" target="_blank"&gt;Monitore a performance do seu cluster Kubernetes com Container insights&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/kubernetes/ingress-nginx" target="_blank"&gt;NGINX ingress controller&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Fri, 05 Sep 2025 13:44:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aks-problemas-de-desempenho-do-nginx-ingress-controller/ba-p/4447419</guid>
      <dc:creator>ClaudioGodoy</dc:creator>
      <dc:date>2025-09-05T13:44:38Z</dc:date>
    </item>
    <item>
      <title>Anatomia de um serviço ASP.NET Core</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anatomia-de-um-servi%C3%A7o-asp-net-core/ba-p/4423980</link>
      <description>&lt;P&gt;O ecossistema do &lt;A href="https://learn.microsoft.com/dotnet/" target="_blank" rel="noopener"&gt;.NET&lt;/A&gt; é uma plataforma de desenvolvimento de software criada pela Microsoft. Ele inclui ferramentas, bibliotecas e frameworks para a criação de aplicações desktop, web, mobile, serviços e muito mais. Desde sua unificação, o &lt;CODE&gt;.NET Core&lt;/CODE&gt; e o &lt;CODE&gt;.NET Framework&lt;/CODE&gt; passaram a ser conhecidos apenas como &lt;CODE&gt;.NET&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;O &lt;A href="https://learn.microsoft.com/dotnet/core/sdk" target="_blank" rel="noopener"&gt;.NET SDK (Software Development Kit)&lt;/A&gt; fornece as ferramentas necessárias para criar, compilar, depurar e publicar aplicações &lt;CODE&gt;.NET&lt;/CODE&gt;. Ele inclui o compilador &lt;A href="https://en.wikipedia.org/wiki/C_Sharp_(programming_language" target="_blank" rel="noopener"&gt;C#&lt;/A&gt;), bibliotecas de classes como &lt;A href="https://dotnet.microsoft.com/learn/aspnet/what-is-aspnet-core" target="_blank" rel="noopener"&gt;ASP.NET Core&lt;/A&gt; e &lt;A href="https://learn.microsoft.com/ef/core/" target="_blank" rel="noopener"&gt;Entity Framework Core&lt;/A&gt;, além de utilitários como o &lt;A href="https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild" target="_blank" rel="noopener"&gt;MSBuild&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;O ambiente de execução &lt;CODE&gt;.NET&lt;/CODE&gt; (&lt;A href="https://learn.microsoft.com/dotnet/standard/clr" target="_blank" rel="noopener"&gt;Common Language Runtime ou CLR&lt;/A&gt;) gerencia a execução de programas &lt;CODE&gt;.NET&lt;/CODE&gt;, oferecendo serviços como gerenciamento de memória, coleta de lixo e controle de exceções.&lt;/P&gt;
&lt;H2 id="tipos-de-aplica-es-net"&gt;Tipos de Aplicações .NET&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://dotnet.microsoft.com/apps/aspnet/apis" target="_blank" rel="noopener"&gt;Web API&lt;/A&gt;&lt;/STRONG&gt;: Aplicações que fornecem serviços e endpoints &lt;A href="https://learn.microsoft.com/azure/architecture/best-practices/api-design" target="_blank" rel="noopener"&gt;RESTful&lt;/A&gt; para interação com clientes.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/aspnet/core/blazor/components/class-libraries-and-static-server-side-rendering?view=aspnetcore-9.0" target="_blank" rel="noopener"&gt;Razor com SSR (Server-Side Rendering)&lt;/A&gt;&lt;/STRONG&gt;: Ideal para aplicações que precisam de SEO e renderização eficiente.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/dotnet/core/tutorials/with-visual-studio-code" target="_blank" rel="noopener"&gt;Console Application&lt;/A&gt;&lt;/STRONG&gt;: Útil para tarefas automatizadas e scripts.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://dotnet.microsoft.com/apps/maui" target="_blank" rel="noopener"&gt;MAUI (Multi-platform App UI)&lt;/A&gt;&lt;/STRONG&gt;: Permite o desenvolvimento de aplicativos multiplataforma.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/dotnet/standard/class-libraries" target="_blank" rel="noopener"&gt;Libraries (.NET Standard/Core Libraries)&lt;/A&gt;&lt;/STRONG&gt;: Conjuntos de código reutilizável para funcionalidades específicas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="asp-net-core-webapi"&gt;ASP.NET Core WebAPI&lt;/H2&gt;
&lt;P&gt;Uma WebAPI segue o estilo arquitetural &lt;A href="https://learn.microsoft.com/azure/architecture/best-practices/api-design" target="_blank" rel="noopener"&gt;REST (Representational State Transfer)&lt;/A&gt;, utilizando o protocolo &lt;A href="https://www.rfc-editor.org/rfc/rfc2616" target="_blank" rel="noopener"&gt;HTTP&lt;/A&gt; para comunicação.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Protocolo HTTP:&lt;/STRONG&gt; Define métodos como GET, POST, PUT e DELETE para manipulação de recursos.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;REST API:&lt;/STRONG&gt; Utiliza URIs para identificar recursos e métodos HTTP para operações CRUD.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://martinfowler.com/articles/richardsonMaturityModel.html" target="_blank" rel="noopener"&gt;Modelo de Richardson&lt;/A&gt;:&lt;/STRONG&gt; Estabelece níveis de maturidade em APIs REST.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;O foco principal do artigo está na WebAPI, devido à sua relevância na criação de serviços modernos.&lt;/P&gt;
&lt;H2 id="demo"&gt;Demo&lt;/H2&gt;
&lt;P&gt;Para criar uma &lt;CODE&gt;webapi&lt;/CODE&gt;, com o &lt;A href="https://dotnet.microsoft.com/download" target="_blank" rel="noopener"&gt;dotnet sdk&lt;/A&gt; instalado, rode o comando:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;dotnet &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;webapi&lt;/SPAN&gt; -n MinhaApi
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Após executar o comando, será gerada uma estrutura básica de projeto contendo:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Controllers&lt;/STRONG&gt;: Arquivos para definir os endpoints da API.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Program.cs&lt;/STRONG&gt;: Configuração inicial da aplicação.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;appsettings.json&lt;/STRONG&gt;: Arquivo de configuração.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Você pode iniciar o servidor com:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;&lt;SPAN class="hljs-built_in"&gt;cd&lt;/SPAN&gt; MinhaApi
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;dotnet &lt;SPAN class="hljs-keyword"&gt;run&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H2 id="ciclo-de-vida-de-uma-requisi-o-http-em-aplica-es-asp-net-core"&gt;Ciclo de vida de uma requisição HTTP em aplicações ASP.NET Core&lt;/H2&gt;
&lt;H3 id="server"&gt;Server&lt;/H3&gt;
&lt;P&gt;Uma aplicação &lt;A href="https://learn.microsoft.com/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-8.0" target="_blank" rel="noopener"&gt;ASP.NET Core&lt;/A&gt; é executada com uma implementação de servidor &lt;CODE&gt;HTTP in-process&lt;/CODE&gt;. Esse servidor escuta por requisições HTTP e as disponibiliza para a aplicação através do &lt;A href="https://learn.microsoft.com/dotnet/api/system.web.httpcontext?view=netframework-4.8.1" target="_blank" rel="noopener"&gt;HttpContext&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;As responsabilidades do servidor incluem:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Escutar em uma porta específica para receber solicitações HTTP.&lt;/LI&gt;
&lt;LI&gt;Processar as requisições e encaminhá-las para os middlewares configurados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 id="middlewares"&gt;Middlewares&lt;/H3&gt;
&lt;P&gt;Os middlewares são componentes que processam requisições e respostas. Eles podem:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Autenticar usuários.&lt;/LI&gt;
&lt;LI&gt;Registrar logs.&lt;/LI&gt;
&lt;LI&gt;Manipular erros.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Exemplo de configuração de middleware:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-csharp"&gt;app.UseRouting()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseAuthentication()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseAuthorization()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseEndpoints(endpoints =&amp;gt;
{
    endpoints.MapControllers()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
})&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H3 id="controllers"&gt;Controllers&lt;/H3&gt;
&lt;P&gt;Os controllers são responsáveis por definir os endpoints da API. Um exemplo básico:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-csharp"&gt;[ApiController]
[Route(&lt;SPAN class="hljs-string"&gt;"api/[controller]"&lt;/SPAN&gt;)]
&lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;class&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;MinhaController&lt;/SPAN&gt; : &lt;SPAN class="hljs-type"&gt;ControllerBase&lt;/SPAN&gt;&lt;/SPAN&gt;
{
    [HttpGet]
    &lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt; IActionResult Get()
    {
        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; Ok(&lt;SPAN class="hljs-string"&gt;"Hello World"&lt;/SPAN&gt;);
    }
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H3 id="resumo"&gt;Resumo&lt;/H3&gt;
&lt;P&gt;O ciclo de vida de uma requisição HTTP envolve o servidor, middlewares e controllers, garantindo que cada etapa seja processada de forma eficiente e escalável.&lt;/P&gt;
&lt;H3 id="conclus-o"&gt;Conclusão&lt;/H3&gt;
&lt;P&gt;O &lt;STRONG&gt;ASP.NET Core&lt;/STRONG&gt; é uma plataforma poderosa e flexível que permite o desenvolvimento de aplicações modernas, robustas e escaláveis. Desde sua arquitetura modular com middlewares até a configuração do pipeline de requisições, ele fornece ferramentas essenciais para criar soluções otimizadas e adaptadas a diferentes necessidades, seja para web, APIs RESTful ou sistemas distribuídos.&lt;/P&gt;
&lt;P&gt;Ao longo deste artigo, exploramos desde os fundamentos do &lt;CODE&gt;.NET&lt;/CODE&gt; e a ampla gama de tipos de aplicativos que podem ser criados, até os detalhes do ciclo de vida de uma requisição HTTP e a importância dos servidores Kestrel e HTTP.sys. Com uma compreensão clara do pipeline de requisições e dos middlewares, é possível projetar sistemas que não apenas atendem aos requisitos técnicos, mas também oferecem excelente desempenho e uma experiência de usuário consistente.&lt;/P&gt;
&lt;P&gt;Dominar o ecossistema do &lt;STRONG&gt;ASP.NET Core&lt;/STRONG&gt; é essencial para desenvolvedores que desejam se destacar no desenvolvimento de serviços e aplicações web de alto desempenho.&lt;/P&gt;</description>
      <pubDate>Mon, 30 Jun 2025 00:39:17 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anatomia-de-um-servi%C3%A7o-asp-net-core/ba-p/4423980</guid>
      <dc:creator>ClaudioGodoy</dc:creator>
      <dc:date>2025-06-30T00:39:17Z</dc:date>
    </item>
    <item>
      <title>Participe da 2ª edição do GitHub Copilot Global Bootcamp</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/participe-da-2%C2%AA-edi%C3%A7%C3%A3o-do-github-copilot-global-bootcamp/ba-p/4417042</link>
      <description>&lt;P data-start="202" data-end="593"&gt;O &lt;STRONG&gt;GitHub Copilot Global Bootcamp&lt;/STRONG&gt; começou em fevereiro como uma jornada totalmente virtual de aprendizado — e foi um sucesso. Mais de &lt;STRONG&gt;60 mil desenvolvedores&lt;/STRONG&gt; participaram da primeira edição, em vários idiomas e regiões. Agora, estamos empolgados em lançar a &lt;STRONG&gt;segunda edição&lt;/STRONG&gt; — maior e melhor — &lt;STRONG&gt;com workshops virtuais e presenciais,&lt;/STRONG&gt; organizados por comunidades de tecnologia ao redor do mundo.&lt;/P&gt;
&lt;P data-start="595" data-end="747"&gt;Essa nova edição chega logo após os anúncios do &lt;STRONG&gt;Microsoft Build 2025&lt;/STRONG&gt;, onde as equipes do GitHub e do Visual Studio Code revelaram novidades empolgantes:&lt;/P&gt;
&lt;UL data-start="749" data-end="1067"&gt;
&lt;LI data-start="749" data-end="845"&gt;A&lt;STRONG&gt; extensão GitHub Copilot Chat será open source,&lt;/STRONG&gt; reforçando a transparência e a colaboração.&lt;/LI&gt;
&lt;LI data-start="846" data-end="976"&gt;A IA está sendo profundamente integrada ao &lt;STRONG&gt;Visual Studio Code&lt;/STRONG&gt;, que agora está evoluindo para um editor de IA de código aberto.&lt;/LI&gt;
&lt;LI data-start="977" data-end="1067"&gt;Novas APIs e ferramentas estão tornando mais fácil do que nunca construir com IA e LLMs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1069" data-end="1276"&gt;Este bootcamp é a sua oportunidade de explorar essas novas ferramentas, entender como usar o GitHub Copilot de forma eficaz e fazer parte da crescente conversa global sobre IA no desenvolvimento de software.&lt;/P&gt;
&lt;P data-start="1283" data-end="1314"&gt;👩‍💻 &lt;STRONG data-start="1289" data-end="1314"&gt;Quem pode participar?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-start="1316" data-end="1599"&gt;Seja você um(a) desenvolvedor(a) iniciante, estudante ou profissional experiente em tecnologia, este bootcamp foi feito para você. Você aprenderá casos de uso práticos do GitHub Copilot e como aumentar sua produtividade usando IA — em um formato acessível e prático.&lt;/P&gt;
&lt;H3 data-start="1606" data-end="1641"&gt;&lt;STRONG data-start="1610" data-end="1641"&gt;Participe da edição virtual&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1643" data-end="1725"&gt;Não importa onde você esteja, é possível participar online e aprender com a gente:&lt;/P&gt;
&lt;P data-start="1727" data-end="1760"&gt;&lt;STRONG data-start="1727" data-end="1758"&gt;Português (Brasil – UTC -3)&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-start="1761" data-end="1922"&gt;
&lt;LI style="font-weight: bold;" data-start="1761" data-end="1833"&gt;&lt;STRONG&gt;24 de junho, 19h: &lt;A class="lia-external-url" href="https://developer.microsoft.com/en-us/reactor/events/25931/" target="_blank" rel="noopener"&gt;&lt;EM data-start="1781" data-end="1831"&gt;Boas práticas para dominar o GitHub Copilot Chat&lt;/EM&gt;&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI style="font-weight: bold;" data-start="1834" data-end="1922"&gt;&lt;STRONG&gt;25 de junho, 19h: &lt;A class="lia-external-url" href="https://developer.microsoft.com/en-us/reactor/events/25932/" target="_blank" rel="noopener"&gt;&lt;EM data-start="1854" data-end="1920"&gt;Integrações práticas com MCP Servers no VS Code e GitHub Copilot&lt;/EM&gt;&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="2314" data-end="2346"&gt;&lt;STRONG data-start="2318" data-end="2344"&gt;Aprenda na sua cidade!&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2347" data-end="2479"&gt;Estamos em parceria com comunidades locais de desenvolvedores para levar workshops presenciais a diversas cidades ao redor do mundo.&lt;/P&gt;
&lt;P data-start="2722" data-end="2758"&gt;&lt;STRONG data-start="2722" data-end="2758"&gt;Sessões presenciais confirmadas no Brasil:&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 94.8529%; height: 187.6px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 26.8px;"&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Data&lt;/th&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Cidade&lt;/th&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Inscrições&lt;/th&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;17 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Brasília, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/rUNtTWNndV" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;17 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Pato de Minas, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/tXXP6Ce7Xq" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;21 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Mogi das Cruzes, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://cloudexpertschool.com.br/github-copilot-global-bootcamp/" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;26 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Recife, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/yFqWJfY2iW" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;27 de Junho&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Rio de Janeiro, Brasil&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;&lt;A href="https://capsula.rj.senac.br/github2025/" target="_blank"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;img /&gt;
&lt;P data-start="4355" data-end="4697"&gt;O&amp;nbsp;&lt;STRONG data-start="4357" data-end="4385"&gt;Microsoft Applied Skills&lt;/STRONG&gt; é um programa de credenciamento criado para validar sua capacidade de realizar tarefas técnicas específicas do mundo real. Diferente das certificações tradicionais que costumam abranger cargos amplos, o Applied Skills foca em habilidades práticas e cenários reais, diretamente aplicáveis a desafios de negócios.&lt;/P&gt;
&lt;P data-start="4699" data-end="4917"&gt;&lt;STRONG data-start="4699" data-end="4743"&gt;E a melhor parte? É totalmente gratuito!&lt;/STRONG&gt;&lt;BR data-start="4743" data-end="4746" /&gt;Você demonstra suas habilidades por meio de avaliações interativas, baseadas em tarefas, em um ambiente simulado — sem perguntas de múltipla escolha, apenas trabalho real.&lt;/P&gt;
&lt;P data-start="4919" data-end="5131"&gt;Uma das adições mais recentes é o &lt;STRONG data-start="4953" data-end="4988"&gt;Applied Skill do GitHub Copilot&lt;/STRONG&gt;, que comprova sua habilidade de aproveitar a IA para aumentar a produtividade no desenvolvimento de software e melhorar a qualidade do código:&lt;/P&gt;
&lt;P data-start="5135" data-end="5204" data-is-last-node=""&gt;&lt;A class="lia-external-url" href="https://aka.ms/appliedskills/github-copilot" target="_blank" rel="noopener"&gt;&lt;STRONG data-start="5135" data-end="5204" data-is-last-node=""&gt;Acelere o desenvolvimento de aplicativos usando o GitHub Copilot.&lt;/STRONG&gt;&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 06 Jun 2025 14:19:57 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/participe-da-2%C2%AA-edi%C3%A7%C3%A3o-do-github-copilot-global-bootcamp/ba-p/4417042</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-06-06T14:19:57Z</dc:date>
    </item>
    <item>
      <title>Crie seu Primeiro Agente de IA com JavaScript e Azure AI Agent Service!</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/crie-seu-primeiro-agente-de-ia-com-javascript-e-azure-ai-agent/ba-p/4411651</link>
      <description>&lt;H2 data-line="4"&gt;&lt;STRONG&gt;Introdução: A Era dos Agentes de IA em JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="8"&gt;Durante o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;, uma das sessões mais aguardadas foi apresentada por&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.linkedin.com/in/wassimchegham/" data-href="https://www.linkedin.com/in/wassimchegham/" target="_blank"&gt;Wassim Chegham&lt;/A&gt;&lt;/STRONG&gt;, que é Senior AI Developer Advocate em JavaScript na Microsoft. O tema?&amp;nbsp;&lt;STRONG&gt;"Como Criar seu Primeiro Agente de IA com JavaScript e Azure AI Agent Service?"&lt;/STRONG&gt;&amp;nbsp;- uma ferramenta poderosa e pensada para desenvolvedores modernos que desejam criar aplicações AI-first com segurança, escabilidade e produtividade.&lt;/P&gt;
&lt;P data-line="10"&gt;E, nesse artigo, vamos explorar os principais pontos abordados na sessão, com um foco especial em como você pode criar seu próprio agente de IA utilizando JavaScript e o Azure AI Agent Service.&lt;/P&gt;
&lt;P data-line="12"&gt;A proposta do vídeo é clara: mostrar o passo a passo de como qualquer pessoa pode criar agentes de IA com JavaScript e TypeScript, utilizando&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Foundry&lt;/A&gt;&lt;/STRONG&gt;, e explicar todos os conceitos essenciais para dominar esse novo paradigma de desenvolvimento.&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="12"&gt;Se você perdeu a sessão, não se preocupe! Você pode assistir a gravação:&lt;/P&gt;
&lt;P data-line="12"&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://www.youtube.com/watch?v=RNphlRKvmJQ/1746638815221" data-video-remote-vid="https://www.youtube.com/watch?v=RNphlRKvmJQ/1746638815221" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FRNphlRKvmJQ%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DRNphlRKvmJQ&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FRNphlRKvmJQ%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;H2 data-line="20"&gt;&lt;STRONG&gt;O que são Agentes de IA?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="22"&gt;Wassim inicia a sessão com um panorama histórico: desde os chatbots tradicionais até os agentes inteligentes e autônomos que conhecemos hoje. Ele destacou:&lt;/P&gt;
&lt;UL data-line="24"&gt;
&lt;LI data-line="24"&gt;&lt;STRONG&gt;Agentes baseados em LLMs (Large Language Models)&lt;/STRONG&gt;&amp;nbsp;que entendem a linguagem natural.&lt;/LI&gt;
&lt;LI data-line="26"&gt;&lt;STRONG&gt;Agentes com ferramentas (tools)&lt;/STRONG&gt;&amp;nbsp;que executam ações no mundo real, como chamadas de API, buscas, execução de código etc.&lt;/LI&gt;
&lt;LI data-line="28"&gt;&lt;STRONG&gt;Sistemas multiagentes&lt;/STRONG&gt;, que coordenam vários agentes para resolver tarefas complexas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;O diferencial do Azure AI Agent Service é simplificar tudo isso, oferecendo uma plataforma gerenciada que cuida da orquestração, segurança, rastreamento e execução dos agentes.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="36"&gt;&lt;STRONG&gt;Arquitetura de Soluções com Azure AI Agent Service&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="40"&gt;Durante a sessão, Wassim apresentou uma visão clara da arquitetura típica de uma aplicação de agente de IA desenvolvida com JavaScript. Ele explicou que, embora seja possível ter uma interface gráfica (FrontEnd) usando frameworks como Angular ou React, isso não é obrigatório - a aplicação pode muito bem funcionar num terminal, como foi o caso das demonstrações feitas ao vivo.&lt;/P&gt;
&lt;P data-line="42"&gt;No BackEnd, o foco recai sobre o uso de Node.js, que pode ser combinado com frameworks como&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://expressjs.com/" data-href="https://expressjs.com/" target="_blank"&gt;Express.js&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;ou&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://fastify.dev/" data-href="https://fastify.dev/" target="_blank"&gt;Fastify&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para expor APIs que comunicam com os agentes. Essa camada de API atua como ponte entre o usuário e a lógica do agente, coordenando mensagens, execuções e chamadas de ferramentas.&lt;/P&gt;
&lt;P data-line="44"&gt;O próprio agente é criado e gerenciado com o SDK&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects, que fornece uma API simples e direta para registrar agentes, definir instruções, anexar ferramentas e controlar execuções. Wassim destacou o quanto essa abordagem reduz a complexidade em comparação a outros frameworks de agentes, que exigem configuração manual de estado, orquestração e controle de contexto.&lt;/P&gt;
&lt;P data-line="46"&gt;Além disso, há uma camada de ferramentas integradas ao serviço que ampliam significamente as capacidades do agente. São elas:&lt;/P&gt;
&lt;UL data-line="48"&gt;
&lt;LI data-line="48"&gt;&lt;STRONG&gt;Code Interpreter&lt;/STRONG&gt;: para execução de código Python em sandbox&lt;/LI&gt;
&lt;LI data-line="49"&gt;&lt;STRONG&gt;Function Calling&lt;/STRONG&gt;: para chamadas de funções definidas pelo usuário&lt;/LI&gt;
&lt;LI data-line="50"&gt;&lt;STRONG&gt;Azure AI Search&lt;/STRONG&gt;: para buscas vetoriais e RAG (Retrieval-Augmented Generation)&lt;/LI&gt;
&lt;LI data-line="51"&gt;&lt;STRONG&gt;Bing Search&lt;/STRONG&gt;: para grounding com dados em tempo real&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;Todas essas ferramentas são disponibilizadas de forma plug-and-play pela infraestrutura do&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Toda essa arquitetura é gerenciada por uma instância do Azure AI Foundry, que centraliza o controle de modelos, ferramentas, conexões e dados, proporcionando uma base robusta, segura e escalável para criar aplicações AI-first. Wassim fez questão de frisar que o agente é o verdadeiro "cérebro" da aplicação - recebendo instruções, raciocionando sobre elas e coordenando a execução de tarefas com auxílio de ferramentas externas, tudo isso com o poucos comandos em JavaScript.&lt;/P&gt;
&lt;H2 data-line="61"&gt;&lt;STRONG&gt;Criando seu primeiro agente: Hands-on com JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P&gt;Durante a demonstração prática, Wassim conduz os participantes por todas as etapas necessárias para criar um agente de IA funcional com JavaScript, utilizando o Azure AI Agent Service. Ele começa destacando que todo o código utilizado está disponível publicamente num repositório no GitHub, o que permite que qualquer pessoa possa clonar, rodar e adaptar os exemplos para seus próprios projetos.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;gt; Link do repositório:&amp;nbsp;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-line="69"&gt;A primeira etapa envolve a instalação dos pacotes essenciais. O principal deles é o SDK&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects&amp;nbsp;(&lt;STRONG&gt;&lt;A href="https://www.npmjs.com/package/@azure/ai-projects" data-href="https://www.npmjs.com/package/@azure/ai-projects" target="_blank"&gt;pacote npm - aqui&lt;/A&gt;&lt;/STRONG&gt;), responsável por toda a interação com o serviço de agentes. Também é necessário instalar o&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/identity, que permite autenticar de forma segura com as credenciais da Azure sem precisar lidar com chaves ou tokens diretamente — utilizando, por exemplo, o&amp;nbsp;DefaultAzureCredential.&lt;/P&gt;
&lt;P data-line="71"&gt;Após configurar o ambiente com as dependências, Wassim mostra como criar uma instância do cliente de agente a partir de uma string de conexão obtida no&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://ai.azure.com/" data-href="https://ai.azure.com/" target="_blank"&gt;portal do Azure Foundry&lt;/A&gt;&lt;/STRONG&gt;. Essa string é armazenada em um arquivo&amp;nbsp;.env, e permite que o código se conecte de forma segura ao serviço para criar e gerenciar agentes.&lt;/P&gt;
&lt;P data-line="73"&gt;Com o cliente em mãos, o próximo passo é criar o agente propriamente dito. Para isso, é necessário definir o nome, o modelo de linguagem a ser usado (como o GPT-4) e fornecer instruções claras sobre o comportamento desejado para o agente — seja para realizar cálculos, responder perguntas, interpretar dados ou interagir com ferramentas externas.&lt;/P&gt;
&lt;P data-line="75"&gt;Na sequência, Wassim introduz o conceito de&amp;nbsp;&lt;EM&gt;thread&lt;/EM&gt;, que funciona como um espaço de conversa entre o agente e o usuário. É nesse thread que as mensagens são armazenadas, as execuções são iniciadas e o histórico de interações é mantido. Ele mostra como criar um thread, enviar uma mensagem e iniciar uma&amp;nbsp;&lt;EM&gt;run&lt;/EM&gt;, ou seja, uma execução do agente a partir da mensagem fornecida.&lt;/P&gt;
&lt;P data-line="77"&gt;A sessão então avança para demonstrar o uso de ferramentas. No primeiro exemplo, o agente resolve uma equação simples apenas com seu conhecimento interno, sem recorrer a ferramentas externas — um exemplo clássico para mostrar como o modelo pode raciocinar com base nas instruções fornecidas. Em seguida, Wassim mostra como ativar uma chamada de função personalizada: o agente acessa uma função que retorna o uso da CPU da máquina local, demonstrando a capacidade de executar ações no ambiente do usuário.&lt;/P&gt;
&lt;P data-line="79"&gt;Outro exemplo impressionante é o uso do&amp;nbsp;&lt;STRONG&gt;Code Interpreter&lt;/STRONG&gt;, uma ferramenta que permite executar código Python remotamente e com segurança. Wassim fornece um arquivo CSV contendo dados de vendas de carros, e o agente não só processa os dados, como também gera visualizações gráficas em tempo real.&lt;/P&gt;
&lt;P data-line="81"&gt;Além disso, ele demonstra como o agente pode utilizar o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Bing Grounding&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para buscar informações atualizadas diretamente da internet, como cotações do mercado de ações. E, por fim, mostra a integração com o Azure AI Search, onde um índice vetorial previamente carregado com informações sobre planos de saúde é consultado para responder perguntas específicas, com direito a citações precisas da fonte utilizada — um ótimo exemplo do padrão RAG (Retrieval-Augmented Generation) em ação.&lt;/P&gt;
&lt;P data-line="83"&gt;Esses exemplos mostram que, mesmo com poucos comandos em JavaScript, é possível criar agentes sofisticados, capazes de interagir com dados, ferramentas e usuários de maneira fluida, segura e produtiva.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="87"&gt;&lt;STRONG&gt;Entendendo a mecânica interna: Como um agente funciona?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="89"&gt;Wassim explica os conceitos fundamentais do ciclo de vida de um agente:&lt;/P&gt;
&lt;UL data-line="91"&gt;
&lt;LI data-line="91"&gt;&lt;EM&gt;Agent&lt;/EM&gt;: configurado com modelo e instruções.&lt;/LI&gt;
&lt;LI data-line="93"&gt;&lt;EM&gt;Thread&lt;/EM&gt;: representa a conversa (contexto).&lt;/LI&gt;
&lt;LI data-line="95"&gt;&lt;EM&gt;Run&lt;/EM&gt;: execução de uma tarefa.&lt;/LI&gt;
&lt;LI data-line="97"&gt;&lt;EM&gt;Run Steps&lt;/EM&gt;: etapas da execução.&lt;/LI&gt;
&lt;LI data-line="99"&gt;&lt;EM&gt;Tools&lt;/EM&gt;: definidas com schemas e acionadas conforme necessário.&lt;/LI&gt;
&lt;LI data-line="101"&gt;&lt;EM&gt;Events&lt;/EM&gt;: eventos emitidos durante a execução (streaming, tool-call, resposta, erro, etc).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="103"&gt;Além disso, ele demonstra um projeto pessoal: uma ferramenta de tracing visual para acompanhar em tempo real cada etapa do agente, o que facilita o entendimento e o debug.&lt;/P&gt;
&lt;H2 data-line="105"&gt;&lt;STRONG&gt;Um pouco sobre as tecnologias utilizadas no projeto&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="107"&gt;Para quem está curioso sobre as tecnologias utilizadas no projeto, Wassim fez questão de destacar algumas delas:&lt;/P&gt;
&lt;UL data-line="109"&gt;
&lt;LI data-line="109"&gt;📦 SDK utilizado
&lt;UL data-line="110"&gt;
&lt;LI data-line="110"&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects@2.0.0-beta.4&lt;/LI&gt;
&lt;LI data-line="111"&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/identity&amp;nbsp;para autenticação com credenciais seguras.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-line="113"&gt;🔧 Ferramentas integradas
&lt;UL data-line="114"&gt;
&lt;LI data-line="114"&gt;Function Calling: executa funções com base na entrada do LLM.&lt;/LI&gt;
&lt;LI data-line="115"&gt;Code Interpreter: executa código Python remotamente com segurança.&lt;/LI&gt;
&lt;LI data-line="116"&gt;Azure AI Search: busca vetorial e full-text com RAG.&lt;/LI&gt;
&lt;LI data-line="117"&gt;Bing Search Grounding: informações em tempo real da web.&lt;/LI&gt;
&lt;LI data-line="118"&gt;File Search (em breve): busca em arquivos carregados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-line="120"&gt;⚙️ Segurança e compliance
&lt;UL data-line="121"&gt;
&lt;LI data-line="121"&gt;Autenticação sem chaves (keyless)&lt;/LI&gt;
&lt;LI data-line="122"&gt;Private Networking (VNet)&lt;/LI&gt;
&lt;LI data-line="123"&gt;Content Filtering&lt;/LI&gt;
&lt;LI data-line="124"&gt;Tracing e logs para evitar alucinações&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="126"&gt;&lt;STRONG&gt;Conclusão: O Futuro dos Agentes de IA com JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="128"&gt;A sessão de Wassim Chegham no&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;foi uma verdadeira aula sobre como criar agentes de IA com JavaScript e Azure AI Agent Service. Ele não só apresentou os conceitos fundamentais, mas também mostrou na prática como é fácil e rápido desenvolver aplicações inteligentes utilizando essa nova abordagem.&lt;/P&gt;
&lt;P data-line="130"&gt;Novamente se você perdeu a sessão, não se preocupe! Você pode assistir a gravação&amp;nbsp;&lt;A href="https://www.youtube.com/watch?v=RNphlRKvmJQ" data-href="https://www.youtube.com/watch?v=RNphlRKvmJQ" target="_blank"&gt;aqui&lt;/A&gt;.&lt;/P&gt;
&lt;P data-line="132"&gt;E, claro , não deixe de conferir o repositório no GitHub com todos os exemplos e códigos utilizados durante a apresentação:&amp;nbsp;&lt;STRONG&gt;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-line="134"&gt;E, no final, Wassim deixou uma mensagem clara: o futuro dos agentes de IA é promissor, e com as ferramentas certas, qualquer desenvolvedor pode criar soluções inovadoras e impactantes. Então, não perca tempo! Comece a explorar o Azure AI Agent Service e crie seu próprio agente de IA hoje mesmo!&lt;/P&gt;
&lt;H2 data-line="136"&gt;&lt;STRONG&gt;Links úteis&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL data-line="138"&gt;
&lt;LI data-line="138"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service&lt;/A&gt;&lt;/STRONG&gt;: Documentação oficial do serviço de agentes de IA da Azure.&lt;/LI&gt;
&lt;LI data-line="139"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Foundry&lt;/A&gt;&lt;/STRONG&gt;: Plataforma para criar e gerenciar agentes de IA.&lt;/LI&gt;
&lt;LI data-line="140"&gt;&lt;STRONG&gt;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;: Repositório GitHub com exemplos e códigos utilizados na sessão.&lt;/LI&gt;
&lt;LI data-line="141"&gt;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;: Evento que reuniu desenvolvedores para explorar o potencial dos agentes de IA.&lt;/LI&gt;
&lt;LI data-line="142"&gt;&lt;STRONG&gt;&lt;A href="https://www.linkedin.com/in/wassimchegham/" data-href="https://www.linkedin.com/in/wassimchegham/" target="_blank"&gt;Wassim Chegham&lt;/A&gt;&lt;/STRONG&gt;: LinkedIn do apresentador da sessão.&lt;/LI&gt;
&lt;LI data-line="143"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/quickstarts/get-started-playground" data-href="https://learn.microsoft.com/azure/ai-foundry/quickstarts/get-started-playground" target="_blank"&gt;Azure AI Foundry - Getting Started&lt;/A&gt;&lt;/STRONG&gt;: Guia para começar a usar o Azure AI Foundry.&lt;/LI&gt;
&lt;LI data-line="144"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/quickstart?WT.mc_id=javascript-00000-gllemos&amp;amp;pivots=programming-language-typescript" data-href="https://learn.microsoft.com/azure/ai-services/agents/quickstart?WT.mc_id=javascript-00000-gllemos&amp;amp;pivots=programming-language-typescript" target="_blank"&gt;Azure AI Agent Service - Quickstart&lt;/A&gt;&lt;/STRONG&gt;: Tutorial rápido para criar seu primeiro agente de IA.&lt;/LI&gt;
&lt;LI data-line="145"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/overview" data-href="https://learn.microsoft.com/azure/ai-services/agents/overview" target="_blank"&gt;Azure AI Agent Service - Tools&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre as ferramentas disponíveis no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="146"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/function-calling?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/function-calling?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Function Calling&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre chamadas de função no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="147"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/code-interpreter?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/code-interpreter?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Code Interpreter&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o interpretador de código no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="148"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/azure-ai-search?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/azure-ai-search?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Azure AI Search&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o Azure AI Search no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="149"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Bing Search&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o Bing Search no serviço de agentes de IA.&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 07 May 2025 17:37:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/crie-seu-primeiro-agente-de-ia-com-javascript-e-azure-ai-agent/ba-p/4411651</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-05-07T17:37:50Z</dc:date>
    </item>
    <item>
      <title>Migração de Aplicações Full Framework para Azure AKS e .NET Core</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/migra%C3%A7%C3%A3o-de-aplica%C3%A7%C3%B5es-full-framework-para-azure-aks-e-net-core/ba-p/4408306</link>
      <description>&lt;H2 data-selectable-paragraph=""&gt;Criando e Abrindo um projeto 4.7.2&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Vou criar o projeto no Visual Studio 2015, usando a versão FULL Framework&amp;nbsp; .NET 4.7 escolhi o template de uma aplicação ASP.NET Web Application. Este é um projeto pequeno, desses que já nascem prontos, vai servir bem para testar as ferramentas de migração.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Depois de criado o projeto, e é importante habilitar essa versão .NET Core no Visual Studio 2022, pois precisaremos abrir o projeto nessa IDE para usar as extensões. Caso você tenha algum projeto pronto em uma versão mais antiga do dotnet então basta usá-lo&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Depois de ter o projeto que vamos migrar, precisei instar o dotnet-appcat conforme essa doc &lt;A href="https://learn.microsoft.com/en-us/azure/migrate/appcat/dotnet" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment for .NET — Azure Migrate | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A documentação pende a instalando dessa extensão no visual studio &lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.appcat" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment — Visual Studio Marketplace&lt;/A&gt; depois disso podemos abri o projeto pelo Visual Studio 2022 e já e vamos encontrar a opção &lt;STRONG&gt;re-plataform to Azure&lt;/STRONG&gt; clicando com botão direito no projeto ou na solution.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Se escolhermos clicar na solution o item &lt;STRONG&gt;re-plataform to Azure&amp;nbsp;&lt;/STRONG&gt;disponibilizara&amp;nbsp;a opção new report&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Então vamos escolher para qual o tipo de computação a aplicação vai ser migrada&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;E como escolhemos a solution, agora vamos selecionar os projetos que queremos analisar&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Um relatório com as issues será apresentado&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;entramos na issue e podemos ver a opção de perguntar para o copilot&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Resposta do copilot para um issue especifica&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;E é isso basta ir resolvendo as issues, com essa ferramenta você pode verificar o código-fonte, configurações e binários da sua aplicação para encontrar oportunidades de migração para o Azure. Ele vai ajudar a identificar problemas ao mover sua aplicação para o Azure e melhora o desempenho, escalabilidade e segurança, sugerindo soluções modernas e nativas da nuvem.&lt;/P&gt;
&lt;H1 data-selectable-paragraph=""&gt;NET Upgrade Assistant&lt;/H1&gt;
&lt;P data-selectable-paragraph=""&gt;Agora vamos pensar na migração do código, antigamente eu utilizava um cara chamado Portability Analyzer &lt;A href="https://learn.microsoft.com/pt-br/dotnet/standard/analyzers/portability-analyzer" target="_blank" rel="noopener"&gt;O .NET Portability Analyzer — .NET — .NET | Microsoft Learn&lt;/A&gt;, mas ele foi descontinuado e no lugar agora temos o &lt;STRONG&gt;Assistente de Atualização do .NET&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Vou escolher um projeto por vez, clicando com o botão direito sobre o projeto e selecionando a opção 'update'. Esse método, em vez de gerar um relatório com as issues, tenta uma conversão direta de código. Na maioria das vezes, ele apenas faz o retarget, mas mesmo assim ajuda&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;No caso de um projeto WEB, a melhor opção é criar um novo projeto, pois ele vai criar uma espécie de proxy para permitir a migração paralela dos controllers&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Selecionar o framework para 8&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O assistente vai criar o projeto .net core, mas apenas uma casca, sem ter migrado ó código de fato&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A partir disso, precisamos voltar ao projeto original onde começamos a migração e clicar novamente em '&lt;STRONG&gt;update&lt;/STRONG&gt;' usando o botão direito sobre esse projeto. Então, será possível migrar controller por controller. Cada controller migrada leva consigo suas dependência&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Escolher a solution&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Também podemos escolher a solution que contém vários projetos. Nesse caso, vou clicar na solution e não no projeto. Veja que agora, em vez de converter, ele me dá a opção de criar um relatório.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;e então ele analisa projeto por projeto e gera as issues para serem corrigidas&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;aqui também consegui pedir ajuda do copilot paras as issues, e assim fica muito mais prático do que o Portability Analyzer&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O Assistente de Atualização do .NET ajuda a atualizar projetos para versões mais recentes do .NET e analisa seu código para detectar e corrigir possíveis incompatibilidades. Um foco da ferramenta é ajudar a migrar um projeto do .NET Framework, .NET Core ou .NET para a versão mais recente do .NET. Você usa a extensão ou a ferramenta para atualizar projetos inteiros do .NET ou algum aspecto do projeto, como a migração de um arquivo de configuração de um tipo mais antigo para um tipo mais recente.&lt;/P&gt;
&lt;H1 data-selectable-paragraph=""&gt;Podemos utilizar a CLI&lt;/H1&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant --help&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;para iniciar o assistente use o comando&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant upgrade&lt;/LI-CODE&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Script para fazer vários projetos&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant upgrade# Defina o diretório raiz $rootDir = "..." $destDir = "..." # Obtenha todos os arquivos .csproj no diretório raiz e subdiretórios $csprojFiles = Get-ChildItem -Path $rootDir -Recurse -Filter *.csproj # Execute o comando upgrade-assistant para cada arquivo .csproj foreach ($file in $csprojFiles) { Write-Host "Executando upgrade-assistant para $($file.FullName)" Start-Process -FilePath "upgrade-assistant" -ArgumentList "upgrade $($file.FullName) --operation Inplace --targetFramework net8.0 --destination ${destDir} " -Wait }&lt;/LI-CODE&gt;
&lt;H2 data-selectable-paragraph=""&gt;Referência&lt;/H2&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/migrate/appcat/dotnet" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment for .NET — Azure Migrate | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://dotnet.microsoft.com/pt-br/download/dotnet-framework" target="_blank" rel="noopener"&gt;Baixar .NET Framework | Downloads oficiais gratuitos&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/dotnet/standard/analyzers/portability-analyzer" target="_blank" rel="noopener"&gt;O .NET Portability Analyzer — .NET — .NET | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/en-us/dotnet/core/porting/upgrade-assistant-overview" target="_blank" rel="noopener"&gt;.NET Upgrade Assistant Overview — .NET Core | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.upgradeassistant" target="_blank" rel="noopener"&gt;.NET Upgrade Assistant — Visual Studio Marketplace&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.appcat" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment — Visual Studio Marketplace&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://wilsonsantosnet.medium.com/migra%C3%A7%C3%A3o-net-core-2-2-3-1-d92f67d71d73" target="_blank" rel="noopener"&gt;Migração dotnet core 2.2 para 3.1 | by Wilson Santos | Medium&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;</description>
      <pubDate>Mon, 28 Apr 2025 12:18:09 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/migra%C3%A7%C3%A3o-de-aplica%C3%A7%C3%B5es-full-framework-para-azure-aks-e-net-core/ba-p/4408306</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2025-04-28T12:18:09Z</dc:date>
    </item>
    <item>
      <title>Destaques do VS Code Live: Agent Mode Day</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/destaques-do-vs-code-live-agent-mode-day/ba-p/4406750</link>
      <description>&lt;div data-video-id="https://www.youtube.com/watch?v=HNly8eNtCtA/1745347578164" data-video-remote-vid="https://www.youtube.com/watch?v=HNly8eNtCtA/1745347578164" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FHNly8eNtCtA%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DHNly8eNtCtA&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FHNly8eNtCtA%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;&lt;STRONG&gt;🎙️ Palestrantes:&amp;nbsp;&lt;/STRONG&gt;&lt;A href="https://x.com/OliviaGuzzardo" target="_blank" rel="noopener"&gt;Olivia McVicker&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/cassidoo" target="_blank" rel="noopener"&gt;Cassidy Williams&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/burkeholland" target="_blank" rel="noopener"&gt;Burke Holland&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/digitarald" target="_blank" rel="noopener"&gt;Harald Kirschner&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/toby" target="_blank" rel="noopener"&gt;Toby Padilla&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/roblourens" target="_blank" rel="noopener"&gt;Rob Lourens&lt;/A&gt;,&amp;nbsp;&lt;A href="https://www.linkedin.com/in/timrogers1/" target="_blank" rel="noopener"&gt;Tim Rogers&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/JamesMontemagno" target="_blank" rel="noopener"&gt;James Montemagno&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/donjayamanne" target="_blank" rel="noopener"&gt;Don Jayamanne&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/BrigitMurtaugh" target="_blank" rel="noopener"&gt;Brigit Murtaugh&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/geektrainer" target="_blank" rel="noopener"&gt;Chris Harrison&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;O que é o Agent Mode?&lt;/H2&gt;
&lt;P&gt;O Agent Mode no VS Code representa um avanço além da tradicional sugestão de código por IA. Em vez de apenas sugerir trechos de código, o Agent Mode permite que a IA:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Escreva, edite e itere sobre o código&lt;/LI&gt;
&lt;LI&gt;Execute comandos no terminal de forma autônoma&lt;/LI&gt;
&lt;LI&gt;Corrija seus próprios erros durante o fluxo de trabalho&lt;/LI&gt;
&lt;LI&gt;Interaja com ferramentas externas, APIs e serviços&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Isso cria um parceiro de codificação mais dinâmico e “agente”, capaz de automatizar tarefas complexas, reduzir intervenções manuais e manter o desenvolvedor no fluxo. O Agent Mode está disponível diretamente no VS Code e se integra perfeitamente ao GitHub Copilot, tornando recursos avançados de IA acessíveis a desenvolvedores de todos os níveis.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;1. Model Context Protocol (MCP)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O MCP é um protocolo aberto que padroniza como aplicações fornecem contexto para Modelos de Linguagem de Grande Escala (LLMs). Ele serve como uma ponte, permitindo que agentes de IA no VS Code se conectem de forma segura a um vasto ecossistema de ferramentas, APIs e recursos internos — muito além do que está disponível nativamente.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Principais pontos sobre o MCP:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Abordagem de ecossistema: permite conectar Copilot e outros agentes a tudo que for necessário — documentação interna, bancos de dados, ferramentas de design como Figma, etc.&lt;/LI&gt;
&lt;LI&gt;Aberto e extensível: qualquer pessoa pode criar e compartilhar novas integrações, com milhares de servidores MCP já disponíveis.&lt;/LI&gt;
&lt;LI&gt;Encadeamento de ferramentas: servidores MCP podem ser combinados, permitindo que a IA automatize fluxos de trabalho que envolvem múltiplas ferramentas.&lt;/LI&gt;
&lt;LI&gt;Seguro e em evolução: o protocolo está evoluindo para suportar autenticação mais segura e facilitar a descoberta e instalação de integrações.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;STRONG&gt;2. Next Edit Suggestions (NES)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O Next Edit Suggestions (NES) é um recurso projetado para aprimorar a experiência de edição, oferecendo recomendações contextuais para mudanças no código. O NES auxilia desenvolvedores sugerindo edições relevantes com base no contexto atual, apoiando tarefas como refatoração, correção de bugs e adição de funcionalidades. Ele permite aceitar, desfazer ou iterar rapidamente sobre mudanças sugeridas pela IA, mantendo o controle total sobre o código.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;3. Bring Your Own Key (BYOK): Integração de Modelos de IA Personalizados&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O BYOK permite que usuários conectem suas próprias chaves de API para modelos de IA personalizados, incluindo OpenAI, Anthropic ou até modelos locais. Com o BYOK, desenvolvedores podem escolher entre vários modelos, integrar soluções locais ou em nuvem por motivos de privacidade, custo ou desempenho, e adaptar a experiência da IA às suas necessidades específicas.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;4. &lt;/STRONG&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;O Futuro Agente&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Uma prévia do “Project Padawan” mostrou que fluxos de trabalho agentes poderão rodar de forma assíncrona na nuvem. Será possível delegar tarefas ao Copilot (como resolver issues do GitHub), que criará pull requests, executará testes e iterará sobre feedbacks de forma autônoma, enquanto o desenvolvedor foca em outras atividades.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;STRONG&gt;GitHub Copilot Skills Challenge&lt;BR /&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Quer aprender e experimentar o Agent Mode do GitHub Copilot enquanto conquista um Selo Digital? Participe do GitHub Copilot Skills Challenge — uma experiência prática de aprendizado no Microsoft Learn, onde você construirá um aplicativo Python usando o Agent Mode por meio de um tutorial guiado. Complete o desafio até 30 de abril de 2025 para ganhar seu selo!&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Confira as regras oficiais:&amp;nbsp;&lt;A href="https://aka.ms/csc/terms" target="_blank" rel="noopener"&gt;https://aka.ms/csc/terms&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Inscreva-se no Desafio: &lt;A href="https://aka.ms/csc/githubcopilot" target="_blank" rel="noopener"&gt;https://aka.ms/csc/githubcopilot&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Solicite seu selo em: &lt;A href="https://aka.ms/getyourbadge" target="_blank" rel="noopener"&gt;https://aka.ms/getyourbadge&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Como começar&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://aka.ms/AAvrhq0" target="_blank"&gt;Ative o Agent Mode &lt;/A&gt;— disponível nas versões estável e insiders do VS Code — para experimentar esses recursos avançados de IA. Explore integrações MCP navegando pela lista de servidores ou criando o seu próprio com os SDKs disponíveis.&lt;/P&gt;
&lt;P&gt;Quer ver essas funcionalidades em ação? Assista ao stream completo para demonstrações ao vivo, dicas de especialistas e marque a data para o próximo episódio da nossa série VS Code Live: &lt;A class="lia-external-url" href="https://aka.ms/VSCode/Live" target="_blank"&gt;https://aka.ms/VSCode/Live&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Happy coding!&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 22 Apr 2025 19:04:13 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/destaques-do-vs-code-live-agent-mode-day/ba-p/4406750</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-04-22T19:04:13Z</dc:date>
    </item>
    <item>
      <title>Modo Agente disponível para todos os usuários do VS Code e com suporte a MCP</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/modo-agente-dispon%C3%ADvel-para-todos-os-usu%C3%A1rios-do-vs-code-e-com/ba-p/4401754</link>
      <description>&lt;P&gt;&lt;STRONG&gt;O Modo Agente está sendo lançado para todos os usuários do VS Code! &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O agente atua como um programador autônomo que realiza tarefas de codificação em várias etapas sob seu comando, como analisar sua base de código, propor edições de arquivos e executar comandos no terminal. Ele responde a erros de compilação e lint, monitora a saída do terminal e corrige automaticamente em um loop até que a tarefa seja concluída.&lt;/P&gt;
&lt;P&gt;O agente também pode usar ferramentas contribuídas, permitindo que ele interaja com servidores MCP externos ou extensões do VS Code para realizar uma ampla variedade de tarefas.&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/GCTap89a8Fw/1744060633299" data-video-remote-vid="https://youtu.be/GCTap89a8Fw/1744060633299" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FGCTap89a8Fw%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGCTap89a8Fw&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FGCTap89a8Fw%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;H2&gt;&lt;STRONG&gt;Disponível para todos os usuários&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Abra a visualização de Chat, faça login no GitHub, configure&amp;nbsp;chat.agent.enabled&amp;nbsp;nas suas configurações e selecione Agente no menu suspenso do modo de Chat. Se você não vir a configuração, certifique-se de recarregar o VS Code após atualizar para a versão mais recente. Nas próximas semanas, estamos lançando isso por padrão para todos - nenhuma configuração será necessária.&lt;/P&gt;
&lt;P&gt;O modo Agente é ótimo para cenários onde:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Sua tarefa envolve várias etapas. O agente edita o código, executa comandos no terminal, monitora erros e itera para resolver quaisquer problemas que surgirem.&lt;/LI&gt;
&lt;LI&gt;Você não tem certeza sobre o escopo das mudanças. O agente determina automaticamente os arquivos e o contexto relevantes.&lt;/LI&gt;
&lt;LI&gt;Sua tarefa requer interação com aplicativos ou dados externos. O agente se integra com servidores MCP e extensões do VS Code.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Por outro lado, use o modo de edição quando a tarefa tiver um escopo bem definido, você quiser uma resposta rápida ou quiser um controle mais preciso sobre o número de solicitações ao LLM.&lt;/P&gt;
&lt;P&gt;Criamos uma experiência de chat unificada, combinando as visualizações de Chat e Edições, que traz benefícios como histórico de sessões, mover o chat para uma janela separada e simplificação da visualização do Conjunto de Trabalho. Tudo isso agora também está disponível no modo Agente.&lt;/P&gt;
&lt;P&gt;Continuamos a receber um feedback fantástico dos usuários (&lt;A href="http://github.com/microsoft/vscode-copilot-release/issues/" target="_blank"&gt;por favor, continuem enviando!&lt;/A&gt;), o que inspirou muitas das melhorias que fizemos. Mais notavelmente:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A ação de desfazer agora reverte as mudanças até a última chamada da ferramenta de edição de arquivos.&lt;/LI&gt;
&lt;LI&gt;Suporte para múltiplas sessões de agente no mesmo workspace (melhor quando as sessões de edição não modificam os mesmos arquivos).&lt;/LI&gt;
&lt;LI&gt;O agente agora pode criar e editar notebooks.&lt;/LI&gt;
&lt;LI&gt;A capacidade de aprovar automaticamente chamadas de ferramentas (aprovação automática de terminal chegando em abril).&lt;/LI&gt;
&lt;LI&gt;Uma série de melhorias na qualidade de vida e correções de bugs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Tanto as experiências de perguntar quanto de editar estão evoluindo para uma arquitetura que, como o agente, utiliza ferramentas. Estamos fazendo essa mudança para unificar os modos de perguntar/editar/agente para serem todos agenticos, com o objetivo de suavizar a experiência geral do usuário. Isso permite que o modo de edição use a ferramenta de edição de arquivos para melhorar a velocidade, e os modos de edição e pergunta usem #codebase, uma busca agentica na base de código. Consequentemente, modelos de linguagem sem suporte para chamadas de ferramentas não estarão mais disponíveis no modo de edição.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Extensível: Servidores MCP e Extensões do VS Code&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Assim como as extensões do VS Code permitem que você personalize seus fluxos de trabalho específicos, a extensibilidade do agente permite que você adapte o agente às suas necessidades. Com a extensibilidade, o agente pode realizar ações no navegador (depuração web com IA), conectar-se aos seus aplicativos de chat e de anotações, interagir com seus bancos de dados, obter contexto do seu sistema de design, obter problemas e contexto de repositório do GitHub e integrar-se com suas plataformas de nuvem. O poder do modo agente está na diversidade de ferramentas disponíveis e na flexibilidade de adicionar e remover ferramentas conforme necessário. Estamos lançando a extensibilidade em preview e disponível para todos os usuários.&lt;/P&gt;
&lt;P&gt;O modo agente pode usar as seguintes ferramentas:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Ferramentas integradas contribuídas pelo VS Code (azul no diagrama), que permitem ao agente pesquisar no workspace, aplicar mudanças de código, executar comandos no terminal, capturar erros de compilação ou linting do editor, buscar conteúdo de sites (#fetch para acionar manualmente), e mais.&lt;/LI&gt;
&lt;LI&gt;Ferramentas contribuídas por servidores MCP (verde no diagrama).&lt;/LI&gt;
&lt;LI&gt;Ferramentas contribuídas por extensões do VS Code (verde no diagrama).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Quando a equipe do VS Code inventou o &lt;A href="https://microsoft.github.io/language-server-protocol/" target="_blank"&gt;Protocolo de Servidor de Linguagem (LSP)&lt;/A&gt; em &lt;A href="https://code.visualstudio.com/blogs/2016/06/27/common-language-protocol" target="_blank"&gt;2016&lt;/A&gt;, nosso objetivo era padronizar como os servidores de linguagem se comunicam com as ferramentas de desenvolvimento. Estamos orgulhosos de que o LSP se tornou um padrão amplamente adotado e cumpriu nossa visão. Recentemente, as &lt;A href="https://x.com/dsp_/status/1897821339332882617" target="_blank"&gt;ideias por trás do LSP&lt;/A&gt; inspiraram um novo protocolo: o &lt;A href="https://modelcontextprotocol.io/introduction" target="_blank"&gt;Protocolo de Contexto de Modelo (MCP)&lt;/A&gt;, que padroniza como as aplicações fornecem contexto para LLMs. Com o modo agente no VS Code usando ferramentas contribuídas por servidores MCP, agora completamos o ciclo de volta ao VS Code.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;É sobre controle do desenvolvedor&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Nem toda tarefa precisa de todas as ferramentas que você pode ter adicionado ao modo agente, e como em qualquer fluxo de trabalho de IA, ser específico leva a melhores resultados. Recomendamos usar a interface de ferramentas para gerenciar e habilitar as ferramentas necessárias para cada cenário ou referenciar explicitamente as ferramentas em seu prompt digitando&lt;STRONG&gt; #&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Para lhe dar total controle, cada invocação de ferramenta é exibida de forma transparente na interface e requer sua aprovação (exceto para ferramentas integradas de leitura). Você pode permitir uma ferramenta específica para a sessão atual, workspace ou todas as invocações futuras. Se você quiser minimizar interrupções permitindo sempre que o agente use todas as ferramentas, enquanto ainda mantém a segurança, considere usar a extensão &lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank"&gt;Dev Containers&lt;/A&gt;. Isso isola todas as mudanças feitas pelo agente dentro do ambiente do contêiner até certo ponto (por exemplo, o agente ainda pode enviar mudanças para o remoto se você permitir).&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Comece agora&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Para personalizar o agente para seus fluxos de trabalho, selecione o ícone de &lt;STRONG&gt;"Ferramentas"&lt;/STRONG&gt; na entrada do chat e siga o fluxo &lt;STRONG&gt;Adicionar Mais Ferramentas&lt;/STRONG&gt;.... Alternativamente, &lt;A href="https://aka.ms/vscode-add-mcp" target="_blank"&gt;leia nossa documentação do servidor MCP&lt;/A&gt;, que explica o formato de configuração, como adicionar um servidor MCP ou como importar servidores MCP de um aplicativo cliente MCP existente, como o Claude Desktop. O VS Code suporta entrada/saída padrão local (&lt;STRONG&gt;stdio&lt;/STRONG&gt;) e eventos enviados pelo servidor (&lt;STRONG&gt;sse&lt;/STRONG&gt;) para transporte de servidor MCP.&lt;/P&gt;
&lt;P&gt;O &lt;A href="https://github.com/modelcontextprotocol/servers" target="_blank"&gt;repositório oficial de servidores do MCP&lt;/A&gt; é um ótimo ponto de partida para servidores oficiais e contribuídos pela comunidade que mostram a versatilidade do MCP. Para instalar extensões que contribuem com ferramentas, abra a visualização de Extensões e pesquise usando a tag &lt;STRONG&gt;@tag:language-model-tools.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Como desenvolvedor, você pode estender o agente criando um servidor MCP, ou se você é um autor de extensão, pode &lt;A href="https://marketplace.visualstudio.com/search?term=%40tag%3Alanguage-model-tools&amp;amp;target=VSCode&amp;amp;category=All%20categories&amp;amp;sortBy=Relevance"&gt;contribuir com ferramentas&lt;/A&gt; para sua extensão do VS Code. Consulte &lt;A href="https://code.visualstudio.com/docs/copilot/copilot-extensibility-overview" target="_blank"&gt;estes documentos&lt;/A&gt; para orientações e melhores práticas sobre como escrever ferramentas.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;O que vem a seguir&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O modo Agente está melhorando a cada dia, e para estar entre os primeiros a se beneficiar, considere instalar o &lt;A href="https://code.visualstudio.com/insiders/" target="_blank"&gt;VS Code Insiders&lt;/A&gt;. Usar o VS Code Insiders e fornecer feedback em &lt;A href="http://github.com/microsoft/vscode-copilot-release/issues/" target="_blank"&gt;nosso repositório&lt;/A&gt; é a melhor maneira de nos ajudar a melhorar o produto. Em seguida, planejamos trabalhar em:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Suporte para modos personalizados com conjuntos de ferramentas e &lt;A href="https://code.visualstudio.com/docs/copilot/copilot-customization" target="_blank"&gt;instruções personalizadas&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Uma experiência de aplicação de código mais rápida&lt;/LI&gt;
&lt;LI&gt;Expandir o suporte MCP de ferramentas para prompts, recursos e as atualizações mais recentes das especificações&lt;/LI&gt;
&lt;LI&gt;Transmissão de edições limitada a blocos de código alterados para melhorar a velocidade&lt;/LI&gt;
&lt;LI&gt;Pontos de verificação para voltar facilmente a uma etapa específica na sua sessão de modo agente&lt;/LI&gt;
&lt;LI&gt;Melhorias gerais de desempenho e qualidade de serviço&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Certifique-se de estar na versão mais recente do VS Code Stable, configure&amp;nbsp;&lt;STRONG&gt;chat.agent.enabled&lt;/STRONG&gt;&amp;nbsp;nas suas configurações e selecione &lt;STRONG&gt;Agente &lt;/STRONG&gt;no menu suspenso do modo. Experimente hoje e nos diga o que você acha! Você pode encontrar a &lt;A href="https://aka.ms/vscode-copilot-agent" target="_blank"&gt;documentação aqui.&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 07 Apr 2025 21:17:34 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/modo-agente-dispon%C3%ADvel-para-todos-os-usu%C3%A1rios-do-vs-code-e-com/ba-p/4401754</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-04-07T21:17:34Z</dc:date>
    </item>
    <item>
      <title>Aprenda IA Generativa com JavaScript: Curso Gratuito e Interativo! 💡🤖</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aprenda-ia-generativa-com-javascript-curso-gratuito-e-interativo/ba-p/4399822</link>
      <description>&lt;P&gt;No vídeo mais recente do meu&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.youtube.com/@GlauciaLemos" data-href="https://www.youtube.com/@GlauciaLemos" target="_blank"&gt;Canal do YouTube&lt;/A&gt;&lt;/STRONG&gt;, o time de Advocacia de JavaScript + A.I da Microsoft apresenta uma iniciativa inovadora para desenvolvedores que querem dar os primeiros passos com Inteligência Artificial: o curso gratuito&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/microsoft/generative-ai-with-javascript" data-href="https://github.com/microsoft/generative-ai-with-javascript" target="_blank"&gt;Generative AI with JavaScript&lt;/A&gt;&lt;/STRONG&gt;. Combinando aprendizado técnico com uma experiência gamificada, o curso é uma excelente porta de entrada para quem deseja explorar IA Generativa usando JavaScript/TypeScript.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Vamos falar um pouco mais sobre o curso e como ele pode ajudar você a se tornar um desenvolvedor mais habilidoso e atualizado com as últimas tendências em tecnologia.&lt;/P&gt;
&lt;H2 data-line="10"&gt;&lt;STRONG&gt;Sobre o Curso: Generative AI with JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Gravei um vídeo onde explico os principais conceitos abordados no curso, incluindo técnicas de IA Generativa, exemplos práticos e dicas para maximizar seu aprendizado. Se você não assistiu, deixo o link abaixo&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://youtu.be/LfmtHe4oJm4?si=_wgnFrs4Lhyuj_Gx" data-href="https://youtu.be/LfmtHe4oJm4?si=_wgnFrs4Lhyuj_Gx" target="_blank"&gt;em português, com legendas em inglês&lt;/A&gt;.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://www.youtube.com/watch?v=LfmtHe4oJm4" data-video-remote-vid="https://www.youtube.com/watch?v=LfmtHe4oJm4" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FLfmtHe4oJm4%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DLfmtHe4oJm4&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FLfmtHe4oJm4%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P data-line="16"&gt;O vídeo começa com uma introdução ao repositório do curso,&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/microsoft/generative-ai-with-javascript" data-href="https://github.com/microsoft/generative-ai-with-javascript" target="_blank"&gt;hospedado na organização oficial da Microsoft no GitHub&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-line="18"&gt;O curso propõe uma abordagem única, utilizando o conceito de viagens no tempo, onde você interage com personagens históricos como Leonardo da Vinci, Ada Lovelace, Montezuma e muitos outros, enquanto aprende os fundamentos de IA.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Essa narrativa envolvente é suportada por conteúdo técnico sólido. Cada lição contém material didático em formato de leitura, desafios práticos com exercícios e quizzes, além de um aplicativo complementar onde você pode conversar com os personagens históricos usando modelos de linguagem (LLMs). A combinação de storytelling e tecnologia torna o processo de aprendizado imersivo e acessível.&lt;/P&gt;
&lt;H2 data-line="26"&gt;&lt;STRONG&gt;A experiencia do Curso&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Durante o vídeo, eu fiz uma tour completa pelo repositório, destacando que o curso ainda está em inglês &lt;STRONG&gt;(&lt;A href="https://github.com/microsoft/generative-ai-with-javascript/blob/main/lessons/01-intro-to-genai/translations/README.pt-br.md" data-href="https://github.com/microsoft/generative-ai-with-javascript/blob/main/lessons/01-intro-to-genai/translations/README.pt-br.md" target="_blank"&gt;agora já está disponível em português&lt;/A&gt;!!)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="32"&gt;O curso está estruturado em cinco lições iniciais, com a promessa de atualizações frequentes, acompanhando a evolução acelerada do campo de IA Generativa. Hoje falamos de RAG (Retrieval Augmented Generation), amanhã já estamos explorando Model Context Protocol e agentes inteligentes. Por isso, o repositório deve ser visto como um projeto vivo e em constante expansão.&lt;/P&gt;
&lt;P data-line="34"&gt;Para começar a estudar o curso, você pode tanto clonar o repositório localmente quanto usar o GitHub Codespaces, uma alternativa recomendada no vídeo. Com 60 horas gratuitas por mês, o Codespaces permite iniciar o ambiente de desenvolvimento completo direto do navegador, sem necessidade de instalações locais. Essa praticidade democratiza o acesso ao conteúdo, especialmente para quem tem recursos limitados.&lt;/P&gt;
&lt;P data-line="36"&gt;Uma vez dentro do Codespaces, você encontrará um ambiente pré-configurado com todas as dependências necessárias para executar os exemplos e desafios do curso. O repositório contém um arquivo&amp;nbsp;&lt;STRONG&gt;README.md&lt;/STRONG&gt;&amp;nbsp;com instruções detalhadas sobre como configurar o ambiente, além de links para o aplicativo complementar e outros recursos úteis.&lt;/P&gt;
&lt;P data-line="38"&gt;Na primeira lição, por exemplo, os alunos aprendem sobre os fundamentos da IA Generativa e os LLMs, explorando suas aplicações e limitações no contexto de desenvolvimento com JavaScript. Além do conteúdo textual, há um vídeo introdutório e slides complementares, oferecendo múltiplas formas de aprendizado.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="42"&gt;&lt;STRONG&gt;Um Curso com Personagens Históricos!&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="44"&gt;Um dos pontos altos do curso é o &lt;STRONG&gt;Characters App&lt;/STRONG&gt;, uma aplicação interativa que simula conversas com figuras históricas utilizando LLMs. O vídeo mostra como rodar essa aplicação diretamente no Codespaces, bastando navegar até a pasta correta, executar os comandos&amp;nbsp;&lt;EM&gt;npm install&lt;/EM&gt;&amp;nbsp;e&amp;nbsp;&lt;EM&gt;npm run start&lt;/EM&gt;, e abrir a porta&amp;nbsp;&lt;EM&gt;3000&lt;/EM&gt;&amp;nbsp;no navegador integrado.&lt;/P&gt;
&lt;P data-line="46"&gt;Ao iniciar o app, os usuários podem escolher personagens como Dinocrates de Alexandria, Leonardo da Vinci, Ludovico Sforza, Montezuma e Ada Lovelace. Cada um responde com sua personalidade e contexto histórico, permitindo ao aluno experimentar diferentes estilos de interação com IA.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;A experiência é enriquecida com suporte a voz, dando ainda mais vida aos personagens e estimulando uma forma lúdica de compreender os conceitos de IA. É uma abordagem que combina aprendizado técnico com imersão cultural e histórica.&lt;/P&gt;
&lt;H2 data-line="52"&gt;&lt;STRONG&gt;Aprendizado Guiado com Exercícios&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Outro aspecto importante do curso é que ele não se limita a conceitos teóricos. Cada lição vem acompanhada de exercícios práticos, que desafiam o aluno a aplicar o que foi aprendido. O vídeo mostra onde localizar esses desafios e como encontrar as soluções propostas, o que ajuda tanto quem está começando quanto quem quer revisar seus conhecimentos.&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="58"&gt;A ideia é que você realmente se envolva com o conteúdo. Ao invés de apenas consumir o que está pronto, você é incentivado a tentar resolver os problemas por conta própria antes de consultar a solução. Essa abordagem ativa favorece a retenção do conhecimento.&lt;/P&gt;
&lt;P data-line="60"&gt;Além disso, há dicas úteis para configurar o ambiente, usar o GitHub Copilot e aproveitar as requisições gratuitas de modelos como Claude, Gemini e GPT-4o. O vídeo reforça que, hoje em dia, há múltiplas opções para quem deseja aprender e experimentar com IA sem precisar gastar dinheiro, entre elas o uso do GitHub Models!&lt;/P&gt;
&lt;H2 data-line="62"&gt;&lt;STRONG&gt;Conclusão&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="64"&gt;Fica o convite! Explore o curso com calma, interaja com os personagens, faça os exercícios e acompanhe todas as atualizações direto no repositório do curso. Assim, você estará sempre à frente no aprendizado de IA Generativa com JavaScript/TypeScript&lt;/P&gt;
&lt;P data-line="66"&gt;Se você ainda não explorou o curso, essa é a hora. Dê&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/microsoft/generative-ai-with-javascript/fork" data-href="https://github.com/microsoft/generative-ai-with-javascript/fork" target="_blank"&gt;um fork no repositório&lt;/A&gt;&lt;/STRONG&gt;, experimente o curso direto no&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/features/codespaces" data-href="https://github.com/features/codespaces" target="_blank"&gt;Codespaces&lt;/A&gt;&lt;/STRONG&gt;, converse com Da Vinci ou Ada Lovelace, e comece a construir seu próprio conhecimento em IA Generativa com JavaScript.&lt;/P&gt;
&lt;P data-line="68"&gt;Você está há um passo de se tornar expert em IA Generativa com JAvaScript - comece agora mesmo com um simples git clone!&lt;/P&gt;</description>
      <pubDate>Wed, 02 Apr 2025 00:27:37 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aprenda-ia-generativa-com-javascript-curso-gratuito-e-interativo/ba-p/4399822</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-04-02T00:27:37Z</dc:date>
    </item>
    <item>
      <title>Use IA de Graça com GitHub Models e TypeScript! 💸💸💸</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/use-ia-de-gra%C3%A7a-com-github-models-e-typescript/ba-p/4399817</link>
      <description>&lt;P data-line="6"&gt;A Inteligência Artificial está se tornando cada vez mais acessível para desenvolvedores. Porém, um dos maiores desafios ainda é o custo das APIs de modelos avançados, como GPT-4o e tantos outros. Felizmente, o&amp;nbsp;&lt;EM&gt;GitHub Models&lt;/EM&gt;&amp;nbsp;veio para mudar esse cenário! Agora, você pode experimentar IA de graça, sem precisar de uma chave de API paga ou baixar modelos pesados em suas máquinas locais.&lt;/P&gt;
&lt;P data-line="8"&gt;Neste artigo, vamos explicar em detalhes o que é o&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;e como utilizar gratuitamente com&amp;nbsp;&lt;STRONG&gt;TypeScript&lt;/STRONG&gt;&amp;nbsp;em um projeto prático. Escolhemos como exemplo o projeto&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" data-href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;, um projeto open source de microblog com funcionalidades de IA.&lt;/P&gt;
&lt;P data-line="10"&gt;Iremos abordar a estrutura desse projeto e demonstrar passo a passo como integrar com o GitHub Models, substituindo a necessidade de fazer uso de LLMs pagos, incluindo comparações de código&amp;nbsp;&lt;STRONG&gt;antes e depois&lt;/STRONG&gt;&amp;nbsp;das modificações. Também veremos como configurar e executar o projeto localmente, e discutiremos as vantagens e limitações do GitHub Models para prototipagem de projetos em IA.&lt;/P&gt;
&lt;P data-line="12"&gt;Pode ter certeza que, ao final deste artigo, você terá uma compreensão sólida do&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;e como utilizá-lo em seus próprios projetos e começar a explorar o mundo da IA de forma acessível e gratuita.&lt;/P&gt;
&lt;P data-line="14"&gt;Vamos lá!&lt;/P&gt;
&lt;H2 data-line="16"&gt;&lt;STRONG&gt;O que é o GitHub Models?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="20"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://docs.github.com/en/github-models" data-href="https://docs.github.com/en/github-models" target="_blank"&gt;GitHub Models&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;é uma iniciativa do GitHub que disponibiliza uma coleção de modelos de IA prontos para uso, integrados à plataforma. Pense no GitHub Models como um&amp;nbsp;&lt;EM&gt;Marketplace de Modelos de IA&lt;/EM&gt;: onde os desenvolvedores podem descobrir modelos de linguagem grande (LLMs) de diferentes provedores, testar suas capacidades em um playground interativo e incorporar em suas aplicações de forma simplificada.&lt;/P&gt;
&lt;P data-line="22"&gt;Há modelos de diversas origens e portes - por exemplo, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://platform.openai.com/docs/models/gpt-4o" data-href="https://platform.openai.com/docs/models/gpt-4o" target="_blank"&gt;OpenAI GPT-4o&lt;/A&gt;&lt;/STRONG&gt;, modelos Open Source como o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.llama.com/" data-href="https://www.llama.com/" target="_blank"&gt;Meta Llama 3.1&lt;/A&gt;&lt;/STRONG&gt;, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://azure.microsoft.com/products/phi?WT.mc_id=javascript-00000-gllemos" data-href="https://azure.microsoft.com/products/phi?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Phi-3&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;da Microsoft, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://mistral.ai/news/mistral-large-2407" data-href="https://mistral.ai/news/mistral-large-2407" target="_blank"&gt;Mistral Large 2&lt;/A&gt;&lt;/STRONG&gt;, entre outros. Todos podem ser acessados gratuitamente para fins de experimentação.&lt;/P&gt;
&lt;P data-line="24"&gt;Uma das grandes vantagens do GitHub Models é permitir o uso&amp;nbsp;&lt;STRONG&gt;gratuito&lt;/STRONG&gt;&amp;nbsp;desses modelos durante a fase de prototipagem. Ou seja, você pode testar e construir um proof of concept (POC) sem custos, utilizando a infraestrutura fornecida pelo GitHub. Na prática, existem duas maneiras de interagir com os modelos:&lt;/P&gt;
&lt;UL data-line="26"&gt;
&lt;LI data-line="26"&gt;&lt;STRONG&gt;Playground (interface web)&lt;/STRONG&gt;: nesse playground, você pode testar os modelos diretamente no navegador do GitHub. Nele, você pode fazer perguntas e obter respostas em tempo real com diferentes modelos, ajustar parâmetros (temperatura, número máximo de tokens e etc.) e até comparar lado a lado a saída de dois modelos diferentes.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL data-line="30"&gt;
&lt;LI data-line="30"&gt;&lt;STRONG&gt;Via API/SDK:&lt;/STRONG&gt;&amp;nbsp;agora, caso você necessite integrar algum modelo em um projeto, o GitHub Models também disponibiliza uma API REST e SDKs para diversas linguagens, como Python, JavaScript/TypeScript, Java, C#, e REST. Cada modelo possui um endpoint de inferência público. Você pode fazer chamadas HTTP para esses endpoints ou usar SDKs (como o SDK do Azure OpenAI ou o próprio SDK do GitHub Models) em diversas linguagens.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A autenticação é feita de forma simples com um token de acesso pessoal do GitHub (PAT), sem necessidade de chaves de API separadas. Basta gerar um PAT na sua conta do GitHub (sem escopos especiais, usando a opção Beta disponível)​, e usá-lo nas requisições. Em outras palavras, seu token do GitHub funciona como a credencial para chamar o modelo, dentro dos limites gratuitos de uso.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H3 data-line="36"&gt;&lt;STRONG&gt;Vantagens e Limitações&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-line="38"&gt;Mas, tudo que é gratuito tem suas limitações, certo? Então, vamos explicar as limitações do GitHub Models.&lt;/P&gt;
&lt;P data-line="40"&gt;Atualmente, há restrições de chamadas por minuto e por dia, quantidade de tokens por requisição e número de requisições simultâneas. Por exemplo, modelos de categoria low (menores) permitem algo em torno de 15 requisições por minuto e 150 por dia, enquanto modelos high (como o GPT-4o) possuem limites um pouco mais baixos por serem mais pesados​&lt;/P&gt;
&lt;P data-line="42"&gt;Mas, e se curtiu o modelo e desejar colocar em produção? Bom, nesse caso, o GitHub Models sugere a migração para um&amp;nbsp;&lt;EM&gt;endpoint&lt;/EM&gt;&amp;nbsp;pago do Azure – e o interessante é que basta trocar o token do GitHub por uma chave do Azure que o resto do código continuará funcionando, sem necessidade de alterações adicionais!&lt;/P&gt;
&lt;P data-line="44"&gt;Resumindo: o GitHub Models é uma maneira prática de&amp;nbsp;&lt;STRONG&gt;encontrar e experimentar modelos de IA de ponta gratuitamente&lt;/STRONG&gt;​. Com ele, desenvolvedores podem incorporar funcionalidades de IA em projetos TypeScript (ou de outras linguagens) usando apenas uma conta GitHub. A seguir, conheceremos o exemplo do Microblog AI Remix e, depois, veremos na prática como usar o GitHub Models nesse projeto.&lt;/P&gt;
&lt;H2 data-line="46"&gt;&lt;STRONG&gt;Microblog AI Remix com GitHub Models&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="48"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" data-href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;(ou simplesmente Microblog AI) é um projeto de exemplo que combina um aplicativo web de microblog com recursos de Inteligência Artificial. Ele foi criado para demonstrar como construir aplicações web modernas e escaláveis utilizando a stack da Microsoft Azure juntamente com técnicas de Server-Side Rendering (SSR) e IA generativa. Em alto nível, o Microblog AI permite que usuários criem e visualizem pequenos posts de blog (microblogs), contando com a ajuda de um modelo de IA avançado para gerar conteúdo a partir de sugestões do usuário.&lt;/P&gt;
&lt;P data-line="50"&gt;Aproveito para pedir a testarem o projeto, dando um fork e contribuindo com melhorias. O projeto é open source e pode ser testado no GitHub Codespaces. Deixa a sua estrela ⭐️ e contribua com melhorias!&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="54"&gt;Originalmente o projeto utiliza o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/cognitive-services/openai-service/overview" data-href="https://learn.microsoft.com/en-us/azure/cognitive-services/openai-service/overview" target="_blank"&gt;Azure OpenAI&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;como provedor de IA, mas vamos substituí-lo pelo&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://docs.github.com/en/github-models" data-href="https://docs.github.com/en/github-models" target="_blank"&gt;GitHub Models&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para proporcionar uma alternativa gratuita e acessível.&lt;/P&gt;
&lt;H3 data-line="56"&gt;&lt;STRONG&gt;Passo a Passo para Configurar o Microblog AI&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-line="58"&gt;Eu gravei um vídeo mostrando o passo a passo em como migrar o projeto para o GitHub Models. O vídeo está disponível no meu canal do YouTube (em português) e você pode assisti-lo aqui:&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/4Pv1BrdiZDg?si=0y_MHiKYlt0eeZfM/1741313546429" data-video-remote-vid="https://youtu.be/4Pv1BrdiZDg?si=0y_MHiKYlt0eeZfM/1741313546429" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F4Pv1BrdiZDg%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D4Pv1BrdiZDg&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F4Pv1BrdiZDg%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P data-line="62"&gt;Antes de tudo precisamos clonar o projeto e configurar as dependências. Siga os passos abaixo:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Clone o repositório oficial do Microblog AI Remix:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="bash"&gt;git clone https://github.com/Azure-Samples/microblog-ai-remix.git cd microblog-ai-remix&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. Instale as dependências do projeto:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;npm install cd server npm install&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. Crie um arquivo .env na raiz do projeto e adicione as seguintes variáveis de ambiente:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;GITHUB_MODELS_ENDPOINT=https://models.inference.ai.azure.com GITHUB_MODELS_TOKEN=SEU_TOKEN&lt;/LI-CODE&gt;
&lt;P&gt;Esse token você pode gerar na sua conta do GitHub em&amp;nbsp;&lt;STRONG&gt;Settings &amp;gt; Developer Settings &amp;gt; Personal Access Tokens &amp;gt; Generate new token (beta)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;4. No diretório /server, crie o arquivo local.settings.json com o seguinte conteúdo:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node", "GITHUB_MODELS_ENDPOINT": "https://models.inference.ai.azure.com", "GITHUB_MODELS_TOKEN": "SEU_TOKEN" }, "Host": { "LocalHttpPort": 7071, "CORS": "*", "CORSCredential": true } }&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;5. Agora, vá até o arquivo: app/services/openaiService.ts e faça as seguintes alterações:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-line="111"&gt;
&lt;LI data-line="111"&gt;&lt;STRONG&gt;Importação do Cliente OpenAI&lt;/STRONG&gt;: substitua a importação do AzureOpenAI para OpenAI:&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="typescript"&gt;import { OpenAI } from "openai";&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="117"&gt;
&lt;LI data-line="117"&gt;&lt;STRONG&gt;Renomeação da Classe e Cliente:&lt;/STRONG&gt;&amp;nbsp;Substituição da importação do AzureOpenAIService foi renomeada para GitHubModelsService. E, a instância do cliente AzureOpenAI foi renomeada para OpenAI. Adição de um modelName padrão (gpt-4o) para ser usado nas requisições de criação de completions. Porém aqui poderia ser quaisquer outro modelName de sua escolha, como o Llama 3.1 ou o Mistral 7B.&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="typescript"&gt;class GitHubModelsService { private client: OpenAI; private readonly toneGuidelines: ToneGuidelines; private readonly modelName: string = "gpt-4o"; (...)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="128"&gt;
&lt;LI data-line="128"&gt;&lt;STRONG&gt;Configuração do Cliente:&lt;/STRONG&gt; As variáveis de ambiente específicas do Azure (AZURE_OPENAI_API_KEY,&amp;nbsp;AZURE_OPENAI_ENDPOINT, etc.) foram substituídas por variáveis de ambiente do GitHub (GITHUB_TOKEN&amp;nbsp;e&amp;nbsp;GITHUB_MODELS_ENDPOINT).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;this.client = new OpenAI({ baseURL: process.env.GITHUB_MODELS_ENDPOINT || "https://models.inference.ai.azure.com", apiKey: process.env.GITHUB_TOKEN, });&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="137"&gt;
&lt;LI data-line="137"&gt;&lt;STRONG&gt;Exportação da Instância da Classe:&lt;/STRONG&gt; A instância exportada da classe foi renomeada de&amp;nbsp;&lt;EM&gt;azureOpenAIService&lt;/EM&gt;&amp;nbsp;para&amp;nbsp;&lt;EM&gt;GitHubModelsService&lt;/EM&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="typescript"&gt;export const azureOpenAIService = new GitHubModelsService();&lt;/LI-CODE&gt;
&lt;P data-line="143"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-line="143"&gt;E pronto! Agora você já pode executar o projeto localmente e testar as funcionalidades de IA com o GitHub Models. Se desejar saber mais detalhes do que foi alterado deixei disponível uma branch chamada &lt;A href="https://github.com/Azure-Samples/microblog-ai-remix/pull/30/files" data-href="https://github.com/Azure-Samples/microblog-ai-remix/pull/30/files" target="_blank"&gt;&lt;STRONG&gt;feat/github-models-usage&lt;/STRONG&gt;&lt;/A&gt;&amp;nbsp;com todas as alterações feitas. Você pode comparar com a branch&amp;nbsp;main&amp;nbsp;para ver o que foi modificado.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;6. Por fim, para executar o projeto, basta rodar o seguinte comando na raiz do projeto:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;npm run build:all npm run dev&lt;/LI-CODE&gt;
&lt;P&gt;Agora, você pode acessar a aplicação na URL: &lt;EM&gt;http://localhost:5173/&lt;/EM&gt; e começar a criar seus microblogs com a ajuda do GitHub Models!&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="156"&gt;&lt;STRONG&gt;Conclusão&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="158"&gt;O&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;é uma excelente alternativa para quem quer experimentar IA sem custos. Ele permite testar modelos avançados como GPT-4o sem precisar pagar por APIs ou configurar infraestrutura complexa. No caso do&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" data-href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;, conseguimos substituir a API paga do Azure OpenAI pelo GitHub Models com mínimas alterações no código, tornando a aplicação acessível para qualquer desenvolvedor.&lt;/P&gt;
&lt;P data-line="160"&gt;Claro que, novamente, caso você queira colocar em produção, o GitHub Models sugere a migração para um endpoint pago do Azure. Mas, para fins de prototipagem e aprendizado, ele é uma ferramenta poderosa e gratuita.&lt;/P&gt;
&lt;P data-line="162"&gt;Se você gostou deste artigo, não esqueça de testar o Microblog AI Remix e dar uma ⭐ no repositório! Queremos saber sua opinião sobre essa abordagem e como você pretende utilizar IA nos seus projetos.&lt;/P&gt;
&lt;P data-line="164"&gt;Agora é sua vez: clone o repositório, teste as mudanças e explore o GitHub Models gratuitamente. Bora codar com IA sem gastar nada! 💸💸💸&lt;/P&gt;</description>
      <pubDate>Tue, 01 Apr 2025 23:56:06 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/use-ia-de-gra%C3%A7a-com-github-models-e-typescript/ba-p/4399817</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-04-01T23:56:06Z</dc:date>
    </item>
    <item>
      <title>Novidades no Visual Studio Code 1.98</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/novidades-no-visual-studio-code-1-98/ba-p/4394213</link>
      <description>&lt;P data-start="249" data-end="743"&gt;A versão 1.98 do&amp;nbsp;&lt;STRONG data-start="301" data-end="323"&gt;Visual Studio Code &lt;/STRONG&gt;está no ar e&amp;nbsp;traz uma série de novidades que vão aprimorar ainda mais a sua experiência de desenvolvimento. Entre os destaques principais, estão recursos que integram de forma ainda mais profunda a &lt;STRONG data-start="527" data-end="572"&gt;inteligência artificial do GitHub Copilot&lt;/STRONG&gt;, como o &lt;STRONG data-start="581" data-end="605"&gt;Modo Agente (prévia)&lt;/STRONG&gt;, o &lt;STRONG data-start="609" data-end="641"&gt;Copilot Edits para notebooks&lt;/STRONG&gt;, e o inédito &lt;STRONG data-start="655" data-end="673"&gt;Copilot Vision&lt;/STRONG&gt;, que permite interagir com imagens diretamente nas conversas de chat.&lt;/P&gt;
&lt;P data-start="1462" data-end="1600"&gt;Se quiser conferir as atualizações completas, acesse a página de&amp;nbsp;&lt;A href="https://code.visualstudio.com/updates" target="_blank" rel="noopener" data-start="1530" data-end="1583"&gt;Atualizações&lt;/A&gt; no site oficial.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P data-start="1602" data-end="1791"&gt;&lt;STRONG data-start="1602" data-end="1614"&gt;Insiders&lt;/STRONG&gt;: Quer testar as novidades o quanto antes? Baixe a versão &lt;A href="https://code.visualstudio.com/insiders" target="_blank" rel="noopener" data-start="1672" data-end="1722"&gt;Insiders&lt;/A&gt; e explore os recursos mais recentes assim que estiverem disponíveis!&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3&gt;&lt;STRONG&gt;Copilot Agent Mode (Preview)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="883" data-end="1119"&gt;O&amp;nbsp;&lt;STRONG data-start="885" data-end="907"&gt;Copilot Agent Mode (preview)&lt;/STRONG&gt;, transforma a interação com o código: ele busca automaticamente contexto no projeto, sugere comandos no terminal e edita arquivos de forma autônoma. Com isso, tarefas inteiras podem ser automatizadas!&lt;/P&gt;
&lt;P data-start="1121" data-end="1134"&gt;Destaques:&lt;/P&gt;
&lt;UL data-start="1135" data-end="1362"&gt;
&lt;LI data-start="1135" data-end="1214"&gt;Comandos de terminal visíveis inline, podendo ser editados antes da execução.&lt;/LI&gt;
&lt;LI data-start="1215" data-end="1295"&gt;Ações de &lt;STRONG data-start="1226" data-end="1246"&gt;desfazer/refazer&lt;/STRONG&gt; específicas para edições realizadas pelo agente.&lt;/LI&gt;
&lt;LI data-start="1296" data-end="1362"&gt;Integração com tarefas de compilação automáticas (configurável).&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Copilot Edits em Notebooks (Preview)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1793" data-end="1973"&gt;A partir de agora, é possível editar notebooks diretamente com o Copilot, facilitando fluxos de trabalho para cientistas de dados e profissionais que utilizam documentação técnica.&lt;/P&gt;
&lt;UL data-start="1975" data-end="2073"&gt;
&lt;LI data-start="1975" data-end="2020"&gt;Criação, modificação e exclusão de células.&lt;/LI&gt;
&lt;LI data-start="2021" data-end="2073"&gt;Suporte completo para diferentes tipos de células.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Interface Renovada nas Edições do Copilot&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2268" data-end="2467"&gt;A interface de Edições foi redesenhada para melhorar a experiência de revisão de arquivos modificados. Os arquivos aparecem como anexos comuns e a lista de arquivos alterados fica logo acima do chat.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Terminal IntelliSense (Preview)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Uma verdadeira revolução para quem gosta de trabalhar no terminal:&amp;nbsp;&lt;STRONG&gt;IntelliSense&lt;/STRONG&gt; agora funciona direto no terminal do VS Code!&lt;/P&gt;
&lt;P&gt;Principais benefícios:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Sugestões inteligentes para &lt;STRONG&gt;bash, zsh, fish e PowerShell&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Completions para comandos git, npm, brew, ssh e muito mais.&lt;/LI&gt;
&lt;LI&gt;Integração com &lt;STRONG&gt;branches do Git&lt;/STRONG&gt;, &lt;STRONG&gt;CDPATH&lt;/STRONG&gt; e &lt;STRONG&gt;aliases personalizados&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Autocomplete para git checkout:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Ative o Terminal IntelliSense:&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;"terminal.integrated.suggest.enabled": true&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG style="color: var(--lia-bs-headings-color); font-family: var(--lia-bs-headings-font-family); font-size: var(--lia-bs-h2-font-size); font-style: var(--lia-headings-font-style); letter-spacing: var(--lia-h2-letter-spacing); background-color: var(--lia-rte-bg-color);"&gt;Next Edit Suggestions (Preview)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O Copilot agora oferece&amp;nbsp;&lt;STRONG&gt;sugestões de próximas edições&lt;/STRONG&gt;, tornando o fluxo de trabalho ainda mais fluido. Com o &lt;STRONG&gt;modo colapsado&lt;/STRONG&gt;, você foca apenas no que interessa:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Sugestões aparecem discretamente na margem.&lt;/LI&gt;
&lt;LI&gt;Ative-as apenas quando quiser navegar até elas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Menu de ativação do modo colapsado:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Configuração&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;github.copilot.nextEditSuggestions.enabled&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG style="color: var(--lia-bs-headings-color); font-family: var(--lia-bs-headings-font-family); font-size: var(--lia-bs-h2-font-size); font-style: var(--lia-headings-font-style); letter-spacing: var(--lia-h2-letter-spacing); background-color: var(--lia-rte-bg-color);"&gt;Copilot Vision (Preview)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Nós estamos rapidamente implementando suporte de visão de ponta a ponta nesta versão do Copilot Chat. Isso permite que você anexe imagens e interaja com imagens em solicitações de chat.&lt;/P&gt;
&lt;P&gt;Por exemplo, se você encontrar um erro durante a depuração, anexe uma captura de tela do VS Code e peça ao Copilot para ajudá-lo a resolver o problema. Você também pode anexar um mockup de UI e deixar o Copilot fornecer algum HTML e CSS para implementar o mockup.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Você pode anexar imagens de várias maneiras:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Arraste e solte imagens do seu sistema operacional ou da visualização Explorer&lt;/LI&gt;
&lt;LI&gt;Cole uma imagem da sua área de transferência&lt;/LI&gt;
&lt;LI&gt;Anexe uma captura de tela da janela do VS Code (selecione o&amp;nbsp;&lt;STRONG&gt;botão de clipe de papel 📎&lt;/STRONG&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;STRONG&gt;Captura de Tela da Janela&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Um aviso é mostrado se o modelo selecionado atualmente não tiver a capacidade de lidar com o tipo de arquivo. O único modelo suportado no momento será GPT 4o, mas o suporte para anexos de imagem com Claude 3.5 Sonnet e Gemini 2.0 Flash será lançado em breve também. Atualmente, os tipos de imagem suportados são JPEG/JPG, PNG, GIF e WEBP.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Disponibilidade geral de instruções personalizadas&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Instruções personalizadas permitem que você adapte o GitHub Copilot para fornecer respostas de chat e sugestões de código de acordo com a forma como você e sua equipe trabalham. Descreva seus requisitos específicos em formato Markdown em um arquivo&amp;nbsp;&lt;STRONG&gt;.github/copilot-instructions.md&lt;/STRONG&gt;&amp;nbsp;no seu espaço de trabalho.&lt;/P&gt;
&lt;P&gt;Neste marco, estamos disponibilizando instruções personalizadas com&amp;nbsp;&lt;STRONG&gt;.github/copilot-instructions.md&lt;/STRONG&gt; de forma geral. Certifique-se de que a configuração do VS Code está habilitada para que o Copilot possa utilizar essas instruções ao gerar respostas.&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;github.copilot.chat.codeGeneration.useInstructionFiles&lt;/LI-CODE&gt;
&lt;P&gt;Saiba mais sobre&amp;nbsp;&lt;A href="https://code.visualstudio.com/docs/copilot/copilot-customization" target="_blank" rel="noopener"&gt;instruções personalizadas no Copilot&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Melhorias no descarte de alterações não rastreadas&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Ao longo dos anos, recebemos vários relatórios sobre perda de dados porque descartar um arquivo não rastreado excluía permanentemente o arquivo, mesmo que o VS Code mostrasse um diálogo modal deixando claro que o arquivo seria excluído permanentemente.&lt;/P&gt;
&lt;P&gt;A partir desta atualização, descartar um arquivo não rastreado moverá o arquivo para a Lixeira quando possível, para que o arquivo possa ser facilmente recuperado. Você pode ativar ou desativar essa funcionalidade acessando as configurações do VS Code e buscando por &lt;STRONG&gt;git.discardUntrackedChangesToTrash&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;Hook de commit para diagnósticos (Experimental)&lt;/H4&gt;
&lt;P&gt;Introduzimos um novo hook de commit que solicita que você resolva quaisquer diagnósticos não resolvidos para os arquivos alterados. Este é atualmente um recurso experimental que pode ser habilitado usando a configuração &lt;STRONG&gt;git.diagnosticsCommitHook.Enabled&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Por padrão, o hook de commit solicita quaisquer diagnósticos de nível de erro, mas as fontes e níveis de diagnóstico podem ser personalizados usando a configuração &lt;STRONG&gt;git.diagnosticsCommitHook.Sources&lt;/STRONG&gt;. Experimente e nos dê seu feedback.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Acessibilidade no Copilot Edits&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Nós tornamos as Edições do Copilot muito mais acessíveis.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Agora há sinais sonoros para arquivos com modificações e para regiões alteradas (inserções, modificações e exclusões).&lt;/LI&gt;
&lt;LI&gt;O visualizador de diff acessível agora está disponível para arquivos modificados. Assim como nos editores de diff, selecione&amp;nbsp;&lt;STRONG&gt;kb(chatEditor.action.showAccessibleDiffView)&lt;/STRONG&gt;&amp;nbsp;para ativá-lo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;&lt;STRONG&gt;activeEditorState&lt;/STRONG&gt;&amp;nbsp;variável de título da janela&lt;/H4&gt;
&lt;P&gt;Nós temos uma nova variável &lt;STRONG&gt;setting(window.title)&lt;/STRONG&gt; chamada &lt;STRONG&gt;activeEditorState &lt;/STRONG&gt;para indicar informações do editor, como estado modificado, o número de problemas e quando um arquivo tem Edições (Edits) do Copilot pendentes para usuários de leitores de tela. Quando no modo otimizado para leitores de tela, isso é anexado por padrão e pode ser desativado com&amp;nbsp;&lt;STRONG&gt;accessibility.windowTitleOptimized:false.&lt;/STRONG&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Barra de título customizada no Linux&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;A tão pedida &lt;STRONG&gt;barra de título customizada&lt;/STRONG&gt; no Linux já está habilitada por padrão!&lt;/P&gt;
&lt;P&gt;A barra de título customizada agora está habilitada por padrão no Linux. A barra de título customizada dá acesso a controles de layout, ao menu do Copilot e muito mais.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Você sempre pode reverter para as decorações de título nativas, seja a partir do menu de contexto da barra de título customizada ou configurando&amp;nbsp;&lt;STRONG&gt;setting(window.titleBarStyle)&lt;/STRONG&gt; para &lt;STRONG&gt;native&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Estamos felizes com o feedback contínuo sobre essa experiência e já estamos trabalhando para melhorá-la ainda mais em futuros releases com base nos feedbacks da comunidade.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Modelos de IA&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Adicionamos mais modelos para escolher ao usar o Copilot. Os seguintes modelos estão agora disponíveis no seletor de modelo no Visual Studio Code e no chat do github.com:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;GPT 4.5 (Prévia)&lt;/STRONG&gt;: O modelo mais recente da OpenAI, GPT-4.5, agora está disponível no Chat do GitHub Copilot para usuários do Copilot Enterprise. O GPT-4.5 é um modelo de linguagem grande projetado com capacidades avançadas em intuição, estilo de escrita e conhecimento amplo. Saiba mais sobre a disponibilidade do modelo GPT-4.5 no&amp;nbsp;&lt;A href="https://github.blog/changelog/2025-02-27-openai-gpt-4-5-in-github-copilot-now-available-in-public-preview" target="_blank" rel="noopener"&gt;post do blog do GitHub&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Claude 3.7 Sonnet (Prévia)&lt;/STRONG&gt;: Claude 3.7 Sonnet agora está disponível para todos os clientes em planos pagos do Copilot. Este novo modelo Sonnet suporta tanto modos de pensamento quanto de não pensamento no Copilot. Nos testes iniciais, vimos melhorias particularmente fortes em cenários de agente. Saiba mais sobre a disponibilidade do modelo Claude 3.7 Sonnet no&amp;nbsp;&lt;A href="https://github.blog/changelog/2025-02-24-claude-3-7-sonnet-is-now-available-in-github-copilot-in-public-preview/" target="_blank" rel="noopener"&gt;post do blog do GitHub&lt;/A&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4 data-start="127" data-end="139"&gt;Conclusão&lt;/H4&gt;
&lt;P data-start="141" data-end="652"&gt;A versão 1.98 do &lt;STRONG data-start="158" data-end="180"&gt;Visual Studio Code&lt;/STRONG&gt; marca um avanço significativo na integração de inteligência artificial ao ambiente de desenvolvimento, com recursos que aumentam a produtividade e oferecem mais controle para desenvolvedores individuais e equipes. As melhorias em &lt;STRONG data-start="411" data-end="433"&gt;Copilot Agent Mode&lt;/STRONG&gt;, &lt;STRONG data-start="435" data-end="459"&gt;edições em notebooks&lt;/STRONG&gt;, &lt;STRONG data-start="461" data-end="489"&gt;IntelliSense no terminal&lt;/STRONG&gt; e &lt;STRONG data-start="492" data-end="523"&gt;personalização de sugestões&lt;/STRONG&gt; refletem um esforço contínuo da equipe do VS Code em fornecer uma experiência de desenvolvimento moderna, eficiente e acessível.&lt;/P&gt;
&lt;P data-start="654" data-end="861"&gt;Se você deseja explorar todas essas funcionalidades, a atualização para a versão mais recente já está disponível. Além disso, os recursos em prévia podem ser testados por meio da versão &lt;STRONG data-start="840" data-end="860"&gt;VS Code Insiders&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-start="863" data-end="1046"&gt;Para mais informações e download, acesse:&lt;BR data-start="904" data-end="907" /&gt;➡️ &lt;A href="https://code.visualstudio.com/updates" target="_blank" rel="noopener" data-start="910" data-end="982"&gt;Notas de versão do VS Code 1.98&lt;/A&gt;&lt;BR data-start="982" data-end="985" /&gt;➡️ &lt;A href="https://code.visualstudio.com/insiders" target="_blank" rel="noopener" data-start="988" data-end="1046"&gt;VS Code Insiders&lt;/A&gt;&lt;/P&gt;
&lt;P data-start="1048" data-end="1212"&gt;Caso tenha feedback ou sugestões sobre os novos recursos, participe das discussões na comunidade do &lt;A href="https://github.com/microsoft/vscode/issues" target="_blank" rel="noopener" data-start="1148" data-end="1211"&gt;GitHub do VS Code&lt;/A&gt;.&lt;/P&gt;</description>
      <pubDate>Tue, 18 Mar 2025 15:49:21 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/novidades-no-visual-studio-code-1-98/ba-p/4394213</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-03-18T15:49:21Z</dc:date>
    </item>
    <item>
      <title>Use IA de Graça com GitHub Models e TypeScript! 💸💸💸</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/use-ia-de-gra%C3%A7a-com-github-models-e-typescript/ba-p/4390441</link>
      <description>&lt;P data-line="6"&gt;A Inteligência Artificial está se tornando cada vez mais acessível para desenvolvedores. Porém, um dos maiores desafios ainda é o custo das APIs de modelos avançados, como GPT-4o e tantos outros. Felizmente, o&amp;nbsp;&lt;EM&gt;GitHub Models&lt;/EM&gt;&amp;nbsp;veio para mudar esse cenário! Agora, você pode experimentar IA de graça, sem precisar de uma chave de API paga ou baixar modelos pesados em suas máquinas locais.&lt;/P&gt;
&lt;P data-line="8"&gt;Neste artigo, vamos explicar em detalhes o que é o&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;e como utilizar gratuitamente com&amp;nbsp;&lt;STRONG&gt;TypeScript&lt;/STRONG&gt;&amp;nbsp;em um projeto prático. Escolhemos como exemplo o projeto&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank" rel="noopener" data-href="https://github.com/Azure-Samples/microblog-ai-remix"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;, um projeto open source de microblog com funcionalidades de IA.&lt;/P&gt;
&lt;P data-line="10"&gt;Iremos abordar a estrutura desse projeto e demonstrar passo a passo como integrar com o GitHub Models, substituindo a necessidade de fazer uso de LLMs pagos, incluindo comparações de código&amp;nbsp;&lt;STRONG&gt;antes e depois&lt;/STRONG&gt;&amp;nbsp;das modificações. Também veremos como configurar e executar o projeto localmente, e discutiremos as vantagens e limitações do GitHub Models para prototipagem de projetos em IA.&lt;/P&gt;
&lt;P data-line="12"&gt;Pode ter certeza que, ao final deste artigo, você terá uma compreensão sólida do&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;e como utilizá-lo em seus próprios projetos e começar a explorar o mundo da IA de forma acessível e gratuita.&lt;/P&gt;
&lt;P data-line="14"&gt;Vamos lá!&lt;/P&gt;
&lt;H2 data-line="16"&gt;&lt;STRONG&gt;O que é o GitHub Models?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="20"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://docs.github.com/en/github-models" target="_blank" rel="noopener" data-href="https://docs.github.com/en/github-models"&gt;GitHub Models&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;é uma iniciativa do GitHub que disponibiliza uma coleção de modelos de IA prontos para uso, integrados à plataforma. Pense no GitHub Models como um&amp;nbsp;&lt;EM&gt;Marketplace de Modelos de IA&lt;/EM&gt;: onde os desenvolvedores podem descobrir modelos de linguagem grande (LLMs) de diferentes provedores, testar suas capacidades em um playground interativo e incorporar em suas aplicações de forma simplificada.&lt;/P&gt;
&lt;P data-line="22"&gt;Há modelos de diversas origens e portes - por exemplo, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://platform.openai.com/docs/models/gpt-4o" target="_blank" rel="noopener" data-href="https://platform.openai.com/docs/models/gpt-4o"&gt;OpenAI GPT-4o&lt;/A&gt;&lt;/STRONG&gt;, modelos Open Source como o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.llama.com/" target="_blank" rel="noopener" data-href="https://www.llama.com/"&gt;Meta Llama 3.1&lt;/A&gt;&lt;/STRONG&gt;, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://azure.microsoft.com/products/phi?WT.mc_id=javascript-00000-gllemos" target="_blank" rel="noopener" data-href="https://azure.microsoft.com/products/phi?WT.mc_id=javascript-00000-gllemos"&gt;Phi-3&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;da Microsoft, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://mistral.ai/news/mistral-large-2407" target="_blank" rel="noopener" data-href="https://mistral.ai/news/mistral-large-2407"&gt;Mistral Large 2&lt;/A&gt;&lt;/STRONG&gt;, entre outros. Todos podem ser acessados gratuitamente para fins de experimentação.&lt;/P&gt;
&lt;P data-line="24"&gt;Uma das grandes vantagens do GitHub Models é permitir o uso&amp;nbsp;&lt;STRONG&gt;gratuito&lt;/STRONG&gt;&amp;nbsp;desses modelos durante a fase de prototipagem. Ou seja, você pode testar e construir um proof of concept (POC) sem custos, utilizando a infraestrutura fornecida pelo GitHub. Na prática, existem duas maneiras de interagir com os modelos:&lt;/P&gt;
&lt;UL data-line="26"&gt;
&lt;LI data-line="26"&gt;&lt;STRONG&gt;Playground (interface web)&lt;/STRONG&gt;: nesse playground, você pode testar os modelos diretamente no navegador do GitHub. Nele, você pode fazer perguntas e obter respostas em tempo real com diferentes modelos, ajustar parâmetros (temperatura, número máximo de tokens e etc.) e até comparar lado a lado a saída de dois modelos diferentes.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL data-line="30"&gt;
&lt;LI data-line="30"&gt;&lt;STRONG&gt;Via API/SDK:&lt;/STRONG&gt;&amp;nbsp;agora, caso você necessite integrar algum modelo em um projeto, o GitHub Models também disponibiliza uma API REST e SDKs para diversas linguagens, como Python, JavaScript/TypeScript, Java, C#, e REST. Cada modelo possui um endpoint de inferência público. Você pode fazer chamadas HTTP para esses endpoints ou usar SDKs (como o SDK do Azure OpenAI ou o próprio SDK do GitHub Models) em diversas linguagens.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A autenticação é feita de forma simples com um token de acesso pessoal do GitHub (PAT), sem necessidade de chaves de API separadas. Basta gerar um PAT na sua conta do GitHub (sem escopos especiais, usando a opção Beta disponível)​, e usá-lo nas requisições. Em outras palavras, seu token do GitHub funciona como a credencial para chamar o modelo, dentro dos limites gratuitos de uso.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H3 data-line="36"&gt;&lt;STRONG&gt;Vantagens e Limitações&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-line="38"&gt;Mas, tudo que é gratuito tem suas limitações, certo? Então, vamos explicar as limitações do GitHub Models.&lt;/P&gt;
&lt;P data-line="40"&gt;Atualmente, há restrições de chamadas por minuto e por dia, quantidade de tokens por requisição e número de requisições simultâneas. Por exemplo, modelos de categoria low (menores) permitem algo em torno de 15 requisições por minuto e 150 por dia, enquanto modelos high (como o GPT-4o) possuem limites um pouco mais baixos por serem mais pesados​&lt;/P&gt;
&lt;P data-line="42"&gt;Mas, e se curtiu o modelo e desejar colocar em produção? Bom, nesse caso, o GitHub Models sugere a migração para um&amp;nbsp;&lt;EM&gt;endpoint&lt;/EM&gt;&amp;nbsp;pago do Azure – e o interessante é que basta trocar o token do GitHub por uma chave do Azure que o resto do código continuará funcionando, sem necessidade de alterações adicionais!&lt;/P&gt;
&lt;P data-line="44"&gt;Resumindo: o GitHub Models é uma maneira prática de&amp;nbsp;&lt;STRONG&gt;encontrar e experimentar modelos de IA de ponta gratuitamente&lt;/STRONG&gt;​. Com ele, desenvolvedores podem incorporar funcionalidades de IA em projetos TypeScript (ou de outras linguagens) usando apenas uma conta GitHub. A seguir, conheceremos o exemplo do Microblog AI Remix e, depois, veremos na prática como usar o GitHub Models nesse projeto.&lt;/P&gt;
&lt;H2 data-line="46"&gt;&lt;STRONG&gt;Microblog AI Remix com GitHub Models&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="48"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank" rel="noopener" data-href="https://github.com/Azure-Samples/microblog-ai-remix"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;(ou simplesmente Microblog AI) é um projeto de exemplo que combina um aplicativo web de microblog com recursos de Inteligência Artificial. Ele foi criado para demonstrar como construir aplicações web modernas e escaláveis utilizando a stack da Microsoft Azure juntamente com técnicas de Server-Side Rendering (SSR) e IA generativa. Em alto nível, o Microblog AI permite que usuários criem e visualizem pequenos posts de blog (microblogs), contando com a ajuda de um modelo de IA avançado para gerar conteúdo a partir de sugestões do usuário.&lt;/P&gt;
&lt;P data-line="50"&gt;Aproveito para pedir a testarem o projeto, dando um fork e contribuindo com melhorias. O projeto é open source e pode ser testado no GitHub Codespaces. Deixa a sua estrela ⭐️ e contribua com melhorias!&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="54"&gt;Originalmente o projeto utiliza o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/cognitive-services/openai-service/overview" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/azure/cognitive-services/openai-service/overview"&gt;Azure OpenAI&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;como provedor de IA, mas vamos substituí-lo pelo&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://docs.github.com/en/github-models" target="_blank" rel="noopener" data-href="https://docs.github.com/en/github-models"&gt;GitHub Models&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para proporcionar uma alternativa gratuita e acessível.&lt;/P&gt;
&lt;H3 data-line="56"&gt;&lt;STRONG&gt;Passo a Passo para Configurar o Microblog AI&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-line="58"&gt;Eu gravei um vídeo mostrando o passo a passo em como migrar o projeto para o GitHub Models. O vídeo está disponível no meu canal do YouTube (em português) e você pode assisti-lo aqui:&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/4Pv1BrdiZDg?si=0y_MHiKYlt0eeZfM/1741313546429" data-video-remote-vid="https://youtu.be/4Pv1BrdiZDg?si=0y_MHiKYlt0eeZfM/1741313546429" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F4Pv1BrdiZDg%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D4Pv1BrdiZDg&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F4Pv1BrdiZDg%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P data-line="62"&gt;Antes de tudo precisamos clonar o projeto e configurar as dependências. Siga os passos abaixo:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Clone o repositório oficial do Microblog AI Remix:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;git clone https://github.com/Azure-Samples/microblog-ai-remix.git
cd microblog-ai-remix&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. Instale as dependências do projeto:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;npm install
cd server 
npm install&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. Crie um arquivo .env na raiz do projeto e adicione as seguintes variáveis de ambiente:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;GITHUB_MODELS_ENDPOINT=https://models.inference.ai.azure.com
GITHUB_MODELS_TOKEN=SEU_TOKEN&lt;/LI-CODE&gt;
&lt;P&gt;Esse token você pode gerar na sua conta do GitHub em&amp;nbsp;&lt;STRONG&gt;Settings &amp;gt; Developer Settings &amp;gt; Personal Access Tokens &amp;gt; Generate new token (beta)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;4. No diretório /server, crie o arquivo local.settings.json com o seguinte conteúdo:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "GITHUB_MODELS_ENDPOINT": "https://models.inference.ai.azure.com",
    "GITHUB_MODELS_TOKEN": "SEU_TOKEN"
  },
  "Host": {
    "LocalHttpPort": 7071,
    "CORS": "*",
    "CORSCredential": true
  }
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;5. Agora, vá até o arquivo: app/services/openaiService.ts e faça as seguintes alterações:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-line="111"&gt;
&lt;LI data-line="111"&gt;&lt;STRONG&gt;Importação do Cliente OpenAI&lt;/STRONG&gt;: substitua a importação do AzureOpenAI para OpenAI:&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;import { OpenAI } from "openai";&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="117"&gt;
&lt;LI data-line="117"&gt;&lt;STRONG&gt;Renomeação da Classe e Cliente:&lt;/STRONG&gt;&amp;nbsp;Substituição da importação do AzureOpenAIService foi renomeada para GitHubModelsService. E, a instância do cliente AzureOpenAI foi renomeada para OpenAI. Adição de um modelName padrão (gpt-4o) para ser usado nas requisições de criação de completions. Porém aqui poderia ser quaisquer outro modelName de sua escolha, como o Llama 3.1 ou o Mistral 7B.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;class GitHubModelsService {
  private client: OpenAI;
  private readonly toneGuidelines: ToneGuidelines;
  private readonly modelName: string = "gpt-4o";

(...)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="128"&gt;
&lt;LI data-line="128"&gt;&lt;STRONG&gt;Configuração do Cliente:&lt;/STRONG&gt; As variáveis de ambiente específicas do Azure (AZURE_OPENAI_API_KEY,&amp;nbsp;AZURE_OPENAI_ENDPOINT, etc.) foram substituídas por variáveis de ambiente do GitHub (GITHUB_TOKEN&amp;nbsp;e&amp;nbsp;GITHUB_MODELS_ENDPOINT).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;this.client = new OpenAI({
      baseURL: process.env.GITHUB_MODELS_ENDPOINT || "https://models.inference.ai.azure.com",
      apiKey: process.env.GITHUB_TOKEN,
    });&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="137"&gt;
&lt;LI data-line="137"&gt;&lt;STRONG&gt;Exportação da Instância da Classe:&lt;/STRONG&gt; A instância exportada da classe foi renomeada de&amp;nbsp;&lt;EM&gt;azureOpenAIService&lt;/EM&gt;&amp;nbsp;para&amp;nbsp;&lt;EM&gt;GitHubModelsService&lt;/EM&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;export const azureOpenAIService = new GitHubModelsService();&lt;/LI-CODE&gt;
&lt;P data-line="143"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-line="143"&gt;E pronto! Agora você já pode executar o projeto localmente e testar as funcionalidades de IA com o GitHub Models. Se desejar saber mais detalhes do que foi alterado deixei disponível uma branch chamada &lt;A href="https://github.com/Azure-Samples/microblog-ai-remix/pull/30/files" target="_blank" rel="noopener" data-href="https://github.com/Azure-Samples/microblog-ai-remix/pull/30/files"&gt;&lt;STRONG&gt;feat/github-models-usage&lt;/STRONG&gt;&lt;/A&gt;&amp;nbsp;com todas as alterações feitas. Você pode comparar com a branch&amp;nbsp;main&amp;nbsp;para ver o que foi modificado.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;6. Por fim, para executar o projeto, basta rodar o seguinte comando na raiz do projeto:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;npm run build:all
npm run dev&lt;/LI-CODE&gt;
&lt;P&gt;Agora, você pode acessar a aplicação na URL: &lt;EM&gt;http://localhost:5173/&lt;/EM&gt; e começar a criar seus microblogs com a ajuda do GitHub Models!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="156"&gt;&lt;STRONG&gt;Conclusão&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="158"&gt;O&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;é uma excelente alternativa para quem quer experimentar IA sem custos. Ele permite testar modelos avançados como GPT-4o sem precisar pagar por APIs ou configurar infraestrutura complexa. No caso do&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank" rel="noopener" data-href="https://github.com/Azure-Samples/microblog-ai-remix"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;, conseguimos substituir a API paga do Azure OpenAI pelo GitHub Models com mínimas alterações no código, tornando a aplicação acessível para qualquer desenvolvedor.&lt;/P&gt;
&lt;P data-line="160"&gt;Claro que, novamente, caso você queira colocar em produção, o GitHub Models sugere a migração para um endpoint pago do Azure. Mas, para fins de prototipagem e aprendizado, ele é uma ferramenta poderosa e gratuita.&lt;/P&gt;
&lt;P data-line="162"&gt;Se você gostou deste artigo, não esqueça de testar o Microblog AI Remix e dar uma ⭐ no repositório! Queremos saber sua opinião sobre essa abordagem e como você pretende utilizar IA nos seus projetos.&lt;/P&gt;
&lt;P data-line="164"&gt;Agora é sua vez: clone o repositório, teste as mudanças e explore o GitHub Models gratuitamente. Bora codar com IA sem gastar nada! 💸💸💸&lt;/P&gt;</description>
      <pubDate>Fri, 07 Mar 2025 02:21:44 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/use-ia-de-gra%C3%A7a-com-github-models-e-typescript/ba-p/4390441</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-03-07T02:21:44Z</dc:date>
    </item>
    <item>
      <title>Colaboração e implantação eficientes com GitHub Copilot e GitHub Copilot for Azure</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/colabora%C3%A7%C3%A3o-e-implanta%C3%A7%C3%A3o-eficientes-com-github-copilot-e-github/ba-p/4385326</link>
      <description>&lt;P&gt;No episódio final do &lt;STRONG&gt;&lt;A class="lia-external-url" href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank"&gt;GitHub Copilot Bootcamp Brasil (assista as gravações),&lt;/A&gt;&lt;/STRONG&gt;Henrique Eduardo Souza, Microsoft MVP e Especialista em arquitetura e IA, apresenta um workshop prático de criação de APIs até a implantação em produção, testes automatizados e integração com pipelines de CI/CD.&lt;/P&gt;
&lt;div data-video-id="https://www.youtube.com/watch?v=HcbngRRKU0U/1740437308014" data-video-remote-vid="https://www.youtube.com/watch?v=HcbngRRKU0U/1740437308014" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FHcbngRRKU0U%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DHcbngRRKU0U&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FHcbngRRKU0U%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;H2&gt;&lt;STRONG&gt;Demonstração Prática: Criando uma API com Python&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Durante a sessão, Henrique demonstra como criar uma API básica usando Python e FastAPI com o auxílio do Copilot. Ele começa configurando um ambiente local e segue os passos abaixo:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Configuração Inicial&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Criação de um arquivo&amp;nbsp;app.py&amp;nbsp;com um prompt simples: "Preciso criar uma API em Python que responda 'Oi'".&lt;/LI&gt;
&lt;LI&gt;O Copilot sugere automaticamente o código necessário para implementar essa funcionalidade.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Gerenciamento de Dependências&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Utilizando extensões do Copilot, ele gera automaticamente um arquivo&amp;nbsp;requirements.txt&amp;nbsp;contendo as dependências necessárias.&lt;/LI&gt;
&lt;LI&gt;As dependências são instaladas rapidamente via terminal.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Testes Locais&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Após configurar a API, Henrique utiliza ferramentas como&amp;nbsp;uvicorn&amp;nbsp;para rodar localmente e validar as funcionalidades.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Automatização com Workspaces&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;O Copilot também permite criar estruturas completas de projetos (como MVC) automaticamente, otimizando ainda mais o processo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2&gt;&lt;STRONG&gt;Implantação no Azure com GitHub Actions&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Após construir a API localmente, Henrique demonstra como configurá-la para implantação no Azure utilizando pipelines do GitHub Actions:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Configuração do Workflow&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Criação da pasta&amp;nbsp;.github/workflows&amp;nbsp;no repositório.&lt;/LI&gt;
&lt;LI&gt;Geração automática de um pipeline YAML pelo Copilot para build e deploy da aplicação.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Configuração do Azure Web App&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Criação de um recurso no Azure Web App com suporte à versão Python 3.12.&lt;/LI&gt;
&lt;LI&gt;Download do perfil de publicação (publish profile) e configuração como segredo no repositório do GitHub.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Deploy Automatizado&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Ao realizar commits no repositório, o pipeline é acionado automaticamente, construindo e implantando a aplicação no Azure.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Henrique também destaca que o pipeline pode ser customizado para incluir etapas adicionais, como validação de segurança ou execução de testes automatizados.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Testes Automatizados com Cobertura Completa&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Um dos pontos altos da sessão é a demonstração sobre como escrever testes automatizados utilizando o Copilot:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Geração Automática de Testes&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Henrique utiliza a funcionalidade "Copilot Generate Tests" para criar testes unitários diretamente na IDE.&lt;/LI&gt;
&lt;LI&gt;Ele valida os testes localmente usando bibliotecas como&amp;nbsp;pytest.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Cobertura de Testes&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Adiciona etapas no pipeline para medir a cobertura dos testes utilizando ferramentas como&amp;nbsp;coverage.py.&lt;/LI&gt;
&lt;LI&gt;Relatórios HTML são gerados automaticamente para análise detalhada.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Execução na Pipeline&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Os testes são integrados ao pipeline YAML, garantindo que qualquer alteração no código seja validada antes da implantação.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2&gt;&lt;STRONG&gt;Extensões e Personalizações&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Henrique explora extensões adicionais que podem ser integradas ao GitHub Copilot:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Diagramas Automáticos&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Utilizando ferramentas como Mermaid.js, ele gera diagramas de sequência diretamente da base de código.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Extensões Customizadas&lt;/STRONG&gt;:
&lt;UL&gt;
&lt;LI&gt;Demonstra como criar extensões próprias para validar código conforme padrões corporativos (como integração com Jira).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Essas funcionalidades ampliam ainda mais as possibilidades do Copilot, tornando-o uma ferramenta altamente adaptável às necessidades específicas dos desenvolvedores.&lt;/P&gt;
&lt;H2&gt;Conclusão&lt;/H2&gt;
&lt;P&gt;Seja você iniciante ou experiente, explorar as funcionalidades do Copilot pode transformar sua maneira de desenvolver software. Experimente integrá-lo ao seu dia a dia e descubra por que tantos desenvolvedores consideram essa ferramenta indispensável!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Assista as gravações do&amp;nbsp;&lt;A class="lia-external-url" href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank"&gt;GitHub Copilot Bootcamp&lt;/A&gt;&amp;nbsp;disponíveis em português, comece a utilizar o&amp;nbsp;&lt;A class="lia-external-url" href="https://aka.ms/AAun6jj" target="_blank"&gt;GitHub Copilot gratuito&lt;/A&gt; hoje mesmo!&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 24 Feb 2025 22:50:10 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/colabora%C3%A7%C3%A3o-e-implanta%C3%A7%C3%A3o-eficientes-com-github-copilot-e-github/ba-p/4385326</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-02-24T22:50:10Z</dc:date>
    </item>
    <item>
      <title>Crie Testes Unitários e Documentação com GitHub Copilot</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/crie-testes-unit%C3%A1rios-e-documenta%C3%A7%C3%A3o-com-github-copilot/ba-p/4385265</link>
      <description>&lt;P&gt;Em um&amp;nbsp;ambiente de desenvolvimento ágil, a eficiência é crucial. Durante&amp;nbsp;a sessão&amp;nbsp;"Crie Testes Unitários e Documentação com GitHub Copilot" do &lt;STRONG&gt;&lt;A class="lia-external-url" href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank" rel="noopener"&gt;GitHub Copilot Bootcamp Brasil (assista as gravações)&lt;/A&gt;&lt;/STRONG&gt;, o&amp;nbsp;especialista&amp;nbsp;Rogério Rodrigues demonstrou, em tempo real, como a&amp;nbsp;IA do GitHub Copilot atua como um "copiloto" para&amp;nbsp;simplificar processos complexos.&lt;/P&gt;
&lt;P&gt;Este artigo sintetiza as principais técnicas apresentadas, focando nas funcionalidades que &lt;STRONG&gt;automatizam a&amp;nbsp;geração de documentação&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;criam testes unitários adaptáveis&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;produzem diagramas técnicos&lt;/STRONG&gt; sem esforço manual.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://www.youtube.com/watch?v=tOZlWu6QszI/1740428189455" data-video-remote-vid="https://www.youtube.com/watch?v=tOZlWu6QszI/1740428189455" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FtOZlWu6QszI%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DtOZlWu6QszI&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FtOZlWu6QszI%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;H2&gt;&lt;STRONG&gt;O que você vai aprender nessa sessão:&lt;/STRONG&gt;&lt;/H2&gt;
&lt;H3&gt;Geração de Documentação Contextualizada&lt;/H3&gt;
&lt;P&gt;Rogério iniciou com um projeto .NET que&amp;nbsp;consumia dados&amp;nbsp;de uma API de previsão do tempo. Selecionando o método&amp;nbsp;WeatherApiClient, ele&amp;nbsp;acionou o comando&amp;nbsp;&lt;STRONG&gt;"Generate Docs"&lt;/STRONG&gt;&amp;nbsp;diretamente&amp;nbsp;no Visual Studio Code. Em segundos, o Copilot gerou:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Uma docstring detalhada com parâmetros (city: str) e tipo de retorno (dict)&lt;/LI&gt;
&lt;LI&gt;Explicações claras sobre o fluxo de consumo da API meteorológica&lt;/LI&gt;
&lt;LI&gt;Sugestões de&amp;nbsp;tratamento de erros específicos para&amp;nbsp;APIs REST&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;"O segredo está em&amp;nbsp;como o Copilot entende o contexto",&lt;/EM&gt;&amp;nbsp;explicou Rogério.&amp;nbsp;&lt;EM&gt;"Ele não apenas descreve o que&amp;nbsp;o código faz, mas&amp;nbsp;antecipa necessidades de documentação técnica que desenvolvedores júnior poderiam&amp;nbsp;esquecer."&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Um ponto interessante foi a sugestão do GitHub Copilot para gestão de frota:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;class VehicleRental:  
    """Sistema de gestão de aluguéis com validação de pagamentos"""  
&lt;/LI-CODE&gt;
&lt;P&gt;Ao usar o&amp;nbsp;prompt&amp;nbsp;&lt;STRONG&gt;"gere um&amp;nbsp;README.md com&amp;nbsp;instruções de execução"&lt;/STRONG&gt;, o Copilot estruturou:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Lista de dependências com&amp;nbsp;versões específicas&lt;/LI&gt;
&lt;LI&gt;Comandos de instalação otimizados para virtualenv&lt;/LI&gt;
&lt;LI&gt;Exemplos de uso da classe PaymentValidator com cenários reais&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Testes Unitários&lt;/H3&gt;
&lt;P&gt;A magia aconteceu quando Rogério alternou entre frameworks de teste sem reescrever código:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Cenário .NET/MSTest:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Selecionou o&amp;nbsp;método&amp;nbsp;PriceValidator&lt;/LI&gt;
&lt;LI&gt;Prompt:&amp;nbsp;&lt;STRONG&gt;"Crie testes com&amp;nbsp;dados mock para&amp;nbsp;valores negativos e acima de R$1000"&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Copilot gerou 5 casos de teste com&amp;nbsp;[DataRow]&amp;nbsp;e&amp;nbsp;Assert.ThrowsException&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Resultado:&amp;nbsp;Ao&amp;nbsp;pedir&amp;nbsp;&lt;STRONG&gt;"Reescreva usando xUnit"&lt;/STRONG&gt;, o&amp;nbsp;Copilot:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Substituiu&amp;nbsp;[TestMethod]&amp;nbsp;por&amp;nbsp;[Fact]&lt;/LI&gt;
&lt;LI&gt;Reformulou assertions usando&amp;nbsp;Should().Throw&amp;lt;&amp;gt;()&amp;nbsp;(FluentAssertions)&lt;/LI&gt;
&lt;LI&gt;Adicionou comentários sobre paralelismo de&amp;nbsp;testes&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Cenário Python/unittest:&lt;/STRONG&gt;&lt;BR /&gt;Para a função validate_price, o Copilot propôs:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;def test_negative_price_raises_value_error(self):  
    with self.assertRaisesRegex(ValueError, "maior que zero"):  
        validate_price(-150)  
&lt;/LI-CODE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;"Notem como ele&amp;nbsp;incluiu validação de&amp;nbsp;mensagem de erro – detalhe que 80% dos iniciantes esquecem",&lt;/EM&gt;&amp;nbsp;destacou Rogério.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;img /&gt;
&lt;H2&gt;Diagramas&lt;/H2&gt;
&lt;P&gt;Com a extensão Mermaid,&amp;nbsp;Rogério transformou comandos em artefatos técnicos:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Prompt no VS Code:&lt;/STRONG&gt;&lt;BR /&gt;@mermaid Crie diagrama de classes para RentalService, Vehicle, Payment&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Resultado em 15s:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;classDiagram  
    Vehicle &amp;lt;|-- Car  
    Vehicle : +String license_plate  
    Vehicle : +register_rental()  
    Payment : +process_credit_card()  
    RentalService : +validate_availability()  
&lt;/LI-CODE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;"Esses&amp;nbsp;diagramas não&amp;nbsp;são estáticos",&lt;/EM&gt;&amp;nbsp;explicou.&amp;nbsp;&lt;EM&gt;"Atualizam-se automaticamente quando o código muda – crucial para microservices com&amp;nbsp;dezenas de componentes."&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H2&gt;Próximos passos&lt;/H2&gt;
&lt;P&gt;Assista as gravações do &lt;A class="lia-external-url" href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank" rel="noopener"&gt;GitHub Copilot Bootcamp&lt;/A&gt;&amp;nbsp;disponíveis em português, comece a utilizar o&amp;nbsp;&lt;A class="lia-external-url" href="https://aka.ms/AAun6jj" target="_blank" rel="noopener"&gt;GitHub Copilot gratuito&lt;/A&gt; e explore os módulos do Microsoft Learn:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/training/modules/generate-documentation-using-github-copilot-tools/" target="_blank" rel="noopener"&gt;Gerar documentação com GitHub Copilot&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/training/modules/develop-unit-tests-using-github-copilot-tools/" target="_blank" rel="noopener"&gt;Criar testes unitários com GitHub Copilot&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Mon, 24 Feb 2025 22:31:35 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/crie-testes-unit%C3%A1rios-e-documenta%C3%A7%C3%A3o-com-github-copilot/ba-p/4385265</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-02-24T22:31:35Z</dc:date>
    </item>
    <item>
      <title>Construindo uma Aplicação Web de IA com Python e FastAPI usando o GitHub Copilot</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/construindo-uma-aplica%C3%A7%C3%A3o-web-de-ia-com-python-e-fastapi-usando/ba-p/4376243</link>
      <description>&lt;P data-line="4"&gt;Desenvolver aplicações web que envolvem recursos de Inteligência Artificial (IA) pode parecer um projeto complexo, mas o surgimento de ferramentas como o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/features/copilot" data-href="https://github.com/features/copilot" target="_blank"&gt;GitHub Copilot&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;provou que esse processo pode ser altamente simplificado.&lt;/P&gt;
&lt;P data-line="6"&gt;Durante o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://aka.ms/GitHubCopilotBootcampBrasil" data-href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank"&gt;GitHub Copilot Bootcamp&lt;/A&gt;&lt;/STRONG&gt;, organizado pelo Microsoft Reactor São Paulo, a Engenheira de Software&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.linkedin.com/in/mayumi-shingaki/" data-href="https://www.linkedin.com/in/mayumi-shingaki/" target="_blank"&gt;Mayumi Shingaki&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;apresentou um exemplo prático de como criar, em poucos minutos, uma API em Python com funcionalidades de IA, mostrando como o GitHub Copilot auxilia na refatoração de código. Embora o título mencionasse o Flask, a palestrante optou por utilizar o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://fastapi.tiangolo.com/" data-href="https://fastapi.tiangolo.com/" target="_blank"&gt;FastAPI&lt;/A&gt;&lt;/STRONG&gt;, ao longo da demonstração, destacando a praticidade e o desempenho desse framework para criação de serviços REST.&lt;/P&gt;
&lt;P data-line="9"&gt;Neste artigo, exploraremos em detalhes como foi estruturada a criação dessa aplicação em Python, os motivos para a escolha do FastAPI, a experiencia de usar o GitHub Copilot na prática, e como simples rotas de CRUD ilustram o pontencial de combinar IA, Cloud e boas práticas de programação em um único projeto.&lt;/P&gt;
&lt;P data-line="9"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="15"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://aka.ms/GitHubCopilotBootcampBrasil" data-href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank"&gt;GitHub Copilot Bootcamp&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;é um evento online e gratuito que tem como intuito demonstrar, de maneira objetiva, o impacto positivo que essa ferramenta pode trazer para o dia a a dia do desenvolvedor.&lt;/P&gt;
&lt;P data-line="17"&gt;O GitHub Copilot, que é um assistente de programação baseado em IA, auxilia na produtividade do desenvolvedor, permitindo tarefas repetitivas sejam automatizadas e que a escrita de código siga padrões de qualidade, sempre exigindo revisão e aprovação humana.&lt;/P&gt;
&lt;P data-line="19"&gt;O evento conta com desconto de vouchers para as certificações oficiais do GitHub.&lt;/P&gt;
&lt;P data-line="21"&gt;Dessa forma, o GitHub Copilot Bootcamp é uma excelente oportunidade para quem deseja aprender mais sobre a ferramenta e claro te ajudar a se capacitar para o mercado de trabalho.&lt;/P&gt;
&lt;P data-line="23"&gt;Fique de olho no site oficial do GitHub Copilot Bootcamp para saber mais sobre as próximas edições e se inscrever.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Saiba mais sobre o GitHub Copilot Bootcamp:&amp;nbsp;&lt;A href="https://aka.ms/GitHubCopilotBootcampBrasil" data-href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank"&gt;https://aka.ms/GitHubCopilotBootcampBrasil&lt;/A&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Vamos agora aos detalhes da aplicação desenvolvida pela Mayumi durante o evento.&lt;/P&gt;
&lt;H2 data-line="31"&gt;&lt;STRONG&gt;Preparando o Ambiente para o Desenvolvimento&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="33"&gt;Antes de começar a falar da sessão, se você perder a live, você pode assistir a gravação no canal do&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.youtube.com/watch?v=NnRc6hutbLM" data-href="https://www.youtube.com/watch?v=NnRc6hutbLM" target="_blank"&gt;Microsoft Reactor São Paulo&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;no YouTube.&lt;/P&gt;
&lt;P data-line="33"&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://www.youtube.com/watch?v=NnRc6hutbLM/1739234998974" data-video-remote-vid="https://www.youtube.com/watch?v=NnRc6hutbLM/1739234998974" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FNnRc6hutbLM%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DNnRc6hutbLM&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FNnRc6hutbLM%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P data-line="35"&gt;Antes de mergulhar na criação da API, a palestrante destacou a importância de ter um ambiente mínimo de desenvolvimento já configurado:&lt;/P&gt;
&lt;OL data-line="37"&gt;
&lt;LI data-line="37"&gt;&lt;STRONG&gt;&lt;A href="https://www.python.org/" data-href="https://www.python.org/" target="_blank"&gt;Python (3.7+):&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;linguagem principal escolhida para o exemplo.&lt;/LI&gt;
&lt;LI data-line="38"&gt;&lt;STRONG&gt;&lt;A href="https://pypi.org/project/pip/" data-href="https://pypi.org/project/pip/" target="_blank"&gt;PIP&lt;/A&gt;&lt;/STRONG&gt;: gerenciador de pacotes para instalar bibliotecas como fastapi e uvicorn.&lt;/LI&gt;
&lt;LI data-line="39"&gt;&lt;STRONG&gt;&lt;A href="https://code.visualstudio.com/" data-href="https://code.visualstudio.com/" target="_blank"&gt;Visual Studio Code&lt;/A&gt;&lt;/STRONG&gt;: editor de texto com bom suporte à extensão do Copilot, além de diversas outras funcionalidades voltadas ao desenvolvimento em Python.&lt;/LI&gt;
&lt;LI data-line="40"&gt;&lt;STRONG&gt;&lt;A href="https://github.com/features/copilot" data-href="https://github.com/features/copilot" target="_blank"&gt;GitHub Copilot&lt;/A&gt;&lt;/STRONG&gt;: instalado como plugin no VS Code, liberando acesso ao chat e às sugestões inline.&lt;/LI&gt;
&lt;LI data-line="41"&gt;&lt;STRONG&gt;&lt;A href="https://www.postman.com/" data-href="https://www.postman.com/" target="_blank"&gt;Postman&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;(ou ferramentas similares): para testar as rotas da API, enviando requisições GET, POST e DELETE.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-line="43"&gt;Com esse conjunto básico de ferramentas, Mayumi mostrou que é possível iniciar um projeto e finalizar um MVP (Minimum Viable Product) em uma única sessão, aproveitando o Copilot para acelerar a fase de implementação.&lt;/P&gt;
&lt;P data-line="43"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="43"&gt;&lt;STRONG&gt;Por que usar o GitHub Copilot?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="49"&gt;O GitHub Copilot é uma ferramenta que utiliza modelos de linguagem de aprendizado profundo para gerar sugestões de código em tempo real, baseadas no contexto do que está sendo escrito. Isso significa que, ao digitar um comentário ou uma descrição de uma função, o Copilot é capaz de inferir o que você deseja fazer e sugerir trechos de código que atendam a essa necessidade.&lt;/P&gt;
&lt;P data-line="51"&gt;E Mayumi explicou perfeitamente como essa ferramena pode ser útil para desenvolvedores, especialmente para quem está começando ou para quem deseja acelerar o desenvolvimento de projetos.&lt;/P&gt;
&lt;P data-line="51"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="51"&gt;&lt;STRONG&gt;Novas funcionalidades do GitHub Copilot&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="57"&gt;Mayumi também destacou algumas das novas funcionalidades disponíveis no GitHub Copilot. Uma delas é o GitHub Copilot com Chat, que permite que você converse com o assistente de programação para obter sugestões de código. E, nesse mesmo recurso, te permite usar determinados comandos para obter sugestões mais específicas. Como por exemplo:&lt;/P&gt;
&lt;UL data-line="59"&gt;
&lt;LI data-line="59"&gt;&lt;STRONG&gt;&lt;EM&gt;@workspace:&lt;/EM&gt;&lt;/STRONG&gt; para obter sugestões de código com base no contexto do seu projeto.&lt;/LI&gt;
&lt;LI data-line="60"&gt;&lt;STRONG&gt;&lt;EM&gt;@terminal/explain:&lt;/EM&gt;&lt;/STRONG&gt; para explicar algo relacionado ao terminal.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="62"&gt;Essas novas funcionalidades tornam o GitHub Copilot ainda mais poderoso e útil para o desenvolvimento de projetos.&lt;/P&gt;
&lt;P data-line="64"&gt;Durante a live da Mayumi, ela cita outros comandos. Recomendo vocês assistirem a live para entender melhor como utilizar esses comandos.&lt;/P&gt;
&lt;P data-line="64"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="64"&gt;&lt;STRONG&gt;Por que FastAPI em vez de Flask?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="70"&gt;Apesar do título do vídeo mencionar o Flask, a decisão de demonstrar o FastAPI ocorreu por diversos motivos práticos:&lt;/P&gt;
&lt;UL data-line="72"&gt;
&lt;LI data-line="72"&gt;&lt;STRONG&gt;Documentação Automática&lt;/STRONG&gt;: o FastAPI gera, por padrão, uma interface visual de documentação em&amp;nbsp;/docs, facilitando o entendimento das rotas disponíveis.&lt;/LI&gt;
&lt;LI data-line="74"&gt;&lt;STRONG&gt;Validação de Dados&lt;/STRONG&gt;: via&amp;nbsp;pydantic, o framework oferece suporte nativo para checagem de campos de entrada, reduzindo a chance de erros em produção.&lt;/LI&gt;
&lt;LI data-line="76"&gt;&lt;STRONG&gt;Simplicidade de Código&lt;/STRONG&gt;: a forma de definir rotas e modelos é extremamente legível, favorecendo o uso de boas práticas e uma curva de aprendizado menor.&lt;/LI&gt;
&lt;LI data-line="78"&gt;&lt;STRONG&gt;Desempenho&lt;/STRONG&gt;: o FastAPI é assíncrono e aproveita recursos do Python 3 que permitem maior escalabilidade em cenários de múltiplas requisições simultâneas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="80"&gt;No exemplo prático, Mayumi desenvolveu um CRUD para gerenciamento de tarefas, demonstrando como o Copilot pode sugerir trechos de rota (POST, GET, DELETE) e modelos Python de forma rápida e baseada no contexto do arquivo.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="80"&gt;&lt;STRONG&gt;Arquitetura Limpa e Organização do Código&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="88"&gt;A palestrante menciona a adoção de conceitos de Clean Architecture e Clean Code, que, embora num nível básico, já ajudam a manter a aplicação organizada. De maneira geral, o código foi separado em camadas:&lt;/P&gt;
&lt;UL data-line="90"&gt;
&lt;LI data-line="90"&gt;&lt;STRONG&gt;Models:&lt;/STRONG&gt;&amp;nbsp;classes Python que representam as entidades do projeto (por exemplo, uma classe&amp;nbsp;Task&amp;nbsp;com atributos&amp;nbsp;title&amp;nbsp;e&amp;nbsp;description).&lt;/LI&gt;
&lt;LI data-line="92"&gt;&lt;STRONG&gt;Repositories:&lt;/STRONG&gt;&amp;nbsp;responsáveis pela persistência de dados; no caso da demo, a persistência foi apenas em memória. Em produção, poderia ser um banco&amp;nbsp;SQL&amp;nbsp;ou&amp;nbsp;NoSQL.&lt;/LI&gt;
&lt;LI data-line="94"&gt;&lt;STRONG&gt;Services/Use Cases:&lt;/STRONG&gt;&amp;nbsp;contém a lógica de negócio, como validação de regras, criação de novas instâncias de tarefa e manipulação de dados antes de salvar.&lt;/LI&gt;
&lt;LI data-line="96"&gt;&lt;STRONG&gt;Routes:&lt;/STRONG&gt;&amp;nbsp;definem a interface HTTP com o usuário, mapeando rotas (/tasks) a funções que chamam as camadas internas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="98"&gt;Essa estratificação faz com que mudanças na lógica de acesso a dados ou no framework web não impactem a camada de negócio, tornando a aplicação mais modular e sustentável a longo prazo.&lt;/P&gt;
&lt;H2 data-line="96"&gt;&lt;STRONG&gt;Criando a Aplicação Passo a Passo com GitHub Copilot&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="102"&gt;A maior parte da sessão consistiu em demonstrações ao vivo de como o Copilot pode ajudar durante a programação. As principais interações destacadas foram:&lt;/P&gt;
&lt;OL data-line="104"&gt;
&lt;LI data-line="104"&gt;&lt;STRONG&gt;Criação de Estrutura de Projeto:&lt;/STRONG&gt;&amp;nbsp;no chat do GitHub Copilot, Mayumi digitou comandos como&amp;nbsp;/new workspace, solicitando que a IA gerasse diretórios e arquivos iniciais de um projeto FastAPI. Em seguida, validou e ajustou manualmente a sugestão até ficar coerente com o que precisava.&lt;/LI&gt;
&lt;LI data-line="106"&gt;&lt;STRONG&gt;Instalação de Dependências:&lt;/STRONG&gt;&amp;nbsp;o GitHub Copilot propôs um&amp;nbsp;requirements.txt&amp;nbsp;contendo os pacotes:&amp;nbsp;fastapi,&amp;nbsp;uvicorn,&amp;nbsp;pydantic&amp;nbsp;e outras dependências pertinentes. Com um simples&amp;nbsp;pip install -r requirements.txt, a aplicação já estava preparada para execução local.&lt;/LI&gt;
&lt;LI data-line="108"&gt;&lt;STRONG&gt;Rotas e Controladores:&lt;/STRONG&gt;&amp;nbsp;ao iniciar a escrita de uma rota&amp;nbsp;@app.post("/tasks"), o GitHub Copilot sugeriu uma função Python que recebia dados de uma nova tarefa, criava a instância e retornava um JSON de sucesso. Sempre que algo precisava de ajustes — como, por exemplo, mudar a forma de gerar IDs ou incluir campos adicionais — Mayumi editava o código ou pedia ao GitHub Copilot correções pontuais.&lt;/LI&gt;
&lt;LI data-line="110"&gt;&lt;STRONG&gt;Testes Unitários:&lt;/STRONG&gt;&amp;nbsp;a palestrante salientou que o GitHub Copilot poderia gerar blocos de teste com facilidade. Bastaria pedir algo como&amp;nbsp;&lt;EM&gt;“Crie testes para o arquivo routes.py usando Pytest e verifique criação e listagem de tarefas”&lt;/EM&gt;. O GitHub Copilot, então, criaria um esqueleto de testes parametrizados, economizando tempo na estrutura básica de verificação.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-line="112"&gt;Durante o processo, alguns erros surgiram, especialmente relacionados a importações incorretas ou referências a módulos inexistentes. Isso exemplificou o fato de que a IA não é infalível. No entanto, Mayumi ressaltou que o GitHub Copilot conta com recursos como&amp;nbsp;/fix, onde o usuário descreve o erro, e a IA analisa o código buscando possíveis soluções.&lt;/P&gt;
&lt;P data-line="114"&gt;Esse fluxo de tentativa e correção é comum no desenvolvimento, e o GitHub Copilot pode realmente encurtar o ciclo de depuração.&lt;/P&gt;
&lt;P data-line="114"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="114"&gt;&lt;STRONG&gt;Testando a API e Explorando a Documentação&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Uma vez que o código estava funcional, Mayumi usou o comando:&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;uvicorn app.main:app --host 0.0.0.0 --port 8000&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-line="126"&gt;Assim inicializou a aplicação na porta&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;http://localhost:8000&lt;/STRONG&gt;&lt;/EM&gt;, permitindo que o Postman fizesse requisições HTTP para as rotas&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;/tasks&lt;/STRONG&gt;&lt;/EM&gt;&amp;nbsp;e&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;/tasks/{task_id}&lt;/STRONG&gt;&lt;/EM&gt;.&lt;/P&gt;
&lt;P data-line="128"&gt;Para verificar se tudo funcionava corretamente, a palestrante lançou mão do Postman, enviando requisições de criação, listagem e de exclusão de tarefas. As chamadas foram bem-sucedidas e a API retornou dados em JSON, confirmando o funcionamento do CRUD.&lt;/P&gt;
&lt;P data-line="128"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Ao acessar &lt;STRONG&gt;&lt;EM&gt;http://127.0.0.1:8000/docs&lt;/EM&gt;&lt;/STRONG&gt;, a interface gerada pelo FastAPI exibiu, em forma de Swagger, todas as rotas disponíveis, além de permitir testes rápidos das requisições. Esse recurso de documentação automática é um grande diferencial do FastAPI em relação a frameworks mais básicos.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="134"&gt;&lt;STRONG&gt;Observações Importantes e Desafios&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="140"&gt;Apesar de a experiência ter sido predominantemente positiva, Mayumi ressalta que o GitHub Copilot:&lt;/P&gt;
&lt;UL data-line="142"&gt;
&lt;LI data-line="142"&gt;&lt;STRONG&gt;Não deve ser usado de forma cega:&lt;/STRONG&gt;&amp;nbsp;é muito importante revisar todas as sugestões, pois a IA não é onisciente e pode propor soluções inconsistentes.&lt;/LI&gt;
&lt;LI data-line="144"&gt;&lt;STRONG&gt;É baseado em contexto:&lt;/STRONG&gt;&amp;nbsp;para obter melhores respostas, é necessário que o usuário selecione trechos de código, explique o que deseja no chat ou contextualize o GitHub Copilot sobre o restante do repositório.&lt;/LI&gt;
&lt;LI data-line="146"&gt;&lt;STRONG&gt;Auxilia o aprendizado:&lt;/STRONG&gt;&amp;nbsp;mesmo desenvolvedores iniciantes podem descobrir novas práticas de código ao interagir com as sugestões, pedindo explicações sobre por que o GitHub Copilot gerou determinado padrão ou sintaxe.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="148"&gt;Além disso, cada empresa pode ter padrões específicos de arquitetura, estilo e segurança. O GitHub Copilot, embora traga melhorias consideráveis de produtividade, necessita ser customizado para respeitar tais diretrizes de cada equipe.&lt;/P&gt;
&lt;H2 data-line="148"&gt;&lt;STRONG&gt;Certificações GitHub&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="152"&gt;Durante o evento, a Cynthia Zanoni, Developer Advocate de Developer Tools da Microsoft mencionou a grande oportunidade em que os participantes do GitHub Copilot Bootcamp têm de obter descontos em certificações oficiais do GitHub.&lt;/P&gt;
&lt;P data-line="154"&gt;Essas certificações são uma excelente forma de validar seus conhecimentos e habilidades em ferramentas como o GitHub Copilot, além de serem um diferencial no mercado de trabalho.&lt;/P&gt;
&lt;H2 data-line="154"&gt;&lt;STRONG&gt;Conclusão&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="158"&gt;A demonstração conduzida por Mayumi Shingaki evidenciou o quão rápido e prático é desenvolver uma aplicação web de IA em Python quando se tem em mãos ferramentas adequadas. O GitHub Copilot se destaca como um parceiro confiável para criar estrutura de pastas, rotas, testes e corrigir erros, sempre que o desenvolvedor contextualiza bem o que deseja fazer.&lt;/P&gt;
&lt;P data-line="160"&gt;Optar por FastAPI em vez de Flask se mostrou uma escolha vantajosa para a prova de conceito apresentada, devido à facilidade de geração de documentação, validação de dados e suporte a recursos assíncronos. A aplicação de “lista de tarefas” demonstrada é simples, mas ilustrativa: mostra como podemos estruturar um CRUD completo em poucos passos, aproveitando o Copilot para acelerar o desenvolvimento.&lt;/P&gt;
&lt;P data-line="162"&gt;No fim das contas, o recado principal é que o GitHub Copilot não elimina a necessidade de um bom desenvolvedor, mas potencializa sua atuação ao delegar rotinas padronizadas a uma IA e liberar tempo e esforço para o raciocínio crítico e a criação de valor de negócio. Eventos como o GitHub Copilot Bootcamp, reforçados pela disponibilidade de desafios (Cloud Skills Challenge) e vouchers de desconto, ampliam a curva de aprendizado e a consolidação de boas práticas em todo o ecossistema de desenvolvimento.&lt;/P&gt;
&lt;P data-line="164"&gt;E para saber mais sobre o GitHub Copilot Bootcamp, confiram os links abaixo:&lt;/P&gt;
&lt;UL data-line="166"&gt;
&lt;LI data-line="166"&gt;&lt;A href="https://aka.ms/GitHubCopilotBootcampBrasil" data-href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank"&gt;Registre-se e receba as gravações das aulas do bootcamp&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="167"&gt;&lt;A href="https://aka.ms/csc/githubcopilot" data-href="https://aka.ms/csc/githubcopilot" target="_blank"&gt;GitHub Copilot Challenge: participe do desafio de aprendizagem e ganhe uma badge digital&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="168"&gt;&lt;A href="https://lnkd.in/d6dVB-Bq" data-href="https://lnkd.in/d6dVB-Bq" target="_blank"&gt;GitHub Copilot GRATUITO no Visual Studio Code&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="169"&gt;&lt;A href="https://aka.ms/discord/gh-copilot-bootcamp" data-href="https://aka.ms/discord/gh-copilot-bootcamp" target="_blank"&gt;Participe da Comunidade Azure AI no Discord&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="170"&gt;&lt;A href="https://aka.ms/info-github-certs" data-href="https://aka.ms/info-github-certs" target="_blank"&gt;Utilize o cupom de desconto da sessão para fazer uma certificação do GitHub&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="172"&gt;E nos vemos no próximo artigo! 🚀&lt;/P&gt;</description>
      <pubDate>Tue, 11 Feb 2025 00:59:07 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/construindo-uma-aplica%C3%A7%C3%A3o-web-de-ia-com-python-e-fastapi-usando/ba-p/4376243</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-02-11T00:59:07Z</dc:date>
    </item>
    <item>
      <title>Engenharia de Prompt com o GitHub Copilot</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/engenharia-de-prompt-com-o-github-copilot/ba-p/4374002</link>
      <description>&lt;P&gt;O&amp;nbsp;&lt;STRONG&gt;GitHub Copilot&lt;/STRONG&gt;&amp;nbsp;é uma ferramenta de inteligência artificial que ajuda desenvolvedores a escrever código de forma mais rápida e eficiente. Durante o &lt;STRONG&gt;&lt;A class="lia-external-url" href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank" rel="noopener"&gt;GitHub Copilot Bootcamp Brasil (acesse as gravações)&lt;/A&gt;,&lt;/STRONG&gt; reunimos conteúdos práticos para ensinar como dominar a&amp;nbsp;&lt;STRONG&gt;engenharia de prompts&lt;/STRONG&gt; e explorar as funcionalidades do Copilot, aumentando sua produtividade em tarefas do dia a dia, como criar rotas para APIs, automatizar testes e integrar pipelines com GitHub Actions.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/bU7gP9PErwM/1738761465377" data-video-remote-vid="https://youtu.be/bU7gP9PErwM/1738761465377" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FbU7gP9PErwM%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DbU7gP9PErwM&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FbU7gP9PErwM%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;O GitHub Copilot é um assistente de programação baseado em IA desenvolvido pelo GitHub em parceria com a OpenAI. Ele utiliza modelos avançados de linguagem, como o GPT-4, para oferecer sugestões contextuais diretamente no editor do desenvolvedor. Seja completando funções, gerando trechos de código ou explicando blocos complexos, o Copilot atua como um parceiro que acelera tarefas repetitivas e permite que os desenvolvedores foquem em problemas estratégicos.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Principais benefícios do GitHub Copilot:&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Sugestões Contextuais&lt;/STRONG&gt;: Recomendações baseadas no código existente e nos comentários fornecidos.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Compatibilidade com Diversos Editores&lt;/STRONG&gt;: Funciona com IDEs populares, como Visual Studio Code, JetBrains IDEs e Neovim.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Geração de Código Completo&lt;/STRONG&gt;: Cria funções inteiras ou snippets com base em descrições textuais.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Documentação Automatizada&lt;/STRONG&gt;: Auxilia na criação de comentários e documentação alinhados ao código.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://aka.ms/AAun6jj" target="_blank" rel="noopener"&gt;Com um plano gratuito disponível, basta ter uma conta no GitHub para ativar o Copilot. &lt;/A&gt;Ele pode ser usado no Visual Studio Code (VSCode), via chat integrado, autocomplete enquanto você escreve ou até mesmo pela linha de comando (CLI). Também há uma extensão específica para o Azure (GitHub Copilot for Azure).&lt;/P&gt;
&lt;P&gt;De acordo com estudos realizados pelo GitHub, desenvolvedores que utilizam o Copilot relatam até&amp;nbsp;&lt;STRONG&gt;55% mais produtividade&lt;/STRONG&gt; e maior satisfação no trabalho.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Durante a sessão, utilizamos o&amp;nbsp;&lt;STRONG&gt;&lt;A class="lia-external-url" href="https://github.com/features/codespaces" target="_blank" rel="noopener"&gt;GitHub Codespaces, uma versão do Visual Studio Code na nuvem&lt;/A&gt;&lt;/STRONG&gt;. Essa ferramenta permite configurar um ambiente completo de desenvolvimento em poucos minutos, eliminando a necessidade de configurações locais demoradas. O Codespaces oferece 60 horas gratuitas por mês, permitindo pausar e retomar ambientes conforme necessário para uma gestão eficiente dos recursos.&lt;/P&gt;
&lt;P&gt;Além disso, ele suporta templates prontos para tecnologias como React, Jupyter Notebooks e .NET. Durante a demonstração, configuramos um projeto FastAPI diretamente no Codespaces e mostramos como ele facilita o desenvolvimento de APIs.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;STRONG&gt;O que é Engenharia de Prompts?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;A&amp;nbsp;&lt;STRONG&gt;engenharia de prompts&lt;/STRONG&gt;&amp;nbsp;é a prática de estruturar comandos ou instruções para obter os melhores resultados possíveis de modelos de IA generativa. No caso do GitHub Copilot, isso significa criar descrições claras e detalhadas sobre o que você deseja que ele faça.&lt;/P&gt;
&lt;P&gt;Por exemplo:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;"""
Crie uma função para listar cidades por país:
- A função deve aceitar 'country' como parâmetro.
- Retorne as cidades associadas ao país especificado.
- Trate erros caso o país não seja encontrado.
"""
&lt;/LI-CODE&gt;
&lt;P&gt;Com base nesse prompt, o Copilot pode gerar automaticamente:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;@app.get("/cities/{country}")
def list_cities(country: str):
    country_cities = {
        "Brazil": ["São Paulo", "Rio de Janeiro", "Belo Horizonte"],
        "USA": ["New York", "Los Angeles", "Chicago"],
        "Japan": ["Tokyo", "Osaka", "Kyoto"]
    }
    
    if country not in country_cities:
        raise HTTPException(status_code=404, detail="Country not found")
    
    return {"cities": country_cities[country]}
&lt;/LI-CODE&gt;
&lt;P&gt;Essa abordagem economiza tempo e garante que o código gerado esteja alinhado às especificações fornecidas.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Por que Engenharia de Prompts é importante?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;A qualidade das sugestões geradas pelo GitHub Copilot depende diretamente da clareza dos prompts fornecidos. Prompts bem elaborados ajudam a IA a entender melhor o contexto do problema, resultando em saídas mais úteis e precisas.&lt;/P&gt;
&lt;P&gt;Alguns benefícios:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Maior Controle sobre as Respostas&lt;/STRONG&gt;: Reduz ambiguidades e direciona a IA para produzir exatamente o que você precisa.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Eficiência no Desenvolvimento&lt;/STRONG&gt;: Menos ajustes manuais economizam tempo valioso.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Versatilidade&lt;/STRONG&gt;: Permite explorar diferentes abordagens para resolver problemas complexos.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Por exemplo, ao criar uma API com FastAPI, um prompt detalhado pode gerar rotas completas com tratamento de erros:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;"""
Crie uma rota FastAPI para listar cidades por país:
- A rota deve ser '/cities/{country}'.
- Aceite 'country' como string.
- Retorne uma lista das cidades associadas ao país fornecido.
- Trate erros caso o país não seja encontrado no dicionário.
"""
&lt;/LI-CODE&gt;
&lt;P&gt;Resultado gerado pelo Copilot:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;@app.get("/cities/{country}")
def list_cities(country: str):
    country = country.capitalize()
    country_cities = {
        "Brazil": ["São Paulo", "Rio de Janeiro", "Belo Horizonte"],
        "USA": ["New York", "Los Angeles", "Chicago"],
        "Japan": ["Tokyo", "Osaka", "Kyoto"]
    }
    
    if country not in country_cities:
        raise HTTPException(status_code=404, detail="Country not found")
    
    return {"cities": country_cities[country]}
&lt;/LI-CODE&gt;
&lt;P&gt;Durante esta sessão do&amp;nbsp;&lt;STRONG&gt;GitHub Copilot Bootcamp Brasil&lt;/STRONG&gt;, você aprenderá:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Introdução ao GitHub Copilot e Engenharia de Prompts&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Como usar prompts eficazes para gerar código relevante.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Configuração de Ambientes na Nuvem com GitHub Codespaces&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Criar ambientes rápidos e flexíveis na nuvem.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Criação de APIs com FastAPI&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Desenvolver rotas robustas utilizando sugestões do Copilot.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Automatização de Testes com pytest&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Criar testes automatizados para validar funcionalidades da API.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Integração Contínua com GitHub Actions&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Configurar pipelines automatizados para rodar testes e builds.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2&gt;&lt;STRONG&gt;Conclusão&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;A combinação entre o&amp;nbsp;&lt;STRONG&gt;GitHub Copilot&lt;/STRONG&gt;&amp;nbsp;e a engenharia de prompts representa um salto significativo na forma como desenvolvemos software. Ferramentas como essas permitem não apenas acelerar tarefas repetitivas, mas também melhorar a qualidade do código produzido.&lt;/P&gt;
&lt;P&gt;Se você deseja aprender mais sobre essas técnicas, assista as gravações do &lt;A class="lia-external-url" href="https://aka.ms/GitHubCopilotBootcampBrasil" target="_blank" rel="noopener"&gt;GitHub Copilot Bootcamp&lt;/A&gt; disponíveis em português, comece a utilizar o &lt;A class="lia-external-url" href="https://aka.ms/AAun6jj" target="_blank" rel="noopener"&gt;GitHub Copilot gratuito&lt;/A&gt;&amp;nbsp;e descubra como transformar sua maneira de programar utilizando inteligência artificial!&lt;/P&gt;</description>
      <pubDate>Mon, 24 Feb 2025 21:32:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/engenharia-de-prompt-com-o-github-copilot/ba-p/4374002</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-02-24T21:32:22Z</dc:date>
    </item>
  </channel>
</rss>

