# AzureBrasil.cloud > Gestão estratégica e inovadora do seu ambiente Microsoft Public Ghost content for AI and LLM tooling. This file includes a bounded export of public pages first, then recent public posts. Append `.md` to any post or page URL to get the content in Markdown (for example, `/example-post.md`). ## Pages ### Sobre a AzureBrasil.cloud URL: https://www.azurebrasil.cloud/about/ Last updated: 2024-08-07T17:39:42.000Z ### Bem-vindo à AzureBrasil.cloud, uma empresa de tecnologia apaixonada por ajudar nossos clientes a alcançarem todo o potencial do Microsoft Azure! Somos uma equipe experiente e dedicada, que acredita no poder da nuvem e em como ela pode transformar e otimizar os negócios. Desde 2013, trabalhamos exclusivamente com projetos focados em Azure, fornecendo conteúdo, treinamentos e consultoria para empresas e profissionais. Nossa missão é simples: > Queremos que você tire o máximo proveito das ferramentas e serviços do Azure sem gastar mais do que o necessário. E, **com mais de 10 anos de experiência**, você pode ter certeza de que estamos preparados para ajudá-lo a alcançar seus objetivos. Em 2022, recebemos o prêmio de **maior parceiro Azure na TDSynnex**, comprovando o nosso compromisso com a excelência e a qualidade do serviço prestado. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/premio-td-2022.png) Estamos constantemente trabalhando para aprimorar nossos serviços e garantir que nossos clientes estejam sempre satisfeitos. Oferecemos uma variedade de serviços para atender às necessidades de nossos clientes, incluindo: 1. **Criação de contas Azure:** Facilitamos o processo de criação de contas Azure para que você possa começar a utilizar os recursos em nuvem o mais rápido possível. 2. **Consultoria e revisão focada em melhores práticas:** Nossa equipe de especialistas revisa e aconselha sobre as melhores práticas para garantir que seus projetos Azure sejam eficientes, seguros e escaláveis. 3. **Gerenciamento e redução de custos:** Ajudamos a otimizar os gastos com o Azure, identificando oportunidades de redução de custos e alocando recursos de maneira eficiente. 4. **Treinamentos Microsoft Azure:** Oferecemos treinamentos abrangentes e personalizados para empresas e profissionais que desejam aprofundar seus conhecimentos em Azure e melhorar suas habilidades. A AzureBrasil.cloud está pronta para ajudá-lo em sua jornada na nuvem. Convidamos você a explorar nosso site, conhecer nossos serviços e entrar em contato conosco para discutir como podemos contribuir para o seu sucesso no Microsoft Azure. Estamos ansiosos para trabalhar com você! ### Contato URL: https://www.azurebrasil.cloud/contato/ Last updated: 2024-08-07T17:39:32.000Z Mensagem Enviar ### Agenda AzureBrasil.cloud URL: https://www.azurebrasil.cloud/agenda-azurebrasil-cloud/ Last updated: 2024-08-07T17:41:03.000Z _No content available._ ### Reduza seus custos de AKS URL: https://www.azurebrasil.cloud/reduza-seus-custos-de-aks/ Last updated: 2024-08-08T12:38:52.000Z ## **Você está pagando mais do que deveria pelo seu ambiente com AKS?** Nós temos a solução perfeita para você! Somos especializados em analisar e reduzir custos do seu ambiente. Temos profissionais altamente qualificados, você e sua equipe vão descobrir como otimizar seus recursos e fazer um right sizing do seu cluster. ### **O que oferecemos:** - **Análise de custos:** Identificamos os pontos críticos onde há desperdício e onde você pode economizar. - **Planejamento de otimização:** Criamos um plano personalizado para garantir que sua infraestrutura esteja utilizando os recursos de forma eficiente. - **Implementação de melhorias:** Nossos especialistas ajudam na implementação das melhores práticas para reduzir custos sem comprometer a performance. - **Monitoramento contínuo:** Acompanhamos seu ambiente para garantir que ele continue otimizado ao longo do tempo. ### **Por que escolher nossos serviços?** - **Experiência comprovada:** Temos uma equipe de especialistas com ampla experiência em AKS e gerenciamento de custos em cloud. - **Soluções personalizadas:** Sabemos que cada empresa é única, por isso, nossas soluções são customizadas para atender às suas necessidades. - **Resultados rápidos:** Temos certeza que vamos conseguir reduzir os custos do seu cluster em pouco tempo. ### **Não perca mais dinheiro!** 💡 Entre em contato conosco e descubra como podemos te ajudar. [EU QUERO REVISAR MEU AMBIENTE DE AKS](https://www.azurebrasil.cloud/consultoria-aks) ### Procedimento Azure URL: https://www.azurebrasil.cloud/procedimento-azure/ Last updated: 2024-09-10T12:37:58.000Z 1. Acesse o portal do Azure com o usuário global admin atual do tenant [https://portal.azure.com](https://portal.azure.com/?ref=azurebrasil.cloud) e vá ao Microsoft Entra ID. 2. Selecione a opção Propriedades. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/data-src-image-b1158ac1-1c05-4628-816d-1379cfeb2fca.png) 1. Selecione **Sim** para a opção em destaque e clique em Salvar. Você deve fazer o logout e login no portal do Azure para que a medida surta efeito. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/data-src-image-772c01db-88b7-45aa-aab7-1ee78582dbc0.png) 1. Acesse o [https://portal.azure.com](https://portal.azure.com/?ref=azurebrasil.cloud) e clique em Assinaturas (Subscriptions): ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/data-src-image-3b2e806c-d8c4-482f-8133-b9e8fe40a288.png) 1. Clique em Subscriptions == global filter e desmarque a opção “Show only subscriptions selected…” e clique em Apply e a nova assinatura aparecerá: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/data-src-image-c2932fea-96ab-4c5f-bdb7-9d1b3f3183b1.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/data-src-image-3a40fe98-bee5-4b4f-b411-b7dcaef83332.png) Depois desse procedimento é necessário acessar Assinaturas > Assinatura > IAM (Controle de Acesso) > e adicionar o usuário como Owner da assinatura. Lembrando a obrigatoriedade de habilitar e configurar o MFA para este também. ### Como descobrir o domínio .onmicrosoft URL: https://www.azurebrasil.cloud/como-descobrir-o-dominio-onmicrosoft/ Last updated: 2024-09-24T12:34:21.000Z **Opção 1 - Portal Office** 1. Acesse [**https://portal.office.com**](https://portal.office.com/?ref=azurebrasil.cloud) e clique em **Admin.** Você pode acessar diretamente [**https://admin.microsoft.com**](https://admin.microsoft.com/?ref=azurebrasil.cloud): ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-32-1.png) 1. Clique em **Mostrar tudo / Show all:** ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-33.png) 1. Expanda **Configurações / Settings** e, depois, em **Domínios / Domains:** ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-34.png) 1. Serão listados todos os domínios abaixo do tenant, procure pelo **onmicrosoft.com**: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-35.png) ### Processo para Visualizar a Assinatura do Azure após Compra URL: https://www.azurebrasil.cloud/processo-para-visualizar-a-assinatura-do-azure-apos-compra/ Last updated: 2024-09-30T17:39:02.000Z Com as alterações que a Microsoft vem fazendo em relação ao DAP – GDAP alguns passos de atribuição de assinatura foram limitados, esse documento te ajudará a visualizar a assinatura após a compra. 1.Após a inserção do pedido, com as credenciais de admin global recebidas ou de um usuário que seja admin global e deseje acessar o ambiente é necessário acessar o link: [https://portal.azure.com](https://portal.azure.com/?ref=azurebrasil.cloud#home), após isso você verá a tela abaixo: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-45.png) 1. Clique na opção exibir ou pesquise “Entra ID” na faixa azul superior do portal e clique nela. 2. Após isso você verá o menu do Entra ID a sua esquerda deslize o menu até a opção “propriedades”, como mostra a figura abaixo: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-46.png) 1. Dentro de propriedades role a tela para baixo e encontre a opção “gerenciamento de acesso para os recursos do Azure”, e marque essa opção como “sim”. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-47.png) 1. Clique em sim, depois em Salvar. 2. Essa função habilita o gerenciamento herdado para as assinaturas do Azure do tenant. 3. Depois de salvar as alterações, feche o navegador e abra novamente usando o link: [https://portal.azure.com](https://portal.azure.com/?ref=azurebrasil.cloud), após abrir o site pesquise por assinatura e depois clique no menu assinaturas, como mostra a imagem: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-48.png) 1. Após acessar o menu assinaturas você verá a assinatura, como mostra a imagem abaixo: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-49.png) 1. Depois de verificar que a assinatura está disponível, clique nela, vá até o menu “IAM controle de acesso” e depois “adicionar” e depois “adicionar atribuição de função”, como mostra a imagem abaixo: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-50.png) 10.Em seguida selecione a opção “funções de administrador privilegiadas”, selecione “proprietário” e clique em próximo como mostra a imagem abaixo: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-51.png) 1. Na opção “membros”, clique na opção “+selecionar membros”, depois insira o nome do usuário administrador, clique no nome do usuário, clique no botão “selecionar” e depois “próximo”, como mostra a imagem abaixo: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-52.png) 1. No menu “condições”, selecione a opção (altamente privilegiadas), como mostra a imagem abaixo: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-53.png) 1. Por fim, selecione a opção “examinar + atribuir”, para finalizar o processo, como mostra a imagem abaixo: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2024/09/image-54.png) Ao finalizar esse processo o usuário terá a função de “proprietário” na assinatura e poderá trabalhar normalmente com o Azure. A última etapa é retornar aos passos 3 e 4, e voltar a opção para “não”, pois não é ideal que essa função fique habilitada. Também é muito importante que pelo menos todos os administradores do ambiente possuam o MFA habilitado, isso é fundamental para manter o ambiente seguro, sempre se certifique o todos os usuários administradores possuem essa função habilitada. ### PBIPILOT URL: https://www.azurebrasil.cloud/pbipilot/ Last updated: 2024-11-29T14:16:34.000Z _No content available._ ### Governança e Segurança URL: https://www.azurebrasil.cloud/governanca-e-seguranca/ Last updated: 2025-01-28T04:55:29.000Z Implementação de Landing Zones: Estruture e otimize seu ambiente na nuvem com configurações padronizadas. Revisão de Baseline de Segurança: Avaliamos e aprimoramos a segurança do seu ambiente Azure, assegurando proteção robusta contra ameaças. Conformidade com Boas Práticas: Garantimos que sua infraestrutura esteja em conformidade com as diretrizes e normas de governança da Microsoft. ### Redução de custos URL: https://www.azurebrasil.cloud/reducao-de-custos/ Last updated: 2025-01-28T04:53:29.000Z _No content available._ ### Banco de Dados URL: https://www.azurebrasil.cloud/banco-de-dados/ Last updated: 2025-01-28T04:55:35.000Z Gerenciamento de Banco de Dados: Administramos e monitoramos seus bancos de dados para garantir segurança e desempenho. Otimização de Performance: Melhoramos a eficiência dos seus bancos de dados, reduzindo tempos de resposta e aumentando a capacidade de processamento. Consultoria Especializada: Oferecemos orientação técnica e estratégica para a melhor utilização dos recursos de banco de dados. ### Inteligência Empresarial URL: https://www.azurebrasil.cloud/inteligencia-empresarial/ Last updated: 2025-01-28T04:55:42.000Z Design de Projetos de BI: Projetamos soluções personalizadas para atender às necessidades específicas do seu negócio. Desenvolvimento de BI: Implementamos tecnologias de BI para transformar dados brutos em insights acionáveis. Implantação e Suporte: Asseguramos a integração e funcionamento contínuo das soluções de BI, proporcionando suporte contínuo. ### Escala e Flexibilidade URL: https://www.azurebrasil.cloud/escala-e-flexibilidade/ Last updated: 2025-01-28T04:55:05.000Z _No content available._ ### Monitoramento e Suporte URL: https://www.azurebrasil.cloud/monitoramento-e-suporte/ Last updated: 2025-01-28T04:55:13.000Z Monitoramento Contínuo: Utilizamos ferramentas avançadas para monitorar continuamente sua infraestrutura, identificando e resolvendo problemas antes que afetem suas operações. Suporte Proativo: Nossa equipe de especialistas está sempre disponível para fornecer suporte técnico e resolver qualquer questão, minimizando o tempo de inatividade. Análise e Relatórios: Fornecemos análises detalhadas e relatórios regulares sobre o desempenho de sua infraestrutura, ajudando você a tomar decisões informadas. Manutenção Preventiva: Realizamos manutenções preventivas para assegurar que seus sistemas estejam sempre atualizados e protegidos contra vulnerabilidades. ### Blog URL: https://www.azurebrasil.cloud/blog/ Last updated: 2025-01-28T04:52:03.000Z _No content available._ ### Sobre URL: https://www.azurebrasil.cloud/sobre/ Last updated: 2025-01-28T04:52:51.000Z _No content available._ ### Suporte URL: https://www.azurebrasil.cloud/suporte/ Last updated: 2025-01-28T04:52:41.000Z _No content available._ ### Privacidade e Política URL: https://www.azurebrasil.cloud/privacidade-e-politica/ Last updated: 2025-01-28T04:52:44.000Z _No content available._ ### Termos & Condições URL: https://www.azurebrasil.cloud/termos-condicoes/ Last updated: 2025-01-28T04:52:47.000Z _No content available._ ### AKS e Serviços de Aplicativos URL: https://www.azurebrasil.cloud/aks-e-servicos-de-aplicativos/ Last updated: 2025-01-28T04:55:22.000Z Otimização de AKS (Azure Kubernetes Service): Ajustamos e aprimoramos seus clusters Kubernetes para máxima eficiência. Gerenciamento de Aplicativos: Monitoramos e gerenciamos suas aplicações na nuvem, assegurando alta performance e disponibilidade. Consultoria Estratégica: Fornecemos insights e estratégias para maximizar o uso dos recursos Azure em suas aplicações. ## Posts ### Azure Newsletter - 2026-09-14 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-09-14/ Last updated: 2026-09-14T12:08:11.000Z ### Azure Updates - [Azure App Service is now a trigger destination for Azure Managed Connectors](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/azure-app-service-is-now-a-trigger-destination-for-azure-managed/ba-p/4555785?ref=azurebrasil.cloud) - [AI Agent ROI Framework](https://techcommunity.microsoft.com/t5/azure-architecture-blog/ai-agent-roi-framework/ba-p/4555445?ref=azurebrasil.cloud) - [Announcing savings plan for databases: flexible savings for modern, evolving workloads](https://techcommunity.microsoft.com/t5/finops-blog/announcing-savings-plan-for-databases-flexible-savings-for/ba-p/4503107?ref=azurebrasil.cloud) - [Building on AI Landing Zones: Operationalizing Enterprise AI with the Citadel Architecture](https://techcommunity.microsoft.com/t5/azure-architecture-blog/building-on-ai-landing-zones-operationalizing-enterprise-ai-with/ba-p/4551078?ref=azurebrasil.cloud) - [From OSDU to Ontology: Why Oil & Gas AI Readiness Lives at the Meaning Layer](https://techcommunity.microsoft.com/t5/azure-architecture-blog/from-osdu-to-ontology-why-oil-gas-ai-readiness-lives-at-the/ba-p/4538718?ref=azurebrasil.cloud) - [September Patches for Azure DevOps Server](https://devblogs.microsoft.com/devops/september-patches-for-azure-devops-server-3/?ref=azurebrasil.cloud) - [Create multimodal applications with OpenAI models in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/create-multimodal-applications-with-openai-models-in-microsoft/ba-p/4543593?ref=azurebrasil.cloud) - [Announcing Azure AI Speech LLM 2607: Better Multilingual Accuracy, Easier Customization](https://devblogs.microsoft.com/foundry/announcing-azure-ai-speech-llm-2607/?ref=azurebrasil.cloud) - [Voice to Chat Best Practice for Call Centre Use Cases](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/voice-to-chat-best-practice-for-call-centre-use-cases/ba-p/4554634?ref=azurebrasil.cloud) - [Workload Orchestration in the Azure portal is now available: Deploy in minutes, scale with ease](https://techcommunity.microsoft.com/t5/azure-arc-blog/workload-orchestration-in-the-azure-portal-is-now-available/ba-p/4554101?ref=azurebrasil.cloud) - [Announcing the public preview of Azure Local workload management in Azure Arc Site Manager](https://techcommunity.microsoft.com/t5/azure-arc-blog/announcing-the-public-preview-of-azure-local-workload-management/ba-p/4549703?ref=azurebrasil.cloud) - [Dell Managed PowerScale for Microsoft Azure is now generally available](https://techcommunity.microsoft.com/t5/azure-storage-blog/dell-managed-powerscale-for-microsoft-azure-is-now-generally/ba-p/4555367?ref=azurebrasil.cloud) - [Enabling the Compliance Security Profile (CSP) for HIPAA on Azure Databricks](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/enabling-the-compliance-security-profile-csp-for-hipaa-on-azure/ba-p/4541578?ref=azurebrasil.cloud) - [How Azure uses AI to turn feedback into improved customer experience](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/how-azure-uses-ai-to-turn-feedback-into-improved-customer/ba-p/4552810?ref=azurebrasil.cloud) - [What’s new in Microsoft Foundry: July and August 2026](https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-july-august-2026/?ref=azurebrasil.cloud) - [Public Preview: Automatic Zone Placement for Virtual Machine Scale Sets](https://techcommunity.microsoft.com/t5/azure-compute-blog/public-preview-automatic-zone-placement-for-virtual-machine/ba-p/4554986?ref=azurebrasil.cloud) - [Choosing a real-time voice architecture on Microsoft Foundry: three enterprise patterns](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/choosing-a-real-time-voice-architecture-on-microsoft-foundry/ba-p/4552676?ref=azurebrasil.cloud) - [Generally Available: Restrict usage of user delegation SAS to an Entra ID identity](https://techcommunity.microsoft.com/t5/azure-storage-blog/generally-available-restrict-usage-of-user-delegation-sas-to-an/ba-p/4554967?ref=azurebrasil.cloud) - [Adding network intelligence into a network-ready Azure migration plan](https://techcommunity.microsoft.com/t5/azure-networking-blog/adding-network-intelligence-into-a-network-ready-azure-migration/ba-p/4554519?ref=azurebrasil.cloud) - [Announcing general availability of Ephemeral OS Disk with full caching for VM/VMSS](https://techcommunity.microsoft.com/t5/azure-compute-blog/announcing-general-availability-of-ephemeral-os-disk-with-full/ba-p/4554797?ref=azurebrasil.cloud) - [Can a Harmless Prompt Break an AI Guardrail?](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/can-a-harmless-prompt-break-an-ai-guardrail/ba-p/4553727?ref=azurebrasil.cloud) - [Build an AI-assisted support email workflow with Power Automate and Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-developer-community/build-an-ai-assisted-support-email-workflow-with-power-automate/ba-p/4554297?ref=azurebrasil.cloud) - [Azure Copilot announces general availability of the Troubleshooting Agent](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/azure-copilot-announces-general-availability-of-the/ba-p/4554549?ref=azurebrasil.cloud) - [Wiring Azure DevOps Pipeline Templates Without the Parameter Sprawl: The Manifest Facade Pattern](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/wiring-azure-devops-pipeline-templates-without-the-parameter/ba-p/4554182?ref=azurebrasil.cloud) - [Inside Orchestrated Media Intelligence: The Technology Behind Connected Media Workflows](https://techcommunity.microsoft.com/t5/telecommunications-media/inside-orchestrated-media-intelligence-the-technology-behind/ba-p/4553782?ref=azurebrasil.cloud) - [Today I will… find hidden latency across a distributed .NET application](https://devblogs.microsoft.com/visualstudio/today-i-will-find-hidden-latency-across-a-distributed-net-application/?ref=azurebrasil.cloud) - [The Agentic Road to Revenue](https://devblogs.microsoft.com/all-things-azure/the-agentic-road-to-revenue/?ref=azurebrasil.cloud) - [AKS Configurable Scheduler Profiles](https://blog.aks.azure.com/2026/09/08/aks-config-scheduler-profiles?ref=azurebrasil.cloud) - [Logic Apps Aviators Newsletter - September 2026](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-september-2026/ba-p/4553787?ref=azurebrasil.cloud) - [The Evidence Gateway Pattern](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/the-evidence-gateway-pattern/ba-p/4552812?ref=azurebrasil.cloud) - [Securing Your Certification Authorities (Practical PKI Part 4)](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/securing-your-certification-authorities-practical-pki-part-4/ba-p/4549029?ref=azurebrasil.cloud) ### GitHub Updates - [Marketing ops as code: Automating events from planning to follow-up on GitHub](https://github.blog/ai-and-ml/github-copilot/marketing-ops-as-code-automating-events-from-planning-to-follow-up-on-github/?ref=azurebrasil.cloud) - [GitHub Copilot app for Beginners: Using the diff, terminal, and browser](https://github.blog/ai-and-ml/github-copilot/github-copilot-app-for-beginners-using-the-diff-terminal-and-browser/?ref=azurebrasil.cloud) - [GitHub availability report: August 2026](https://github.blog/news-insights/company-news/github-availability-report-august-2026/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Como Habilitar o Pay-As-You-Go no Copilot Studio Sem Deixar Seus Agentes Pararem](https://www.azurebrasil.cloud/blog/como-habilitar-o-pay-as-you-go-no-copilot-studio-sem-deixar-seus-agentes-pararem/) - [Modelo de contexto para design: como o GitHub Copilot usa o Figma MCP para não inventar pixel - Parte 2](https://www.azurebrasil.cloud/blog/modelo-de-contexto-para-design-como-o-github-copilot-usa-o-figma-mcp-para-nao-inventar-pixel-parte-2/) - [Azure Newsletter - 2026-09-07](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-09-07/) ### Como Habilitar o Pay-As-You-Go no Copilot Studio Sem Deixar Seus Agentes Pararem URL: https://www.azurebrasil.cloud/blog/como-habilitar-o-pay-as-you-go-no-copilot-studio-sem-deixar-seus-agentes-pararem/ Last updated: 2026-09-11T12:38:32.000Z > **O que você vai aprender:** Como criar uma cobrança (billing policy) no Power Platform, vincular um ambiente a uma assinatura Azure e habilitar o pay-as-you-go para o Copilot Studio, entendendo antes por que isso evita que um agente pare de responder no meio da operação. ## Pré-requisitos | Requisito | Obrigatório? | Notas | | ---------------------------------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | | Função Environment Admin, Power Platform Admin, Dynamics 365 Admin ou Global Admin | Sim | Qualquer uma delas permite criar e vincular uma billing policy. | | Assinatura Azure ativa | Sim | Precisa de permissão para criar recursos e registrar provedores de recursos nela. Normalmente, ser owner ou contributor já basta. | | Um resource group na assinatura Azure | Sim | Se não existir nenhum, é preciso criar um pelo [Azure portal ](https://portal.azure.com/?ref=azurebrasil.cloud)antes de configurar a cobrança. | | Ambiente do Power Platform (produção ou sandbox) já criado | Sim | O pay-as-you-go vincula um ambiente existente; ele não cria um ambiente novo, exceto no fluxo específico do Microsoft 365 Copilot Chat. | ## Onde Tudo Costuma Dar Errado Um agente do Copilot Studio consome **Copilot Credits** a cada interação: uma resposta clássica custa 1 crédito, uma resposta generativa custa 2, uma ação do agente custa 5, e assim por diante, dependendo do recurso usado. Quando você compra uma licença do Copilot Studio, recebe uma quantidade de créditos pré-pagos, compartilhada entre todos os ambientes do tenant. O problema aparece quando esses créditos acabam. Segundo a [documentação oficial de billing do Copilot Studio](https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-messages-management?ref=azurebrasil.cloud), ao atingir 125% da capacidade pré-paga do tenant, o Microsoft aciona uma política de enforcement: os agentes customizados são desativados. A conversa em andamento não é interrompida, mas qualquer nova tentativa de interação passa a ser rejeitada até que a capacidade seja realocada, mais créditos sejam comprados, ou o pay-as-you-go seja habilitado para assumir o excedente. Existe uma variação mais específica para **agent flows** (as sequências de ações que um agente executa sem depender de raciocínio a cada etapa): quando a capacidade se esgota, apenas os flows param de rodar. O agente continua respondendo normalmente a conversas que não dependem daquele flow. É uma diferença que importa na hora de diagnosticar por que "só uma parte" do agente parou de funcionar. Nenhum desses dois cenários é hipotético: é o comportamento documentado e ativo hoje. Se o seu agente atende clientes ou automatiza um processo interno crítico, vale decidir com antecedência como esse excedente vai ser tratado, em vez de descobrir isso só quando o agente já parou. ## Pay-As-You-Go x Capacidade Pré-Paga: Não São a Mesma Coisa Antes de configurar qualquer coisa, vale entender o que o pay-as-you-go realmente muda, e o que ele não muda. | | Capacidade pré-paga (Copilot Credits packs) | Pay-as-you-go | | ------------------------ | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | | Como funciona | Você compra um pacote de créditos, dividido entre ambientes do tenant | Você vincula um ambiente a uma assinatura Azure; o consumo excedente é cobrado por lá | | Previsibilidade de custo | Alta: valor fixo, mas cabe gerenciar estoque de créditos manualmente | Variável: cresce conforme o uso real, sem limite superior definido por padrão | | Renovação | Mensal, com expiração do que não foi usado | Não se aplica: é cobrança por consumo | | Quando falta capacidade | Agente é desativado ao atingir 125% de uso | Não há bloqueio: o excedente é simplesmente cobrado | | Melhor cenário de uso | Ambientes com volume previsível e orçamento fechado | Agentes críticos, uso sazonal ou fase de escala onde prever consumo é difícil | O ponto que gera confusão: **habilitar o pay-as-you-go não aumenta a sua capacidade pré-paga.** São dois mecanismos independentes que podem coexistir no mesmo tenant e até no mesmo ambiente. Você pode, por exemplo, manter uma alocação de créditos pré-pagos para uso normal e usar o pay-as-you-go apenas como rede de segurança para o excedente. É exatamente esse o cenário que a configuração abaixo resolve. ## Colocando em Prática: Criando a Cobrança no Power Platform ### Passo 1: Garanta a assinatura Azure e o resource group Se sua organização já usa Azure para outros serviços, qualquer assinatura em que você tenha permissão de criar recursos serve. Caso contrário, será preciso obter ou criar uma seguindo o processo padrão da sua organização, ou pela [página de conta Azure](https://azure.microsoft.com/pricing/purchase-options/azure-account?ref=azurebrasil.cloud). Confirme também que existe pelo menos um resource group nessa assinatura: é nele que o recurso de cobrança do Power Platform vai ser criado. ### Passo 2: Crie o billing plan no Power Platform admin center 1. Acesse o [Power Platform admin center](https://admin.powerplatform.microsoft.com/?ref=azurebrasil.cloud) e, no menu lateral, selecione **Licensing**. 2. Em **Licensing**, selecione **Pay-as-you-go plans**. 3. Selecione **New billing plan**. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image-14.png) 1. Escolha a opção **Azure subscription** (não confunda com a opção "Microsoft 365 Copilot Chat", tratada à parte mais abaixo). 2. Em **Name**, dê um nome identificável ao plano: algo que facilite saber depois qual centro de custo ele representa. 3. No dropdown **Azure subscription**, selecione a assinatura que vai receber a cobrança. Só aparecem assinaturas do tenant nas quais você tem permissão suficiente. 4. No dropdown **Resource group**, selecione o resource group onde o recurso de cobrança do Power Platform será criado. 5. No dropdown **Power Platform products**, selecione o produto correspondente: no caso deste artigo, Copilot Studio. 6. Selecione **Next**. > **Por que isso importa:** o billing plan não cobra nada por si só. Ele é apenas o vínculo entre um ou mais ambientes e a assinatura Azure. A cobrança real só começa quando um ambiente consome acima da capacidade pré-paga disponível. ### Passo 3: Vincule o ambiente ao billing plan 1. Na tela **Select environments**, escolha a região do ambiente no filtro **Region**. 2. Selecione o ambiente que deve ficar coberto pelo pay-as-you-go. 3. Selecione **Save**. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image-15.png) A partir daqui, esse ambiente passa a funcionar como um **ambiente pay-as-you-go**: qualquer consumo de Copilot Studio acima da capacidade pré-paga alocada para ele passa a ser cobrado na assinatura Azure vinculada, em vez de acionar o enforcement que desativa o agente. ## Como Saber Se Funcionou: Monitorando o Consumo Habilitar a cobrança sem acompanhar o consumo depois é meio caminho andado. O Power Platform admin center concentra essa visão: 1. Acesse **Licensing** \> **Copilot Studio**. 2. Na aba **Summary**, observe o card **Pay-as-you-go credits**: ele mostra quantos billing plans com o meter do Copilot Studio estão ativos e o total de créditos já cobrados no mês corrente. 3. Na aba **Environments**, selecione o ambiente que você acabou de vincular para ver o detalhamento por produto e por agente, incluindo quantos créditos vieram da capacidade pré-paga e quantos foram cobrados via pay-as-you-go. - O billing plan aparece listado em **Pay-as-you-go plans** com o ambiente correto vinculado. - O recurso de conta do Power Platform aparece no resource group escolhido, dentro do [Azure portal](https://portal.azure.com/?ref=azurebrasil.cloud). - O card **Environments** do Copilot Studio mostra o ambiente com status "pay-as-you-go" habilitado. ## Uma Camada Extra de Controle: Limite Mensal Por Agente Pay-as-you-go remove o bloqueio automático, mas isso também significa que não existe um teto de gasto por padrão. Para quem opera com orçamento restrito, vale configurar um limite mensal de consumo por agente: 1. Em **Licensing** \> **Copilot Studio** \> **Summary**, selecione **Manage Agents**. 2. Localize o agente desejado e defina um limite mensal de Copilot Credits. 3. Configure as duas camadas de proteção disponíveis: notificação (para admins do ambiente e do tenant, quando o consumo se aproxima do limite) e hard stop (desliga o agente automaticamente ao atingir o limite definido). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image-16.png) Em ambientes com capacidade pré-paga, esse limite precisa respeitar o total alocado. Em ambientes pay-as-you-go, você pode definir qualquer valor. O consumo continua sendo cobrado normalmente até o limite escolhido. ## Como Reverter, Se Precisar Vincular um ambiente a uma assinatura Azure não é uma decisão permanente. Para desligar o pay-as-you-go: - Edite o billing plan em **Licensing** \> **Pay-as-you-go plans** e remova o ambiente da lista vinculada, **ou** - Exclua o billing plan inteiro, se ele não tiver outros ambientes vinculados. Assim que a remoção é feita, o ambiente volta a funcionar como um ambiente regular: qualquer uso acima da capacidade pré-paga volta a ser bloqueado pelo enforcement padrão. Uso já registrado até o momento da remoção continua sendo cobrado normalmente na assinatura Azure. A mudança não é retroativa. > **Atenção:** excluir o billing plan no Power Platform admin center não exclui automaticamente o recurso correspondente no Azure. Se quiser removê-lo por completo, delete o recurso de conta do Power Platform diretamente no Azure portal. --- ## Resumo Executivo Antes de considerar essa configuração concluída, confirme: - Você tem uma das funções administrativas exigidas (Environment, Power Platform, Dynamics 365 ou Global Admin). - A assinatura Azure e o resource group já existem e você tem permissão de criação nela. - O billing plan foi criado com o produto Copilot Studio selecionado. - O ambiente correto está vinculado ao billing plan. - Você sabe onde acompanhar o consumo (Licensing > Copilot Studio > Summary/Environments). - Você decidiu, conscientemente, se vale configurar um limite mensal por agente. O pay-as-you-go não substitui a gestão de capacidade pré-paga do Copilot Studio: ele complementa. Uma organização pode manter sua alocação de créditos para o uso normal e usar o pay-as-you-go apenas como rede de segurança contra o enforcement, evitando que um agente crítico pare de responder no pior momento possível. Se você está avaliando quando faz sentido migrar um ambiente para pay-as-you-go, ou já teve um agente desativado por esgotamento de capacidade, vale conversar com a Azure Brasil sobre um diagnóstico de licenciamento do Power Platform e do Copilot Studio antes de escalar o uso em produção. ## Referências - [Billing rates and management - Microsoft Copilot Studio](https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-messages-management?ref=azurebrasil.cloud) - [Pay-as-you-go plan overview - Power Platform](https://learn.microsoft.com/en-us/power-platform/admin/pay-as-you-go-overview?ref=azurebrasil.cloud) - [Set up a pay-as-you-go plan - Power Platform](https://learn.microsoft.com/en-us/power-platform/admin/pay-as-you-go-set-up?ref=azurebrasil.cloud) - [Manage Copilot Credits and capacity for Copilot Studio - Power Platform](https://learn.microsoft.com/en-us/power-platform/admin/manage-copilot-studio-copilot-credits-capacity?ref=azurebrasil.cloud) ### Modelo de contexto para design: como o GitHub Copilot usa o Figma MCP para não inventar pixel - Parte 2 URL: https://www.azurebrasil.cloud/blog/modelo-de-contexto-para-design-como-o-github-copilot-usa-o-figma-mcp-para-nao-inventar-pixel-parte-2/ Last updated: 2026-09-10T13:12:21.000Z O [Model Context Protocol](https://modelcontextprotocol.io/?ref=azurebrasil.cloud) é o padrão aberto que permite a uma ferramenta de IA como o GitHub Copilot se conectar a fontes externas de dados através de servidores dedicados, em vez de depender só do que está escrito no código ou do que o modelo já sabe de treinamento. No projeto BookStore, dois desses servidores MCP foram plugados ao GitHub Copilot: um para o [PrimeVue](https://primevue.dev/mcp/?ref=azurebrasil.cloud), que expõe a documentação de cada componente diretamente no chat, e um para o [Figma](https://www.figma.com/?ref=azurebrasil.cloud), que permite ler um frame real de design e extrair medidas, cores e textos exatos. Este artigo é a Parte 2 da série sobre a modernização do front-end do BookStore, e o foco aqui é justamente esse segundo servidor: como o GitHub Copilot usa o Figma MCP para implementar um componente Vue sem chutar um valor sequer. Tela Home: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-24.png) Tela Books: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-25.png) Tela Authors: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-26.png) O motivo de isso importar é simples. Numa tarefa de UI, é fácil pedir para uma IA "fazer parecido com essa imagem" e receber de volta um componente com espaçamento aproximado, cor levemente errada e tipografia no tamanho padrão do framework. Isso funciona para um protótipo, mas não para um sistema de design real, onde 21px de border-radius e 67px de altura de cabeçalho são valores deliberados, não arredondamentos. Por isso o repositório tem uma skill dedicada só para essa etapa: a [figma-discovery](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/tree/feature/module4/.github/skills/figma-discovery?ref=azurebrasil.cloud), que roda antes de qualquer linha de componente ser escrita. Skill: figma-discovery ```javascript --- name: figma-discovery description: "Discovers and extracts design specs from Figma for a Vue/PrimeVue front-end. Use when: the user gives a Figma URL or node reference, asks to implement/match a design, refactor existing UI to align with the design system, or a new/changed component needs accurate spacing, color, typography or assets from Figma before coding. Parses Figma URLs, calls the Figma MCP tools, and maps raw values to the codebase's existing PrimeVue/Tailwind design-token conventions instead of raw hex/pixel values." argument-hint: "A Figma URL or node reference, and what component/page it's for" --- # Figma Discovery Extracts an implementable spec from a Figma design BEFORE any component code is written or changed. Never guess colors, spacing, or structure from a screenshot alone - always pull the real node data through the Figma MCP server, then translate it into the codebase's existing PrimeVue + Tailwind conventions. Output of this skill is a **discovery report**, not code. Hand it to `/primevue-component-build`. ## Required setup - `.vscode/mcp.json` must contain the `figma-mcp` server entry: ```json "figma-mcp": { "type": "http", "url": "https://mcp.figma.com/mcp" } ``` If it is missing or malformed, stop and say this is Frontend-Tooling-Specialist's responsibility - do not add it from this skill. - The remote server requires the user to be signed into Figma and to approve the OAuth prompt in the IDE. If tool calls return an auth/permission error, ask the user to re-authenticate; never fall back to inventing values. - Figma MCP tools used: `get_metadata`, `get_screenshot`, `get_design_context`, `get_variable_defs`, plus whatever design-system search the server exposes. Tool names are prefixed per workspace (here: `mcp_figma_mcp_ser_*`) - list the available tools rather than assuming an exact name. ## Vault touchpoints - Run `/vault-search` for the component/page name and for prior Figma token mappings before starting, so you reuse decisions already made. - After the implementation lands, the calling agent records the node -> component mapping and any NEW token mapping through `/vault-write`. If this skill discovers a token mapping not in the table below, say so explicitly in the report so it gets persisted. ## Procedure 1. **Parse the reference.** From `figma.com/design/:fileKey/:fileName?node-id=:nodeId`, extract `fileKey` and `nodeId`, converting `-` to `:` in the node id (`39-21141` -> `39:21141`). If only a node id was given with no file link, ask for the URL - never reuse a `fileKey` from a previous, unrelated task. 2. **Confirm the target.** Call `get_metadata` and/or `get_screenshot` for the node first, to check it is the right frame/component before pulling the full context (cheaper, catches a wrong node id early). 3. **Pull the real spec.** Call `get_design_context` for the node. Treat its output as a REFERENCE to adapt, not as final code - it knows nothing about this codebase's components, composables or token conventions. 4. **Resolve ambiguous raw values.** If a color/spacing value is not obviously a token, call `get_variable_defs` to resolve it to a named Figma variable, then map it with the table below. 5. **Check for an existing match first.** Search `ClientApp/src/components/common/` for an analogous piece (a Dialog shell, a button style, a paginator, a form field, a table). If the app already has a pattern for this UI, prefer reusing/extending the existing convention over the raw Figma pixel value. Introduce a new value only where there is a deliberate visual difference. 6. **Identify assets.** Note any image/icon that must be exported. Icons: prefer an equivalent PrimeIcon (`pi pi-*`). Real images: export and place under `Src/BookStore.Web/wwwroot/images//`, referenced by absolute URL (`/images/home/books.jpg`) - not imported through Vite. 7. **Map interaction and data.** Say which parts are static design and which are data-bound (rows, empty state, loading, error, pagination) - the data always comes from the `/api/*` endpoints via the composables, never from Figma sample content. 8. **Report the discovery** (hand-off to `/primevue-component-build`): node id + name, mapped color tokens, spacing/sizing (flagging which need Tailwind arbitrary values vs. the default scale), typography, icons/assets, which existing component(s) to mirror or extend, and which PrimeVue component + `pt` sections will carry the styling. ## Token mapping table (extend as new values appear - never leave a raw hex/px in code when a row below applies) | Figma value observed | Use this Tailwind/PrimeVue token | |---|---| | `#334155` (dark slate) | `surface-700` (`bg-surface-700`, `border-surface-700`, `text-surface-700`) | | `#1e293b` (darker slate, hover) | `surface-800` | | `#cbd5e1` / light gray borders | `border-surface-300` | | `#f8fafc` / very light row hover | `surface-50` / `surface-100` | | `#ffffff` panel background | `bg-surface-0` | | `#64748b` muted gray text | `text-muted-color` | | primary body text (near-black slate) | `text-color` | | Brand/primary action fill | `bg-primary` + `text-primary-contrast` (or `primaryButtonClass` from `styles/buttonStyles.ts`) | | Icon glyphs | PrimeIcons `pi pi-*` - never inline SVG or Bootstrap Icons (`bi-*`) when an equivalent `pi-*` exists | Recurring component-level mappings already derived from Figma (reuse, do not re-derive): - Modal shell (rounded 21px white panel, 67px header, 3-gap footer) -> `dialogShellPt(width)` / `detailsDialogPt(width)` in `components/common/dialog/dialogStyles.ts`. - Primary/secondary/danger action buttons -> `primaryButtonClass` / `secondaryButtonClass` / `dangerButtonClass` in `styles/buttonStyles.ts`. - Row-action popup menu and the flat borderless paginator -> the `menuPt` / `paginatorPt` objects in `components/common/table/DataTableCommon.vue`. ## Rules - Never fabricate Figma content - always call the MCP tools; if a call fails, say so rather than guessing values. - Never hardcode a raw hex when a `surface-*`/`*-color` token is an exact or near match. - Arbitrary Tailwind values (`rounded-[21px]`, `gap-1.75`, `w-[765px]`) are acceptable and already used throughout this codebase when the Figma value does not land on Tailwind's default scale - do not force a bad approximation to avoid one. - Never copy Figma's generated code verbatim into a component - it ignores the existing composables, `pt` conventions and token utilities. - Delete any temporary screenshot/reference asset after the implementation is verified against it. - Always re-derive `fileKey`/`nodeId` from what the user provided in THIS task. - In a new project, replace the token table above with that project's design-system mapping before using this skill in anger, and record it in that project's vault. ``` O servidor do Figma é declarado em `mcp.json`, junto do servidor do PrimeVue: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image.png) Autenticação do MCP do lado do Figma (Perfil/Settings/Security): ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/Group-2.png) Esse arquivo é só a porta de entrada. O `primevue` roda localmente via `npx`, já o `figma-mcp` é remoto, então o GitHub Copilot precisa que o usuário esteja autenticado no Figma dentro do próprio VS Code para conseguir chamar as ferramentas do servidor. Sem essa configuração, a skill de descoberta é instruída a parar e avisar que a configuração do MCP é responsabilidade do agente de tooling, em vez de tentar contornar o problema. A skill [figma-discovery](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/tree/feature/module4/.github/skills/figma-discovery?ref=azurebrasil.cloud) segue um roteiro fixo: primeiro interpreta a URL do Figma, extraindo o identificador do arquivo e o id do nó de design, depois confirma que pegou o frame certo com uma chamada mais barata (metadados ou uma captura de tela), e só então pede o contexto completo de design. Um exemplo real desse fluxo no BookStore foi a modal de confirmação de exclusão de um livro, implementada a partir do nó `58:25679` do Figma. Depois de confirmar o frame certo, o próximo passo do roteiro busca o spec completo: 1. Parse da URL do Figma (fileKey + nodeId, convertendo "-" em ":") 2. get\_metadata / get\_screenshot para confirmar o frame certo 3. get\_design\_context para extrair cor, espaçamento, tipografia 4. get\_variable\_defs para resolver variáveis nomeadas do Figma 5. Busca por um componente equivalente já existente em common/ 6. Identificação de ícones/imagens a exportar 7. Mapeamento do que é estático (design) vs dinâmico (dados da API) get\_metadata() - Confirma rapidamente se o nó apontado é realmente o frame certo antes de gastar uma chamada mais cara. get\_design\_context() - Retorna a especificação completa do nó: cores, espaçamentos, tipografia e estrutura, tratada como referência a adaptar, não como código final. get\_variable\_defs() - Resolve um valor bruto de cor ou espaçamento para a variável nomeada correspondente no arquivo Figma, quando o valor não bate obviamente com um token já conhecido. Imagem: Frame da modal de confirmação de exclusão de livro aberto no Figma, nó 58:25679, mostrando o painel arredondado com o ícone de aviso e os botões Cancel/Delete 1 Passo: Copy link to selection ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image-1.png) 2 Passo: Colar o link no GitHub Copilot e selecionar o agente especializado em Front-End chamado [Frontend-Specialist](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/blob/feature/module4/.github/agents/frontend-specialist.agent.md?ref=azurebrasil.cloud) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image-3.png) 3 Passo: O Agent [Frontedn-Specialist](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/blob/feature/module4/.github/agents/frontend-specialist.agent.md?ref=azurebrasil.cloud), chama as Skills ([figma-discovery](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/tree/feature/module4/.github/skills/figma-discovery?ref=azurebrasil.cloud) e [primevue-component-build](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/tree/feature/module4/.github/skills/primevue-component-build?ref=azurebrasil.cloud)) e verifica se já existe o componente criado dentro da pasta /common se não ele cria do zero, para que não haja duplicidade. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image-2.png) O passo mais importante desse roteiro não é técnico, é de disciplina: antes de aceitar qualquer valor extraído do Figma como definitivo, a skill manda procurar primeiro por um componente equivalente já existente em `components/common/`. Isso evitou reinventar a modal do zero, porque o BookStore já tinha estabelecido, num componente de exclusão anterior, um formato de `Dialog` reutilizável. Esse padrão foi extraído para um arquivo só de estilos: ```javascript const FORM_CONTENT_CLASS = "flex flex-col gap-[21px] px-6 py-2"; const DETAILS_CONTENT_CLASS = "flex flex-col gap-1.75 px-[21px] py-[17.5px]"; export function dialogShellPt(width: string, contentClass: string = FORM_CONTENT_CLASS) { return { root: { class: `${width} max-w-[92vw] rounded-[21px] border border-surface-300 bg-surface-0 p-0 overflow-hidden` }, header: { class: "h-[67px] items-center justify-between pt-5 pb-4 pl-6 pr-4" }, content: { class: contentClass }, footer: { class: "gap-3 justify-end pb-5 pt-4 px-6" }, }; } ``` dialogShellPt() - Monta o objeto de passthrough (`pt`) do Dialog do PrimeVue a partir de dois valores que variam por tela, a largura do modal e a classe de conteúdo, mantendo fixos os números extraídos do Figma para o cabeçalho de 67px e o arredondamento de 21px. Repare que nenhum desses números é arbitrário. `rounded-[21px]`, `h-[67px]` e `gap-[21px]` vieram diretamente do `get_design_context` do nó 58:25679, e como o [Tailwind CSS](https://tailwindcss.com/?ref=azurebrasil.cloud) padrão não tem uma escala que bata exatamente com 21px ou 67px, a convenção do projeto é usar valores arbitrários entre colchetes em vez de forçar uma aproximação para o valor de escala mais próximo. Essa mesma função é reaproveitada pelos diálogos de criação e edição de Livro e Autor, cada um só passando sua própria largura. Com o shell de estilo pronto, o componente da modal de exclusão ficou assim: ```javascript ``` defineProps() - Declara o contrato do componente: título, mensagem de aviso, uma lista de detalhes label/valor do registro a ser excluído, e os estados de carregamento e erro vindos da chamada à API. dialogShellPt("w-\[765px\]") - Aplica a largura de 765px definida no Figma para esse modal específico, reaproveitando o mesmo objeto de passthrough usado pelos outros diálogos. O `pt` (passthrough) é o mecanismo do [PrimeVue](https://primevue.dev/?ref=azurebrasil.cloud) que permite injetar classes do Tailwind diretamente nas seções internas de um componente, como `root`, `header`, `content` e `footer`, em vez de depender de uma única classe genérica no elemento raiz. É esse recurso que torna possível reproduzir com fidelidade um espaçamento de 67px de altura de cabeçalho sem escrever CSS customizado por fora do componente. Depois que o componente está implementado, a segunda skill entra em ação, a [primevue-component-build](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/tree/feature/module4/.github/skills/primevue-component-build?ref=azurebrasil.cloud), que cuida da parte de verificação: rodar `npx vue-tsc --noEmit` para checar os tipos, depois `npm run build` para gerar o bundle final, e só então comparar o resultado renderizado contra o frame do Figma no navegador. ```javascript npx vue-tsc --noEmit npm run build ``` O primeiro comando roda o compilador do Vue em modo de checagem, sem gerar arquivos, pegando erros de tipo nas props e nos emits do componente. O segundo executa o build de produção do Vite, que regenera `wwwroot/dist/main.js` e `wwwroot/dist/main.css`, os únicos artefatos que o ASP.NET Core efetivamente serve. Imagem: Navegador mostrando a modal de confirmação de exclusão de um livro já implementada, lado a lado com o frame original do Figma para comparação Imagem do figma: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image-6.png) Imagem: http://localhost:5045/Books ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/image-8.png) O resultado prático desse processo é que a modal de exclusão do BookStore não é uma aproximação visual, ela reproduz o painel de 21px de arredondamento, o cabeçalho de 67px e o rodapé com os botões Cancel e Delete exatamente como especificado no nó 58:25679, porque cada valor foi extraído do Figma via MCP e não digitado de memória. O mesmo padrão de `dialogShellPt` depois foi reaproveitado para os modais de criação de Livro e Autor, que só trocam a largura do painel (765px para Livro, 480px para Autor), mostrando como uma descoberta de design bem documentada vira um investimento que se paga em componentes futuros. Na Parte 3 dessa série, a ideia é sair do design e entrar na memória de longo prazo do próprio GitHub Copilot, mostrando como o projeto usa um vault de documentação em Markdown para que decisões como essa (o formato do `dialogShellPt`, os nós do Figma já mapeados) não se percam entre uma sessão de chat e outra. O código completo deste projeto está disponível no meu repositório no [GitHub](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/tree/feature/module4?ref=azurebrasil.cloud). Links e Docks: [What is the Model Context Protocol (MCP)? - Model Context Protocol![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/android-chrome-192x192-a21c0663-e46b-4edd-bc4c-4bd4ddf25570.png)Model Context Protocol![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/og-image-b37cd438-edee-4ef5-84de-b9f7c4b0a83e.png)](https://modelcontextprotocol.io/docs/2026-07-28/getting-started/intro?ref=azurebrasil.cloud) [PrimeVue | Vue UI Component LibraryThe ultimate collection of design-agnostic, flexible and accessible Vue UI Components.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-4173dbc9-806c-4b67-9419-5e09714e2f51.png)PrimeVue![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/primevue-meta-5de5e318-730b-49e1-996e-98a6fe002403.png)](https://primevue.dev/mcp/?ref=azurebrasil.cloud) [Figma: The collaborative canvas for design, code, and AIFigma is the canvas where design, code, and AI come together. From first idea to shipped product — go from concept to production with your whole team, in one place.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-4425a0d3-0e4a-4616-9ec9-e0683e85b82e.png)Figma![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/b08d37520f7d5ad8d6562975b5932dd2d9a862bb-1200x630-4200a652-fc61-4310-898c-e1adb6e9c2d7.gif)](https://www.figma.com/?ref=azurebrasil.cloud) Não esqueça de me seguir no [LinkedIn](https://www.linkedin.com/in/flpfaria/?ref=azurebrasil.cloud) para mais conteúdos. Até a próxima!!! ### Azure Newsletter - 2026-09-07 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-09-07/ Last updated: 2026-09-07T12:48:51.000Z ### Azure Updates - [Check This Out! (CTO!) Guide (September 2026)](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/check-this-out-cto-guide-september-2026/ba-p/4553591?ref=azurebrasil.cloud) - [Enabling the Compliance Security Profile (CSP) for HIPAA on Azure Databricks](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/enabling-the-compliance-security-profile-csp-for-hipaa-on-azure/ba-p/4541578?ref=azurebrasil.cloud) - [Introducing Inside Microsoft Foundry: Quickstart 🎬](https://techcommunity.microsoft.com/t5/microsoft-developer-community/introducing-inside-microsoft-foundry-quickstart/ba-p/4552692?ref=azurebrasil.cloud) - [Azure SDK Release (August 2026)](https://devblogs.microsoft.com/azure-sdk/azure-sdk-release-august-2026/?ref=azurebrasil.cloud) - [It Wasn't the Private Endpoint: Why the Foundry Playground Breaks Behind Private Networking](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/it-wasn-t-the-private-endpoint-why-the-foundry-playground-breaks/ba-p/4552771?ref=azurebrasil.cloud) - [MAI-Image-2.6 and MAI-Image-2.6-Flash: Quality and speed at production scale](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/mai-image-2-6-and-mai-image-2-6-flash-quality-and-speed-at/ba-p/4550970?ref=azurebrasil.cloud) - [What’s new in Azure Firewall: Recent innovations](https://techcommunity.microsoft.com/t5/azure-networking-blog/what-s-new-in-azure-firewall-recent-innovations/ba-p/4552987?ref=azurebrasil.cloud) - [Your Private Endpoint Does Not Cover Agent Egress: Locking Down Azure AI Foundry in Both Directions](https://techcommunity.microsoft.com/t5/azure-architecture-blog/your-private-endpoint-does-not-cover-agent-egress-locking-down/ba-p/4547864?ref=azurebrasil.cloud) - [Choosing a real-time voice architecture on Microsoft Foundry: three enterprise patterns](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/choosing-a-real-time-voice-architecture-on-microsoft-foundry/ba-p/4552676?ref=azurebrasil.cloud) - [SQL Decomposition in a Nutshell](https://devblogs.microsoft.com/azure-sql/sql-decomposition/?ref=azurebrasil.cloud) - [Advocating for Uptime: The 6 Phases of Change](https://devblogs.microsoft.com/azure-sql/schema-change/?ref=azurebrasil.cloud) - [Claude Fable 5.1 is now available in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/claude-fable-5-1-is-now-available-in-microsoft-foundry/ba-p/4550175?ref=azurebrasil.cloud) - [Accelerated AI & Analytics workload on Azure Blob Storage: Up to 25x faster List Blobs operations](https://techcommunity.microsoft.com/t5/azure-storage-blog/accelerated-ai-analytics-workload-on-azure-blob-storage-up-to/ba-p/4551857?ref=azurebrasil.cloud) - [Building 3IQ Retail Assistant Demo – Part 1](https://techcommunity.microsoft.com/t5/azure-architecture-blog/building-3iq-retail-assistant-demo-part-1/ba-p/4547228?ref=azurebrasil.cloud) - [Building 3IQ Retail Assistant Demo – Part 2](https://techcommunity.microsoft.com/t5/azure-architecture-blog/building-3iq-retail-assistant-demo-part-2/ba-p/4547231?ref=azurebrasil.cloud) - [Building 3IQ Retail Assistant Demo – Part 3](https://techcommunity.microsoft.com/t5/azure-architecture-blog/building-3iq-retail-assistant-demo-part-3/ba-p/4547233?ref=azurebrasil.cloud) - [Logic App Storage Inspector](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-app-storage-inspector/ba-p/4552352?ref=azurebrasil.cloud) - [MAI-Transcribe-2: Highest quality transcription, at the fastest speed and lowest cost](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/mai-transcribe-2-highest-quality-transcription-at-the-fastest/ba-p/4550972?ref=azurebrasil.cloud) - [Build Advanced ServiceNow Response Plans in Azure SRE Agent](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/build-advanced-servicenow-response-plans-in-azure-sre-agent/ba-p/4553059?ref=azurebrasil.cloud) - [Bringing Open Models to Fireworks on Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/bringing-open-models-to-fireworks-on-microsoft-foundry/ba-p/4550173?ref=azurebrasil.cloud) - [Keep the evidence: Low-cost logs with Azure Copilot Observability Agent (Generally Available)](https://techcommunity.microsoft.com/t5/azure-observability-blog/keep-the-evidence-low-cost-logs-with-azure-copilot-observability/ba-p/4550844?ref=azurebrasil.cloud) - [From AI Infrastructure to Secure AI Agent Infrastructure with kars](https://techcommunity.microsoft.com/t5/microsoft-developer-community/from-ai-infrastructure-to-secure-ai-agent-infrastructure-with/ba-p/4551519?ref=azurebrasil.cloud) - [Device Code Flow: The Gift That Keeps on Giving — To Attackers](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/device-code-flow-the-gift-that-keeps-on-giving-to-attackers/ba-p/4540949?ref=azurebrasil.cloud) - [Introducing Radius Canvas: visualize, review and deploy applications in the GitHub Copilot app](https://techcommunity.microsoft.com/t5/microsoft-developer-community/introducing-radius-canvas-visualize-review-and-deploy/ba-p/4549760?ref=azurebrasil.cloud) - [Microsoft Azure Virtual Desktop Hybrid is now generally available](https://techcommunity.microsoft.com/t5/azure-virtual-desktop-blog/microsoft-azure-virtual-desktop-hybrid-is-now-generally/ba-p/4550523?ref=azurebrasil.cloud) - [Azure Firewall explicit proxy is now generally available](https://techcommunity.microsoft.com/t5/azure-networking-blog/azure-firewall-explicit-proxy-is-now-generally-available/ba-p/4552450?ref=azurebrasil.cloud) - [AI Gateway tier of Azure API Management — August 2026 updates](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/ai-gateway-tier-of-azure-api-management-august-2026-updates/ba-p/4552703?ref=azurebrasil.cloud) - [Stop alt-tabbing into the wrong Visual Studio](https://devblogs.microsoft.com/visualstudio/stop-alt-tabbing-into-the-wrong-visual-studio/?ref=azurebrasil.cloud) - [Scaling AI Storage: Azure Managed Lustre excels in MLPerf Storage v3.0](https://techcommunity.microsoft.com/t5/azure-high-performance-computing/scaling-ai-storage-azure-managed-lustre-excels-in-mlperf-storage/ba-p/4552351?ref=azurebrasil.cloud) - [Azure Key Vault Control Plane API Update: Required Upgrade for Azure CLI and Azure PowerShell Users](https://techcommunity.microsoft.com/t5/azure-tools-blog/azure-key-vault-control-plane-api-update-required-upgrade-for/ba-p/4552476?ref=azurebrasil.cloud) - [Why long-running tasks on Linux Batch pools can restart daily and how to prevent it](https://techcommunity.microsoft.com/t5/azure-paas-blog/why-long-running-tasks-on-linux-batch-pools-can-restart-daily/ba-p/4546215?ref=azurebrasil.cloud) - [Automating Compliance Scope Enforcement with Azure Policy](https://techcommunity.microsoft.com/t5/azure-governance-and-management/automating-compliance-scope-enforcement-with-azure-policy/ba-p/4551921?ref=azurebrasil.cloud) - [Active Directory Domain Services modules on Microsoft Learn](https://techcommunity.microsoft.com/t5/itops-talk-blog/active-directory-domain-services-modules-on-microsoft-learn/ba-p/4547604?ref=azurebrasil.cloud) - [Introducing APIOps CLI](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/introducing-apiops-cli/ba-p/4552378?ref=azurebrasil.cloud) - [Stop Letting Agents Run the Workflow](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/stop-letting-agents-run-the-workflow/ba-p/4550068?ref=azurebrasil.cloud) - [Today I will… review GitHub PRs](https://devblogs.microsoft.com/visualstudio/today-i-will-review-github-prs/?ref=azurebrasil.cloud) - [Generally Available: Certificate Management for Azure Arc-enabled Kubernetes](https://techcommunity.microsoft.com/t5/azure-arc-blog/generally-available-certificate-management-for-azure-arc-enabled/ba-p/4542769?ref=azurebrasil.cloud) - [MDATP Linux agent latest release reporting](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/mdatp-linux-agent-latest-release-reporting/ba-p/4552316?ref=azurebrasil.cloud) - [Learn What to Do When You Hit Capacity in Azure Databricks!](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/learn-what-to-do-when-you-hit-capacity-in-azure-databricks/ba-p/4550550?ref=azurebrasil.cloud) - [Six Lessons for Reliable Agent Optimizer Gains on Harder Agents](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/six-lessons-for-reliable-agent-optimizer-gains-on-harder-agents/ba-p/4551357?ref=azurebrasil.cloud) - [Enterprise Live Migrations is now in public preview](https://devblogs.microsoft.com/devops/enterprise-live-migrations-public-preview/?ref=azurebrasil.cloud) - [Model Migration Process on Microsoft Foundry and Azure OpenAI](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/model-migration-process-on-microsoft-foundry-and-azure-openai/ba-p/4541236?ref=azurebrasil.cloud) - [Build governed asynchronous APIs with Azure API Management and Azure Service Bus](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/build-governed-asynchronous-apis-with-azure-api-management-and/ba-p/4544780?ref=azurebrasil.cloud) - [Power Azure SRE Agent with the tools it needs](https://devblogs.microsoft.com/azure-sdk/power-azure-sre-agent-with-connector-namespace/?ref=azurebrasil.cloud) - [Simpler, private connectivity between Azure and AWS with Azure Multicloud Interconnect](https://techcommunity.microsoft.com/t5/azure-networking-blog/simpler-private-connectivity-between-azure-and-aws-with-azure/ba-p/4550556?ref=azurebrasil.cloud) - [Consume Dataverse MCP server in Microsoft Foundry-Bringing business data to AI Agents](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/consume-dataverse-mcp-server-in-microsoft-foundry-bringing/ba-p/4548218?ref=azurebrasil.cloud) - [What’s new in Microsoft Sentinel: August 2026](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/what-s-new-in-microsoft-sentinel-august-2026/ba-p/4551405?ref=azurebrasil.cloud) - [Bacpac and Dacpac, the similarities and differences](https://devblogs.microsoft.com/azure-sql/bacpac-and-dacpac-the-similarities-and-differences/?ref=azurebrasil.cloud) - [BizTalk Server 2020 End-of-Sale Announcement](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/biztalk-server-2020-end-of-sale-announcement/ba-p/4551317?ref=azurebrasil.cloud) ### GitHub Updates - [Project HydraFusion: Frontier quality via multi-model orchestration](https://github.blog/ai-and-ml/github-copilot/project-hydrafusion-frontier-quality-via-multi-model-orchestration/?ref=azurebrasil.cloud) - [GitHub Copilot app for Beginners: Run several agents at once](https://github.blog/ai-and-ml/github-copilot/github-copilot-app-for-beginners-run-several-agents-at-once/?ref=azurebrasil.cloud) - [Decoding the new AI lingo: Loops, harnesses, squads, hill climbing… oh my!](https://github.blog/ai-and-ml/decoding-the-new-ai-lingo-loops-harnesses-squads-hill-climbing-oh-my/?ref=azurebrasil.cloud) - [How we make AI coding more cost efficient without sacrificing task quality](https://github.blog/ai-and-ml/github-copilot/how-we-make-ai-coding-more-cost-efficient-without-sacrificing-task-quality/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Busca semântica com pgvector, EF Core e Azure OpenAI](https://www.azurebrasil.cloud/blog/busca-semantica-com-pgvector-ef-core-e-azure-openai/) - [Consumindo o Microsoft Foundry via Azure VNet — Parte 1](https://www.azurebrasil.cloud/blog/consumindo-o-microsoft-foundry-via-azure-vnet-parte-1/) - [Modernizando um projeto ASP.NET Core MVC com Vue, PrimeVue e Tailwind CSS usando GitHub Copilot e agentes especializados - Parte 1](https://www.azurebrasil.cloud/blog/modernizando-um-projeto-asp-net-core-mvc-com-vue-primevue-e-tailwind-css-usando-github-copilot-e-agentes-especializados-parte-1/) - [Azure Newsletter - 2026-08-31](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-08-31/) ### Busca semântica com pgvector, EF Core e Azure OpenAI URL: https://www.azurebrasil.cloud/blog/busca-semantica-com-pgvector-ef-core-e-azure-openai/ Last updated: 2026-09-04T12:25:41.000Z Busca por palavra-chave funciona bem quando o usuário digita exatamente o que está no catálogo. O problema começa quando ele pesquisa *"algo pra correr na chuva"* e o produto no banco se chama *"Tênis de corrida impermeável"*. Nenhuma `LIKE` ou full-text resolve isso com elegância. A saída é transformar texto em vetores (embeddings) e comparar **significado**, não strings. Neste artigo vamos montar uma Minimal API em [.NET](https://dotnet.microsoft.com/?ref=azurebrasil.cloud) que cadastra produtos, gera embeddings com [Azure OpenAI](https://learn.microsoft.com/azure/ai-foundry/openai/?ref=azurebrasil.cloud) e faz vector search no [PostgreSQL](https://www.postgresql.org/?ref=azurebrasil.cloud) usando a extensão [pgvector](https://github.com/pgvector/pgvector?ref=azurebrasil.cloud) via [Entity Framework Core](https://learn.microsoft.com/ef/core/?ref=azurebrasil.cloud). O código é o mesmo fluxo do projeto demo `SemanticSearchApi`. Link do GitHub: [semantic-search-pgvector-demo](https://github.com/guigovaski/semantic-search-pgvector-demo?ref=azurebrasil.cloud) ## O que você vai ver 1. Criar o resource e o deployment de embedding no Azure 2. Preparar o PostgreSQL com pgvector via Docker Compose 3. Mapear a coluna `vector(1536)` no EF Core e o índice HNSW 4. Gerar embedding no cadastro do produto 5. Buscar por similaridade com `CosineDistance` **Pré-requisitos:** - [.NET 10 SDK](https://dotnet.microsoft.com/download?ref=azurebrasil.cloud) - [Docker](https://www.docker.com/?ref=azurebrasil.cloud) instalado e rodando - Assinatura [Azure](https://azure.microsoft.com/?ref=azurebrasil.cloud) com permissão para criar resource de Azure OpenAI - Noções de EF Core e Minimal APIs **Stack do exemplo:** | Peça | Versão / valor | | ----------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | | Target framework | net10.0 | | [Azure.AI.OpenAI](https://www.nuget.org/packages/Azure.AI.OpenAI?ref=azurebrasil.cloud) | 2.1.0 | | [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL?ref=azurebrasil.cloud) | 10.0.3 | | [Pgvector.EntityFrameworkCore](https://www.nuget.org/packages/Pgvector.EntityFrameworkCore?ref=azurebrasil.cloud) | 0.3.0 | | Modelo de embedding | text-embedding-3-small (1536 dimensões) | ## Por que vector search Um **embedding** é um array de números de ponto flutuante que representa o significado de um texto em um espaço de alta dimensão. Textos parecidos ficam “perto” uns dos outros nesse espaço. Fluxo da aplicação: 1. No **cadastro**, concatena nome + descrição do produto, manda pro modelo de embedding e grava o vetor na coluna `Embedding` 2. Na **busca**, gera o embedding da query do usuário e pede ao banco os produtos com menor distância cosseno em relação a esse vetor Quem faz a matemática de similaridade é o **pgvector** no PostgreSQL. O EF Core só traduz `CosineDistance` para o operador `<=>` do pgvector. ## 1\. Setup do Azure OpenAI Precisamos de um resource Azure OpenAI e de um **deployment** do modelo de embedding. ### Criar o resource (portal) 1. Acesse o [Azure portal](https://portal.azure.com/?ref=azurebrasil.cloud) 2. **Create a resource** → busque **Azure OpenAI** → **Create** ![az-semantic-search-1.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/az-semantic-search-1.png) 3. Preencha subscription, resource group, região, nome e pricing tier 4. Prossiga com a configuração padrão dos outros passos clicando sempre em **Next** até chegar em **Review + create** 5. Revise e crie o resource ![az-semantic-search-2.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/az-semantic-search-2.png) ### Deploy do modelo de embedding 1. Abra o resource no [Microsoft Foundry](https://ai.azure.com/?ref=azurebrasil.cloud) (portal classic, se for o fluxo que você estiver usando) 2. Vá em **Deployments** → **Deploy model** → **Deploy base model** ![az-semantic-search-3.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/az-semantic-search-3.png) 3. Escolha **`text-embedding-3-small`** 4. Defina o **deployment name** — no exemplo usamos o mesmo nome do modelo: `text-embedding-3-small` ![az-semantic-search-4.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/09/az-semantic-search-4.png) 5. Confirme o deploy e aguarde o status de sucesso. Anote: - **Endpoint base** no formato `https://SEU-RECURSO.openai.azure.com/` - **API key** do resource - **Nome do deployment** exatamente como criou ## 2\. Criar e executar o container do PostgreSQL com a extensão pgvector via Docker Compose Crie o arquivo `docker-compose.yml` na raiz do projeto com o conteúdo abaixo (senha e dbname podem ser alterados, desde que batam com a connection string): ```yaml version: '3.8' services: db: image: pgvector/pgvector:pg16 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: Devenv12345! POSTGRES_DB: ecommercedb ports: - "5432:5432" ``` Execute `docker compose up -d` para subir o container. ## 3\. Projeto e pacotes ```bash dotnet new web -n SemanticSearchApi cd SemanticSearchApi dotnet add package Azure.AI.OpenAI --version 2.1.0 dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL --version 10.0.3 dotnet add package Pgvector.EntityFrameworkCore --version 0.3.0 dotnet add package Microsoft.EntityFrameworkCore.Design --version 10.0.10 ``` O pacote `Pgvector.EntityFrameworkCore` puxa o tipo `Vector` e os métodos de distância traduzíveis para SQL (`CosineDistance`, `L2Distance`, etc.). ## 4\. Entidade e DbContext Crie `AppDbContext.cs`. O ponto crítico: a dimensão da coluna **precisa bater** com a dimensão do modelo. O `text-embedding-3-small` gera vetores com **1536** dimensões por padrão. No mesmo `OnModelCreating`, habilitamos a extensão `vector` e o índice **HNSW** com `vector_cosine_ops` — o operator class certo para `CosineDistance`. Sem isso, o demo ordena por distância em full scan; com o índice, o pgvector usa nearest neighbor aproximado. ```csharp using System.ComponentModel.DataAnnotations.Schema; using Pgvector; using Microsoft.EntityFrameworkCore; public class Product { public int Id { get; set; } public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; // Define a propriedade Embedding como um vetor de 1536 dimensões, que é o tamanho do embedding gerado pelo modelo "text-embedding-3-small" da OpenAI. [Column(TypeName = "vector(1536)")] public Vector? Embedding { get; set; } } public class AppDbContext : DbContext { public AppDbContext(DbContextOptions options) : base(options) { } public DbSet Products { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Habilita a extensão do pgvector no banco de dados PostgreSQL modelBuilder.HasPostgresExtension("vector"); modelBuilder.Entity() .HasIndex(p => p.Embedding) .HasMethod("hnsw") .HasOperators("vector_cosine_ops"); } } ``` Sem o `TypeName = "vector(1536)"`, o Npgsql não sabe o tipo exato da coluna. Se você trocar de modelo ou de dimensões, altere o atributo **e** a coluna no banco. ## 5\. Configurar EF Core e Azure OpenAI no Program.cs Dois detalhes que não podem faltar: 1. `UseVector()` no `UseNpgsql` — registra mapeamento do tipo e os translators de distância 2. Endpoint **base** \+ nome do **deployment** no `GetEmbeddingClient` Connection string, endpoint, key e nome do deployment vêm do `appsettings.json` (não hardcode no `Program.cs`). `appsettings.json`: ```json { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "Default": "Host=localhost;Database=ecommercedb;Username=postgres;Password=Devenv12345!" }, "AzureOpenAI": { "Endpoint": "https://SEU-RECURSO.openai.azure.com/", "Key": "SUA_API_KEY", "EmbeddingDeployment": "text-embedding-3-small" } } ``` `Program.cs`: ```csharp using Azure.AI.OpenAI; using Microsoft.EntityFrameworkCore; using Pgvector.EntityFrameworkCore; using Pgvector; using System.ClientModel; var builder = WebApplication.CreateBuilder(args); var connectionString = builder.Configuration.GetConnectionString("Default") ?? throw new InvalidOperationException("Connection string 'Default' não configurada."); builder.Services.AddDbContext(options => options.UseNpgsql(connectionString, o => o.UseVector())); var openAiEndpoint = builder.Configuration["AzureOpenAI:Endpoint"] ?? throw new InvalidOperationException("AzureOpenAI:Endpoint não configurado."); var openAiKey = builder.Configuration["AzureOpenAI:Key"] ?? throw new InvalidOperationException("AzureOpenAI:Key não configurado."); var embeddingDeploymentName = builder.Configuration["AzureOpenAI:EmbeddingDeployment"] ?? throw new InvalidOperationException("AzureOpenAI:EmbeddingDeployment não configurado."); var aiClient = new AzureOpenAIClient( new Uri(openAiEndpoint), new ApiKeyCredential(openAiKey)); builder.Services.AddSingleton(aiClient); var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService(); await db.Database.MigrateAsync(); } // endpoints abaixo... app.Run(); ``` Crie a migration inicial: ```bash dotnet ef migrations add Initial dotnet run ``` A migration gera a extensão `vector` no database, a coluna `Embedding` como `vector(1536)` e o índice HNSW `IX_Products_Embedding` com `vector_cosine_ops`. ## 6\. Cadastro: gerar e persistir o embedding No POST, montamos um texto estável a partir do produto, pedimos o embedding ao Azure e salvamos o `Vector` junto com nome e descrição. ```csharp app.MapPost("/api/products", async (CreateProductRequest request, AppDbContext db, AzureOpenAIClient aiClient) => { if (string.IsNullOrWhiteSpace(request.Name)) return Results.BadRequest("O nome do produto não pode estar vazio."); if (string.IsNullOrWhiteSpace(request.Description)) return Results.BadRequest("A descrição do produto não pode estar vazia."); var embeddingClient = aiClient.GetEmbeddingClient(embeddingDeploymentName); var textToEmbed = $"{request.Name}. {request.Description}"; var embedResponse = await embeddingClient.GenerateEmbeddingAsync(textToEmbed); var embedding = new Vector(embedResponse.Value.ToFloats().ToArray()); var product = new Product { Name = request.Name.Trim(), Description = request.Description.Trim(), Embedding = embedding }; db.Products.Add(product); await db.SaveChangesAsync(); return Results.Created($"/api/products/{product.Id}", new { product.Id, product.Name, product.Description }); }); record CreateProductRequest(string Name, string Description); ``` Por que `Nome. Descrição`? Porque o embedding “enxerga” o texto que você manda. Se na busca o usuário descreve uso ou benefício, vale a pena o cadastro carregar esse contexto na descrição — não só o nome comercial seco. O SDK devolve `ReadOnlyMemory`; o construtor de `Pgvector.Vector` aceita o `float[]` correspondente. ## 7\. Busca: CosineDistance no LINQ Aqui está o coração da busca semântica: ```csharp app.MapGet("/api/products/search", async (string query, AppDbContext db, AzureOpenAIClient aiClient) => { if (string.IsNullOrWhiteSpace(query)) return Results.BadRequest("A consulta de pesquisa não pode estar vazia."); var embeddingClient = aiClient.GetEmbeddingClient(embeddingDeploymentName); var embedResponse = await embeddingClient.GenerateEmbeddingAsync(query); var queryVector = new Vector(embedResponse.Value.ToFloats().ToArray()); const double maxDistance = 0.6; var products = await db.Products .Where(p => p.Embedding!.CosineDistance(queryVector) < maxDistance) .OrderBy(p => p.Embedding!.CosineDistance(queryVector)) .Select(p => new { p.Name, p.Description }) .AsNoTracking() .ToListAsync(); return Results.Ok(products); }); ``` O que o EF/pgvector faz: | C# | SQL (pgvector) | | --------------------------------- | ------------------------------------------ | | CosineDistance(queryVector) | operador <=> | | OrderBy na distância | ORDER BY embedding <=> @query | | filtro < maxDistance | descarta resultados semanticamente fracos | | índice HNSW + vector\_cosine\_ops | acelera o nearest neighbor no operador <=> | No pgvector, a **cosine distance** vai de **0** (mesma direção) a **2** (direções opostas). Quanto **menor**, mais parecido. O limiar `0.6` é uma escolha de produto: mais baixo = resultados mais restritos; mais alto = mais recall e mais ruído. Vale calibrar com dados reais do catálogo. ## 8\. Testando o fluxo Suba a API: ```bash dotnet run ``` Cadastre alguns produtos: ```bash curl -X POST http://localhost:5015/api/products -H "Content-Type: application/json" -d '{"name":"Notebook Dell XPS 15","description":"Notebook premium com processador Intel Core i7, 32GB de RAM, SSD 1TB e tela OLED 15.6 polegadas."}' curl -X POST http://localhost:5015/api/products -H "Content-Type: application/json" -d '{"name":"Fone de Ouvido Sony WH-1000XM5","description":"Headset com cancelamento de ruído ativo, Bluetooth 5.2 e até 30 horas de bateria."}' curl -X POST http://localhost:5015/api/products -H "Content-Type: application/json" -d '{"name":"Headset HyperX Cloud II","description":"Headset gamer com som surround 7.1, microfone removível e conforto para longas sessões de jogo."}' curl -X POST http://localhost:5015/api/products -H "Content-Type: application/json" -d '{"name":"Cama Ortopédica para Cachorro","description":"Cama macia e lavável para cães de médio e grande porte, com espuma de memória e capa impermeável."}' ``` Busque por intenção, não por keyword exata: ```bash curl -G --data-urlencode "query=computador portátil" http://localhost:5015/api/products/search curl -G --data-urlencode "query=fone com cancelamento de ruído" http://localhost:5015/api/products/search curl -G --data-urlencode "query=headset para jogos" http://localhost:5015/api/products/search curl -G --data-urlencode "query=cama para cachorro" http://localhost:5015/api/products/search ``` A expectativa: - *computador portátil para trabalho* → Notebook Dell XPS 15 - *fone com cancelamento de ruído* → Sony WH-1000XM5 - *headset para jogos* → HyperX Cloud II - *cama para cachorro* → Cama Ortopédica para Cachorro Mesmo sem a palavra “notebook” na primeira query, o embedding deve puxar o XPS — e a cama de cachorro não deveria aparecer no meio dos fones. ## Conclusão Vector search deixa de ser “só pra time de ML” quando você encaixa três peças que já são familiares no dia a dia .NET: 1. **Azure OpenAI** gera o embedding 2. **PostgreSQL + pgvector** armazena e compara vetores (com HNSW para não varrer a tabela inteira) 3. **EF Core + Pgvector.EntityFrameworkCore** expõe isso em LINQ com `CosineDistance` Com uma Minimal API, um `DbContext` e dois endpoints, você já tem um catálogo que entende *"computador portátil para trabalho"*. O próximo passo natural é calibrar o limiar de distância e enriquecer o texto embutido no cadastro. ## Dicionário - **Embedding** — representação numérica (vetor) do significado de um texto; textos parecidos produzem vetores próximos. - **Vector search (busca vetorial)** — recuperar itens pela proximidade dos embeddings, em vez de igualdade de palavras. - **Cosine distance** — medida de distância baseada no ângulo entre dois vetores; no pgvector, 0 é o mais similar e 2 o mais oposto. - **pgvector** — extensão do PostgreSQL que adiciona o tipo `vector` e operadores/índices de similaridade. - **Deployment (Azure OpenAI)** — instância publicada de um modelo no seu resource; o nome do deployment é o identificador usado nas chamadas da API. - **HNSW** — algoritmo de índice aproximado (grafo) usado pelo pgvector para acelerar nearest neighbor search em escala. - **Minimal API** — estilo de API no ASP.NET Core em que rotas e handlers são mapeados de forma enxuta, sem controllers obrigatórios. - **AsNoTracking** — modo do EF Core em que as entidades lidas não entram no change tracker, reduzindo custo em consultas somente leitura. ## Referências - [pgvector](https://github.com/pgvector/pgvector?ref=azurebrasil.cloud) — extensão PostgreSQL - [pgvector-dotnet / EF Core](https://github.com/pgvector/pgvector-dotnet?ref=azurebrasil.cloud#entity-framework-core) — pacote .NET e exemplos de distância - [Azure OpenAI – gerar embeddings](https://learn.microsoft.com/azure/ai-foundry/openai/how-to/embeddings?ref=azurebrasil.cloud) - [Criar resource e deploy Azure OpenAI](https://learn.microsoft.com/azure/ai-foundry/openai/how-to/create-resource?ref=azurebrasil.cloud) - [Entity Framework Core](https://learn.microsoft.com/ef/core/?ref=azurebrasil.cloud) - [Npgsql EF Core provider](https://www.npgsql.org/efcore/?ref=azurebrasil.cloud) - [ASP.NET Core Minimal APIs](https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis?ref=azurebrasil.cloud) - [PostgreSQL](https://www.postgresql.org/?ref=azurebrasil.cloud) ### Consumindo o Microsoft Foundry via Azure VNet — Parte 1 URL: https://www.azurebrasil.cloud/blog/consumindo-o-microsoft-foundry-via-azure-vnet-parte-1/ Last updated: 2026-09-02T14:07:12.000Z O Microsoft Foundry é a plataforma da Microsoft para criar, hospedar e orquestrar agentes de IA, e um dos cenários mais comuns no dia a dia é expor esses agentes para uma aplicação backend sem nunca deixar o tráfego passar pela Internet pública. Este artigo é o primeiro de uma série sobre como executar uma aplicação .NET no Azure App Service e consumir um agente do Microsoft Foundry utilizando exclusivamente conectividade privada. Nesta primeira parte, montamos toda a infraestrutura de rede no Azure Portal, deixando o ambiente pronto para que, nas próximas partes, a aplicação .NET consiga chamar o Foundry sem nenhuma exposição pública. O conteúdo apresenta todo o processo, incluindo: - Criação da Virtual Network vnet-demo com o address space 10.0.0.0/16; - Criação das subnets default, para o App Service, e snet-foundry, para o Private Endpoint; - Criação do App Service app-vnet-demo com Public Access desabilitado e Inbound Private Endpoint desligado; - Habilitação da VNet Integration para o tráfego de saída e a delegation automática da subnet para Microsoft.Web/serverFarms; - Criação do Microsoft Foundry foundry-vnet-integration e do projeto proj-default; - Criação do Private Endpoint pe-foundry-vnet-integration com o target sub-resource account; - Integração com as Private DNS Zones e a configuração do Network isolation mode for Agent. O artigo também esclarece a diferença entre três conceitos que costumam ser confundidos: Private Link é a tecnologia que viabiliza a conexão privada entre uma VNet e um serviço PaaS, Private Endpoint é a network interface com IP privado criada dentro da subnet para representar o recurso de destino, e VNet Integration é o mecanismo que permite ao App Service fazer chamadas de saída para dentro da VNet. Com essa infraestrutura pronta, o caminho completo da comunicação passa a ser inteiramente privado, do App Service até o Microsoft Foundry, sem tocar a Internet pública em nenhum momento, uma base sólida para equipes que precisam consumir agentes de IA em ambientes corporativos com requisitos de isolamento de rede. Confira o tutorial completo e todas as etapas da configuração: [**https://tallesvaliatti.com/consumindo-o-microsoft-foundry-via-azure-vnet-parte-1-3b430d46998f**](https://tallesvaliatti.com/consumindo-o-microsoft-foundry-via-azure-vnet-parte-1-3b430d46998f?ref=azurebrasil.cloud) ### Modernizando um projeto ASP.NET Core MVC com Vue, PrimeVue e Tailwind CSS usando GitHub Copilot e agentes especializados - Parte 1 URL: https://www.azurebrasil.cloud/blog/modernizando-um-projeto-asp-net-core-mvc-com-vue-primevue-e-tailwind-css-usando-github-copilot-e-agentes-especializados-parte-1/ Last updated: 2026-09-01T12:37:04.000Z O [GitHub Copilot](https://docs.github.com/en/copilot?ref=azurebrasil.cloud) deixou de ser apenas um autocompletar de código para se tornar um agente capaz de planejar, implementar e validar mudanças inteiras em uma base de código. Este artigo conta como usei o GitHub Copilot em modo agente para modernizar o front-end de um projeto ASP.NET Core MVC clássico, adicionando Vue 3, PrimeVue e Tailwind CSS v4 sem reescrever a aplicação como uma SPA, e como esse trabalho terminou virando duas skills reutilizáveis na forma de Custom Agents do GitHub Copilot: [Frontend-Tooling-Specialist](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/blob/feature/module4/.github/agents/frontend-tooling-specialist.agent.md?ref=azurebrasil.cloud) e [Frontend-Specialist](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/blob/feature/module4/.github/agents/frontend-specialist.agent.md?ref=azurebrasil.cloud). O projeto de partida é o BookStore, uma aplicação ASP.NET Core MVC com Razor Views, Bootstrap 5 e jQuery, estruturada em três camadas (Domain, Application e Web). A ideia inicial era simples: usar o [PrimeVue](https://primevue.dev/?ref=azurebrasil.cloud) com o [Tailwind CSS](https://tailwindcss.com/?ref=azurebrasil.cloud) no front-end. O problema é que PrimeVue é uma biblioteca de componentes para Vue.js, e ela não se encaixa naturalmente em uma página Razor renderizada no servidor. Antes de sair criando arquivos, o primeiro valor real do GitHub Copilot apareceu aqui: em vez de assumir uma arquitetura, ele parou para perguntar como eu queria integrar Vue numa aplicação que não usava Vue, oferecendo opções concretas (só Tailwind, Vue em páginas específicas, ou migração total para SPA). Essa pausa para validar o escopo evitou um retrabalho enorme, porque a resposta certa (Vue só em páginas específicas, com build via Vite) definiu toda a arquitetura que veio depois. Tela Home: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-24.png) Tela Books: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-25.png) Tela Authors: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-26.png) Com o escopo definido, o GitHub Copilot investigou os controllers, serviços e views existentes antes de tocar em qualquer arquivo, para não inventar nomes de rotas ou de entidades que não existiam. A partir daí, ele criou um projeto Vite dentro de ClientApp, isolado do restante da solução .NET: ```javascript { "dependencies": { "@primeuix/themes": "^1.0.0", "primeicons": "^7.0.0", "primevue": "^4.3.0", "vue": "^3.5.0" }, "devDependencies": { "@tailwindcss/vite": "^4.0.0", "@vitejs/plugin-vue": "^5.2.0", "tailwindcss": "^4.0.0", "tailwindcss-primeui": "^0.6.0", "typescript": "^5.7.0", "vite": "^6.0.0", "vue-tsc": "^2.2.0" } } ``` Esse conjunto de dependências resume a integração inteira. O Vue 3 fornece o runtime de componentes, o PrimeVue entrega os componentes prontos (tabelas, diálogos, menus), o Tailwind CSS v4 cuida da estilização utilitária, e o pacote tailwindcss-primeui é o plugin oficial da PrimeTek que faz a ponte entre os dois mundos, expondo os tokens de cor do tema PrimeVue como classes Tailwind, como bg-primary e text-muted-color, em vez de depender de valores hexadecimais soltos pelo código. O Tailwind v4 mudou a forma de configuração: não existe mais tailwind.config.js, tudo é feito via CSS. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-20.png) Essas duas linhas, dentro do style.css do ClientApp, são suficientes para ativar o Tailwind e o plugin do PrimeVue, seguindo exatamente a recomendação da [documentação oficial](https://primevue.dev/tailwind/?ref=azurebrasil.cloud). O plugin @tailwindcss/vite, por sua vez, é registrado no vite.config.ts, junto com o plugin de Vue, seguindo o guia oficial de instalação do Tailwind com [Vite](https://tailwindcss.com/docs/installation/using-vite?ref=azurebrasil.cloud). Cada tela de listagem (Books, Authors, Customers) passou a montar um componente Vue com um PrimeVue DataTable, buscando dados de novos endpoints JSON que reaproveitam os serviços de aplicação já existentes, sem duplicar a paginação no cliente. O GitHub Copilot também validou o trabalho sozinho: rodou npm run build, depois dotnet build, e só reportou a tarefa como concluída depois de confirmar os dois builds passando e o endpoint retornando o JSON esperado. Tela do navegador mostrando a listagem de livros com o PrimeVue DataTable estilizado com Tailwind, dentro da página Razor do BookStore: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-28.png) O trabalho não parou aí. Em sessões seguintes, o mesmo padrão foi expandido: o Bootstrap foi removido do projeto inteiro, o layout global passou a carregar o bundle do Vue de forma única, uma sidebar em Vue substituiu a navbar antiga, e as telas de Books e Authors ganharam formulários de criação, edição, detalhes e exclusão totalmente em diálogos PrimeVue, cada um seguindo especificações extraídas do [Figma](https://www.figma.com/?ref=azurebrasil.cloud) através do servidor [MCP do Figma](https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/?ref=azurebrasil.cloud#vs-code). Esse crescimento de escopo é justamente o motivo pelo qual o trabalho foi encapsulado em [Custom Agents do GitHub Copilot](https://code.visualstudio.com/docs/copilot/customization/custom-agents?ref=azurebrasil.cloud), o mecanismo do VS Code para gravar personas especializadas em arquivos .agent.md dentro de .github/agents. Um Custom Agent combina um conjunto restrito de ferramentas com instruções específicas de domínio, de forma que trocar de agente troca também o comportamento do GitHub Copilot para aquela tarefa, sem precisar repetir contexto a cada conversa. O primeiro agente criado foi o [Frontend-Tooling-Specialist](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/blob/feature/module4/.github/agents/frontend-tooling-specialist.agent.md?ref=azurebrasil.cloud), responsável pela infraestrutura: o projeto Vite dentro de ClientApp, o conjunto de dependências, a remoção do Bootstrap, a integração do bundle no layout e a camada de API JSON que alimenta os componentes. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-21.png) O campo description é a peça mais importante desse arquivo. É por meio dele que o GitHub Copilot decide, sozinho, quando aquele agente deve ser acionado como subagente dentro de uma tarefa maior, então cada palavra ali funciona como um gatilho de busca. A lista tools restringe deliberadamente o que o agente pode fazer: leitura, edição, busca, execução de comandos e acesso à web, sem, por exemplo, permissões para mexer em infraestrutura de nuvem. No corpo do arquivo, esse agente documenta o estado atual do repositório (versões instaladas, estrutura do vite.config.ts, convenção de nomes fixos main.js/main.css) e um roteiro passo a passo de migração, incluindo a configuração dos servidores MCP: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-22.png) Esse arquivo `mcp.json` conecta o GitHub Copilot a dois servidores Model Context Protocol: o primevue, que expõe a documentação e os exemplos de cada componente diretamente dentro do chat, e o figma-mcp, que permite ler nós de um arquivo Figma e extrair medidas, cores e textos reais em vez de depender de capturas de tela. O [Frontend-Tooling-Specialist](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/blob/feature/module4/.github/agents/frontend-tooling-specialist.agent.md?ref=azurebrasil.cloud) trata a existência e a validade desse arquivo como parte do seu escopo, recriando-o com esse formato exato sempre que estiver ausente ou corrompido. O segundo agente, [Frontend-Specialist](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/blob/feature/module4/.github/agents/frontend-specialist.agent.md?ref=azurebrasil.cloud), cuida da metade que o primeiro deliberadamente não toca: a criação e a estilização dos componentes Vue em si. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-23.png) Tela do figma com o layout e os componentes: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-27.png) A divisão entre os dois agentes segue um princípio simples de responsabilidade única: o Tooling-Specialist decide como o Vue é empacotado, servido e alimentado por dados, enquanto o Specialist decide como cada tela se parece e se comporta, sempre ancorado num nó real do Figma em vez de aproximações visuais. Essa separação evita que uma tarefa de estilo acabe mexendo em vite.config.ts, ou que uma tarefa de infraestrutura reescreva um componente sem necessidade. Cada agente também carrega uma seção fixa de constraints, coisas que ele nunca deve fazer, como reintroduzir Bootstrap, adicionar paginação no lado do cliente ou inventar um valor de design quando existe um nó do Figma disponível para consulta. Os dois agentes compartilham ainda um fluxo obrigatório de sincronização com um vault de documentação em Markdown, lido e escrito através de skills próprias antes e depois de qualquer tarefa. Isso significa que, sessão após sessão, o GitHub Copilot não perde o histórico de decisões de arquitetura, mesmo quando a conversa muda de contexto ou de dia. Foi exatamente esse mecanismo que permitiu reconstruir, meses depois, uma explicação completa de tudo o que havia sido implementado, incluindo detalhes finos como a convenção de nomenclatura de classes Tailwind ou o motivo de uma tela ainda não ter sido migrada. Imagem do seletor de agentes do GitHub Copilot no VS Code, mostrando Frontend-Tooling-Specialist e Frontend-Specialist na lista junto com os agentes de domínio do projeto: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-29.png) O ganho real de usar o GitHub Copilot aqui não foi só gerar código mais rápido. Foi conseguir transformar decisões de arquitetura, convenções de estilo e armadilhas já resolvidas (como o Tailwind v4 não enxergar classes usadas só em arquivos .cshtml fora da pasta do Vite) em conhecimento reutilizável, na forma de dois agentes com escopos e ferramentas bem definidos. Qualquer pessoa do time que abrir esse repositório pela primeira vez pode simplesmente trocar para um desses agentes e continuar o trabalho exatamente de onde ele parou, sem precisar reconstruir esse contexto do zero. Esse foi o retrato da jornada até aqui: um MVC clássico ganhando Vue, PrimeVue e Tailwind CSS através do GitHub Copilot, e o conhecimento acumulado nesse processo virando dois agentes especializados. Mas ainda falta mostrar como esses agentes garantem fidelidade pixel a pixel com o design original, sem depender de suposições visuais. Na Parte 2 dessa série, o foco vai para o Model Context Protocol e para o servidor MCP do Figma, mostrando como o Frontend-Specialist extrai medidas, cores e espaçamentos reais de um frame do Figma antes de escrever qualquer componente Vue. O código completo deste projeto está disponível no meu repositório no [GitHub](https://github.com/AzureBrasil-cloud/webinar-gh-copilot/tree/feature/module4?ref=azurebrasil.cloud). Links e Docks: [GitHub Copilot documentation - GitHub DocsYou can use GitHub Copilot to enhance your productivity and assist as you work on code.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-afd6b2bf-4e72-4777-9c88-93121298f8fe.png)GitHub Docs![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/copilot-2da01246-6d6d-4506-86b1-951792a43115.png)](https://docs.github.com/en/copilot?ref=azurebrasil.cloud) [PrimeVue | Vue UI Component LibraryThe ultimate collection of design-agnostic, flexible and accessible Vue UI Components.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-50c4a3db-2982-4c91-81ce-bfdd9e945234.png)Vue UI Component Library![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/primevue-meta-55845b99-9139-40f4-8432-5626ca316fb9.png)](https://primevue.dev/?ref=azurebrasil.cloud) [Tailwind CSS - Rapidly build modern websites without ever leaving your HTML.Tailwind CSS is a utility-first CSS framework for rapidly building modern websites without ever leaving your HTML.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-43aa330d-1bb7-49e0-90b3-90abe1639bc0.ico)Tailwind CSS![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/opengraph-image-f81628ba-a134-45cc-8199-415b3bc1e262.jpg)](https://tailwindcss.com/?ref=azurebrasil.cloud) [PrimeVue | Vue UI Component LibraryThe ultimate collection of design-agnostic, flexible and accessible Vue UI Components.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-358e8317-9d6f-4d3f-9f0e-ef9620f228de.png)PrimeVue![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/primevue-meta-7044af0e-ce76-43eb-9e09-1f9273ce79c1.png)](https://primevue.dev/tailwind/?ref=azurebrasil.cloud) [Installing with Vite - InstallationIntegrate Tailwind CSS with frameworks like Laravel, SvelteKit, React Router, and SolidJS.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-73c0a42b-2fa8-4e18-afd6-39389b8b4917.ico)Tailwind CSS![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/og-5757c852-6579-46d3-9065-ad413f89fe79)](https://tailwindcss.com/docs/installation/using-vite?ref=azurebrasil.cloud) [Figma: The collaborative canvas for design, code, and AIFigma is the canvas where design, code, and AI come together. From first idea to shipped product — go from concept to production with your whole team, in one place.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-bf8f271e-b356-4124-80ca-34af05534459.png)Figma![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/b08d37520f7d5ad8d6562975b5932dd2d9a862bb-1200x630-7e092970-cbf9-47cd-bf57-c6de33fb9bbd.gif)](https://www.figma.com/?ref=azurebrasil.cloud) [Custom agents in VS CodeLearn how to create custom agents (formerly custom chat modes) to tailor AI chat behavior in VS Code for your specific workflows and development scenarios.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-8135f6db-c9e5-4059-869d-6a1c96a4c783.ico)MicrosoftMicrosoft![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/custom-agents-9745f0b9-63e9-43ad-9c6c-dd07e43fd147.webp)](https://code.visualstudio.com/docs/copilot/customization/custom-agents?ref=azurebrasil.cloud) [Set up the remote server (recommended) | Developer DocsNote: Only clients listed in the Figma MCP Catalog like VS Code, Cursor, or Claude Code can connect to the Figma MCP Server. If you’re a developer interested in connecting a new MCP client, you can join the waitlist.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-602f9aef-7aae-44cc-907b-1a2fcda5da1b.ico)Developers![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/claude-remote-mcp-manage-9159bd35956998870502ea6e580190ff-e1ed2e71-8b5d-4e77-bcca-cb0d69d4afb0.png)](https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/?ref=azurebrasil.cloud#vs-code) Não esqueça de me seguir no [LinkedIn](https://www.linkedin.com/in/flpfaria/?ref=azurebrasil.cloud) para mais conteúdos. Até a próxima!!! ### Azure Newsletter - 2026-08-31 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-08-31/ Last updated: 2026-08-31T12:46:38.000Z ### Azure Updates - [Only believe what you can validate: a verification framework for agentic AI](https://devblogs.microsoft.com/all-things-azure/only-believe-what-you-can-validate/?ref=azurebrasil.cloud) - [Try the new SqlClient and Retry connections natively](https://devblogs.microsoft.com/azure-sql/sqlclient-retry/?ref=azurebrasil.cloud) - [Advertised gateway prefixes in Azure](https://techcommunity.microsoft.com/t5/azure-networking-blog/advertised-gateway-prefixes-in-azure/ba-p/4550940?ref=azurebrasil.cloud) - [Announcing Confidential Live Migration in Azure](https://techcommunity.microsoft.com/t5/azure-confidential-computing/announcing-confidential-live-migration-in-azure/ba-p/4524558?ref=azurebrasil.cloud) - [🚀 Foundry Toolkit for VS Code — August 2026 Update](https://techcommunity.microsoft.com/t5/microsoft-developer-community/foundry-toolkit-for-vs-code-august-2026-update/ba-p/4551138?ref=azurebrasil.cloud) - [Zonal redundancy in API management Standard v2](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/zonal-redundancy-in-api-management-standard-v2/ba-p/4550977?ref=azurebrasil.cloud) - [Introducing Cohere Parse V5](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/introducing-cohere-parse-v5/ba-p/4550955?ref=azurebrasil.cloud) - [Cohere Parse v5 is now available in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/cohere-parse-v5-is-now-available-in-microsoft-foundry/ba-p/4550954?ref=azurebrasil.cloud) - [Azure Developer CLI (azd) – August 2026](https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-august-2026/?ref=azurebrasil.cloud) - [VSLive! @ Microsoft HQ: Developer Takeaways and Must-Watch Sessions](https://devblogs.microsoft.com/visualstudio/vslive-hq-content-sandiego-and-orlando-mentions/?ref=azurebrasil.cloud) - [Manage and retrieve credentials securely inside Browser Automation Tool (BAT) using Azure Key Vault](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/manage-and-retrieve-credentials-securely-inside-browser/ba-p/4550858?ref=azurebrasil.cloud) - [Azure DevOps in the GitHub Copilot App](https://devblogs.microsoft.com/devops/azure-devops-in-the-github-copilot-app/?ref=azurebrasil.cloud) - [Understanding the Standard HDD I/O unit size update and what it means for your workloads](https://techcommunity.microsoft.com/t5/azure-storage-blog/understanding-the-standard-hdd-i-o-unit-size-update-and-what-it/ba-p/4499128?ref=azurebrasil.cloud) - [Stop restricting the agent. Start restricting its environment.](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/stop-restricting-the-agent-start-restricting-its-environment/ba-p/4548726?ref=azurebrasil.cloud) - [Grok 4.6 comes to Microsoft Foundry Models: Built for long-horizon reasoning and complex workflows](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/grok-4-6-comes-to-microsoft-foundry-models-built-for-long/ba-p/4547578?ref=azurebrasil.cloud) - [Retirement of Microsoft HPC Pack](https://techcommunity.microsoft.com/t5/azure-high-performance-computing/retirement-of-microsoft-hpc-pack/ba-p/4550183?ref=azurebrasil.cloud) - [I Need My CI/CD Pipeline to Access Cosmos DB Without Using a Secret](https://devblogs.microsoft.com/cosmosdb/i-need-my-ci-cd-pipeline-to-access-cosmos-db-without-using-a-secret/?ref=azurebrasil.cloud) - [The Visual Studio Debugger Agentic Workflow Gets a Test-Driven Upgrade](https://devblogs.microsoft.com/visualstudio/the-visual-studio-debugger-agentic-workflow-gets-a-test-driven-upgrade/?ref=azurebrasil.cloud) - [Azure DNS + Traffic Manager linked records](https://techcommunity.microsoft.com/t5/azure-networking-blog/azure-dns-traffic-manager-linked-records/ba-p/4548221?ref=azurebrasil.cloud) - [Copilot Code Reviews for Azure Repos (public preview)](https://devblogs.microsoft.com/devops/copilot-code-reviews-for-azure-repos-public-preview/?ref=azurebrasil.cloud) - [Maia 200: Software-defined dataflow and all-Ethernet networking for efficient inference on Azure](https://techcommunity.microsoft.com/t5/azure-infrastructure-blog/maia-200-software-defined-dataflow-and-all-ethernet-networking/ba-p/4548198?ref=azurebrasil.cloud) - [New Azure SQL Foundations video series with GitHub samples](https://devblogs.microsoft.com/azure-sql/new-azure-sql-foundations-video-series-with-github-samples/?ref=azurebrasil.cloud) - [Microsoft is headed to VMware Explore 2026 in Las Vegas](https://techcommunity.microsoft.com/t5/azure-migration-and/microsoft-is-headed-to-vmware-explore-2026-in-las-vegas/ba-p/4541643?ref=azurebrasil.cloud) - [Cost Management with Azure Resource Manager MCP](https://techcommunity.microsoft.com/t5/finops-blog/cost-management-with-azure-resource-manager-mcp/ba-p/4550182?ref=azurebrasil.cloud) - [Tracking Batch node state and duration in Log Analytics](https://techcommunity.microsoft.com/t5/azure-paas-blog/tracking-batch-node-state-and-duration-in-log-analytics/ba-p/4547582?ref=azurebrasil.cloud) - [The Complete Guide to Azure Databricks Cost Optimization](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/the-complete-guide-to-azure-databricks-cost-optimization/ba-p/4550132?ref=azurebrasil.cloud) - [Azure Copilot Introduces Direct Access to Agents](https://techcommunity.microsoft.com/t5/azure-infrastructure-blog/azure-copilot-introduces-direct-access-to-agents/ba-p/4547932?ref=azurebrasil.cloud) - [Start here: Azure SQL Foundations series](https://devblogs.microsoft.com/blog/start-here-azure-sql-foundations-series/?ref=azurebrasil.cloud) - [Visual Studio August Update — Work Smarter Across Models and Branches](https://devblogs.microsoft.com/visualstudio/visual-studio-august-update-work-smarter-across-models-and-branches/?ref=azurebrasil.cloud) - [Azure SRE Agent: Introducing Live Reports](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/azure-sre-agent-introducing-live-reports/ba-p/4549732?ref=azurebrasil.cloud) - [Azure SRE Agent VNet integration is now generally available](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/azure-sre-agent-vnet-integration-is-now-generally-available/ba-p/4549774?ref=azurebrasil.cloud) - [Try Azure SRE Agent with no always-on charges](https://devblogs.microsoft.com/blog/try-azure-sre-agent-with-no-always-on-charges/?ref=azurebrasil.cloud) - [Consume Dataverse MCP server in Microsoft Foundry-Bringing business data to AI Agents](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/consume-dataverse-mcp-server-in-microsoft-foundry-bringing/ba-p/4548218?ref=azurebrasil.cloud) - [PowerToys 0.101 is here: Window Hopper, Insider updates, and Command Palette compact mode](https://devblogs.microsoft.com/commandline/powertoys-0-101-is-here-window-hopper-insider-updates-and-command-palette-compact-mode/?ref=azurebrasil.cloud) - [Unlocking the Power of AI for Every Developer in Visual Studio with Bring your Own Model](https://devblogs.microsoft.com/visualstudio/unlocking-the-power-of-ai-for-every-developer-in-visual-studio-with-bring-your-own-model/?ref=azurebrasil.cloud) - [Benchmark Retrieval Patterns for Copilot Studio and Foundry IQ](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/benchmark-retrieval-patterns-for-copilot-studio-and-foundry-iq/ba-p/4547920?ref=azurebrasil.cloud) - [Unified AI Defense: Security Copilot, Project Perception, and MDASH](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/unified-ai-defense-security-copilot-project-perception-and-mdash/ba-p/4547124?ref=azurebrasil.cloud) - [Powering Memory in Foundry Agent Service, with Azure Cosmos DB](https://devblogs.microsoft.com/cosmosdb/powering-memory-in-foundry-agent-service-with-azure-cosmos-db/?ref=azurebrasil.cloud) - [Enabling A2A endpoint and Agent Card for a Hosted Agent](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/enabling-a2a-endpoint-and-agent-card-for-a-hosted-agent/ba-p/4546979?ref=azurebrasil.cloud) - [Now in public preview: Azure Virtual Desktop regional host pools](https://techcommunity.microsoft.com/t5/azure-virtual-desktop-blog/now-in-public-preview-azure-virtual-desktop-regional-host-pools/ba-p/4474598?ref=azurebrasil.cloud) - [Building Production-Ready AI Agents in Microsoft Foundry: 10 Lessons Learned](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/building-production-ready-ai-agents-in-microsoft-foundry-10/ba-p/4544174?ref=azurebrasil.cloud) ### GitHub Updates - [OpenClaw went viral. Meet the maintainers building and securing it.](https://github.blog/open-source/maintainers/openclaw-went-viral-meet-the-maintainers-building-and-securing-it/?ref=azurebrasil.cloud) - [GitHub Copilot app for Beginners: Automate Dependabot pull request triage](https://github.blog/ai-and-ml/github-copilot/github-copilot-app-for-beginners-automate-dependabot-pull-request-triage/?ref=azurebrasil.cloud) - [How to evaluate LLMs before production](https://github.blog/ai-and-ml/llms/how-to-evaluate-llms-before-production/?ref=azurebrasil.cloud) - [Your alt text passes automated checks. That doesn’t mean it’s any good.](https://github.blog/engineering/user-experience/your-alt-text-passes-automated-checks-that-doesnt-mean-its-any-good/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Seu primeiro Agente de IA Corporativo no Microsoft Teams](https://www.azurebrasil.cloud/blog/seu-primeiro-agente-de-ia-corporativo-no-microsoft-teams/) - [Sua empresa está usando mais IA do que consegue controlar?](https://www.azurebrasil.cloud/blog/sua-empresa-esta-usando-mais-ia-do-que-consegue-controlar/) - [AzureBrasil Newsletter - 2026-08-24](https://www.azurebrasil.cloud/blog/azurebrasil-newsletter-2026-08-24/) ### Seu primeiro Agente de IA Corporativo no Microsoft Teams URL: https://www.azurebrasil.cloud/blog/seu-primeiro-agente-de-ia-corporativo-no-microsoft-teams/ Last updated: 2026-08-27T14:58:19.000Z A inteligência artificial já deixou de ser apenas uma tecnologia experimental e começa a ocupar um espaço cada vez mais estratégico dentro das empresas. O desafio agora é transformar essa capacidade em soluções que realmente ajudem os colaboradores no dia a dia, com acesso ao contexto e às informações da própria organização. Uma das formas de fazer isso é por meio de agentes de IA corporativos. Eles podem ser configurados para consultar bases de conhecimento internas, responder dúvidas, orientar colaboradores e automatizar tarefas, tudo dentro das ferramentas que as equipes já utilizam. Neste conteúdo, mostramos na prática como criar um Assistente de RH utilizando o Microsoft Foundry e disponibilizá-lo diretamente no Microsoft Teams. A partir de uma base de conhecimento interna, o agente é preparado para responder às dúvidas dos colaboradores e funcionar como um ponto de acesso inteligente às informações da empresa. Além da criação do agente, também mostramos etapas importantes para levar essa solução do experimento para um cenário real de uso, incluindo conhecimento, publicação, permissões, personalização e gerenciamento de versões. Quer entender como criar seu primeiro agente de IA corporativo e colocá-lo para funcionar dentro do Microsoft Teams? Assista ao vídeo completo abaixo. [Publicar agentes no Microsoft 365 Copilot e no Microsoft Teams - Microsoft FoundryPublique um agente do Microsoft Foundry no Microsoft 365 Copilot e no Microsoft Teams no portal do Foundry.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-9aa2b0ab-ec87-4c78-8eaa-e350a82b9f5d.ico)Microsoft Learnaahill![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/open-graph-image-ef2e21b0-53e8-4458-9a37-e6d90984e4f4.png)](https://learn.microsoft.com/pt-br/azure/foundry/agents/how-to/publish-copilot?tabs=portal&ref=azurebrasil.cloud) ### Sua empresa está usando mais IA do que consegue controlar? URL: https://www.azurebrasil.cloud/blog/sua-empresa-esta-usando-mais-ia-do-que-consegue-controlar/ Last updated: 2026-08-26T13:45:30.000Z A discussão sobre Inteligência Artificial dentro das empresas mudou. Até pouco tempo, a principal dúvida era se valia a pena começar a usar IA. Hoje, essa pergunta já perdeu boa parte da relevância. A tecnologia já está sendo utilizada em diferentes áreas, funcionários estão recorrendo a ferramentas de IA no trabalho e empresas estão começando a colocar agentes para executar tarefas. O problema agora é outro: **a empresa está preparada para acompanhar tudo isso?** Os dados mais recentes mostram que nem sempre. IBM 2026 Tech Leader Study ## A IA está avançando mais rápido que o controle Dados globais com 2.000 líderes de tecnologia Áreas da empresa implantam tecnologia mais rápido do que a TI consegue acompanhar 70% CIOs e CTOs são responsabilizados por sistemas de IA que não controlam completamente ⅔ Estão completamente preparados para a escala esperada de implantação de agentes de IA nos próximos 12 meses 11% Fonte: IBM Institute for Business Value, 2026\. \`\`\` Em junho de 2026, a IBM publicou um estudo global com 2 mil CIOs e CTOs que revela um cenário cada vez mais difícil para as áreas de tecnologia. O dado mais expressivo é que 70% dos líderes entrevistados afirmam que diferentes áreas de suas próprias empresas estão adotando novas tecnologias em uma velocidade maior do que a capacidade da TI de acompanhar, integrar e governar essas iniciativas. O estudo também mostra que dois terços dos CIOs e CTOs são responsabilizados por sistemas de inteligência artificial que não controlam completamente. Na prática, a liderança de tecnologia precisa responder por soluções que muitas vezes foram escolhidas, implementadas ou utilizadas fora de sua estrutura direta de governança. E há um terceiro dado que torna esse cenário ainda mais preocupante: apenas 11% dos entrevistados dizem estar completamente preparados para a escala de implantação de agentes de IA esperada nos próximos 12 meses. A questão, portanto, já não é saber se a tecnologia está disponível. Ela está. O verdadeiro desafio é entender se a estrutura da empresa, seus processos e seus mecanismos de governança conseguem acompanhar a velocidade com que essas tecnologias estão sendo adotadas. Porque, quando a inovação avança mais rápido do que a capacidade de controle, o risco não está apenas em ficar para trás. Está em transformar a adoção de novas tecnologias em um problema de segurança, custos, conformidade e responsabilidade para toda a organização. O problema não é falta de adoção + A velocidade dessa mudança fica ainda mais clara quando olhamos para o avanço dos projetos de IA. Segundo a Deloitte, o acesso dos trabalhadores a ferramentas de IA aumentou **50% em 2025**, e a expectativa é que dobre, em apenas seis meses, o número de organizações nas quais pelo menos 40% dos projetos de IA estejam em produção. Isso significa que estamos deixando para trás a fase em que as empresas simplesmente testavam ferramentas. A IA está entrando na operação. E existe uma diferença enorme entre fazer um piloto com algumas pessoas e colocar inteligência artificial para interagir com dados corporativos, processos, sistemas e clientes. Quanto mais a IA entra na operação, maior passa a ser a responsabilidade sobre aquilo que acontece ao redor dela. ## A adoção está muito à frente da governança Um estudo de 2026 da Credo AI encontrou uma diferença particularmente relevante: **60% das empresas pesquisadas já estavam escalando IA, mas apenas 4% apresentavam maturidade de governança suficiente para acompanhar essa escala**. É uma diferença difícil de ignorar. Imagine uma empresa aumentando rapidamente a utilização de IA sem ter, na mesma velocidade, clareza sobre quem pode usar determinada ferramenta, quais dados podem ser acessados, quais agentes estão ativos, quem responde por eles e como os resultados serão acompanhados. A tecnologia cresce. A estrutura de controle fica para trás. E esse talvez seja um dos principais desafios da IA empresarial em 2026: **a velocidade da adoção não garante maturidade para a escala.** State of AI Governance 2026 ## A adoção de IA está muito à frente da governança Escalar tecnologia não significa estar preparado para governá-la 60% Empresas já estão escalando IA 4% Possuem maturidade de governança suficiente Fonte: Credo AI, State of AI Governance 2026\. AI GOVERNANCE · 2026 ## Antes da governança, vem a visibilidade Antes de discutir governança, a empresa precisa saber o que está acontecendo dentro dela. Seus funcionários estão usando ferramentas de IA não autorizadas? Um estudo de 2026 da AvePoint, em parceria com a Osterman Research, mostra que a capacidade das organizações de identificar esse tipo de uso está ficando para trás. 17,6% das organizações não conseguem identificar o uso de IA não autorizada O índice quase triplicou, saindo de **6,3%** para **17,6%**. 21,1% não conseguem contabilizar agentes de IA não autorizados Quando entram em cena agentes de IA, a visibilidade fica ainda mais difícil. AI A IA alterou a dinâmica do software corporativo. A adoção pode acontecer antes mesmo de a TI saber que ela aconteceu. COMO NASCE O SHADOW AI 01 Acessa uma IA 02 Usa uma conta pessoal 03 Insere dados corporativos 04 Obtém uma resposta O PONTO CEGO A TI pode nem saber que isso aconteceu. SHADOW AI O problema não está apenas na ferramenta utilizada, mas na falta de visibilidade sobre os dados compartilhados, os riscos envolvidos e o impacto para a segurança e a conformidade. Não é possível proteger aquilo que a empresa não consegue enxergar. Fonte: AvePoint e Osterman Research, estudo de 2026\. # A IA já está entrando na equação dos ataques Uma em cada quatro violações maliciosas foi favorecida por recursos de inteligência artificial, segundo o *Cost of a Data Breach Report 2026*, da IBM. O número representa um aumento de 56% em relação ao ano anterior. Por outro lado, organizações que utilizam amplamente automação e ferramentas inteligentes em suas operações de segurança economizaram, em média, US$ 1,93 milhão por violação. A questão, portanto, não é apenas o risco associado à tecnologia, mas a forma como ela é implementada. O mesmo recurso que amplia a capacidade dos ataques também pode tornar a defesa mais eficiente. NA PRÓXIMA ## Antes da próxima licença, analise o ambiente A IA já entrou nas empresas. Agora, o desafio é garantir que dados, identidades, acessos, segurança e processos estejam preparados para seu uso seguro e sustentável. Na AzureBrasil.cloud, a gente não acredita em simplesmente empurrar mais tecnologia para dentro das empresas. O objetivo é ajudar as organizações a desenvolver a maturidade necessária para utilizar a tecnologia de forma segura, consciente e capaz de gerar resultado. ✓ **Primeiro, entender o ambiente.** Depois, identificar riscos, oportunidades e o que precisa estar preparado para a próxima etapa. Porque adotar IA é fácil. Estar preparado para usá-la bem é outra história. AzureBrasil.cloud ### Dicas & Sugestões - O inline do GitHub Copilot: como acelerar seu fluxo de código direto no editor URL: https://www.azurebrasil.cloud/blog/dica-sugestoes-o-inline-do-github-copilot-como-acelerar-seu-fluxo-de-codigo-direto-no-editor/ Last updated: 2026-09-04T14:59:55.000Z [GitHub Copilot](https://docs.github.com/en/copilot/get-started/what-is-github-copilot?ref=azurebrasil.cloud) é o assistente de IA da GitHub que se integra diretamente à sua IDE para acelerar a escrita de código. Dentro do editor, ele oferece dois modos principais de interação: o modo inline, embutido no fluxo de edição e nos menus de contexto, e a interface de chat, com opções mais amplas de conversa e acesso ao Agent Mode. Este artigo foca no modo inline, mostrando como o GitHub Copilot sugere código enquanto você digita, como pedir alternativas, como usar comentários para guiar ou questionar a IA, e como acionar recursos de revisão de código diretamente pelo VS Code ([Inline suggestions from GitHub Copilot in VS Code](https://code.visualstudio.com/docs/editing/ai-powered-suggestions?ref=azurebrasil.cloud)). Ao editar qualquer arquivo com o GitHub Copilot ativo, o primeiro sinal da sua presença costuma ser um lembrete inline para abrir o GitHub Copilot Chat pelo atalho Meta-I. Esse lembrete aparece sempre que você começa a editar um arquivo, mas pode ser ignorado sem problema, bastando continuar digitando normalmente. Suponha que você crie um arquivo isPrime.js dentro de um projeto [Vue.js](https://vuejs.org/guide/introduction.html?ref=azurebrasil.cloud) para verificar se um número é primo. Ao digitar a assinatura da função, o GitHub Copilot já começa a sugerir um corpo completo: ```javascript export function isPrime(n) { if (n < 2) return false for (let i = 2; i <= Math.sqrt(n); i++) { if (n % i === 0) return false } return true } ``` O texto sugerido aparece como ghost text, exibido em itálico e com fonte mais clara até ser aceito. Uma barra cinza no topo da sugestão traz os controles para aceitar o trecho inteiro com Tab, aceitar apenas uma palavra por vez, ou alternar entre múltiplas opções quando o GitHub Copilot gera mais de uma. Um indicador como < 1/2 > mostra quantas alternativas existem e qual delas está em exibição; para navegar entre elas, basta usar as setas da barra ou os atalhos de teclado correspondentes. Depois de aceita, a sugestão deixa de ter aparência de fantasma e passa a se comportar como qualquer texto digitado manualmente. O fluxo típico de trabalho passa a ser: aceitar ou descartar a sugestão, digitar código adicional quando necessário, aguardar um instante para o GitHub Copilot processar o contexto e gerar novas opções, e repetir esse ciclo até finalizar a tarefa. Vale lembrar que, por se tratar de IA generativa, repetir o mesmo exercício não garante receber as mesmas sugestões nem a mesma quantidade de alternativas. Quando as sugestões inline não parecem suficientes, o atalho Ctrl+Enter abre um painel somente leitura com uma lista mais ampla de conclusões alternativas. Esse recurso funciona melhor antes de aceitar qualquer sugestão, já que gera resultados mais completos quando o contexto ainda está em aberto. Aplicado sobre código já escrito, o resultado tende a ser mais parcial, por isso selecionar o trecho relevante antes de acionar o painel ajuda o GitHub Copilot a entender o que você espera. Comentários também constroem contexto para o GitHub Copilot, seja de forma passiva, como documentação comum, seja de forma ativa, como instrução direta. Um comentário como o abaixo, sozinho em um arquivo novo, já é suficiente para o GitHub Copilot propor uma implementação completa: ```javascript // criar uma função para determinar se um número é primo export function isPrime(n) { if (n < 2) return false for (let i = 2; i <= Math.sqrt(n); i++) { if (n % i === 0) return false } return true } ``` Nesse cenário, o GitHub Copilot costuma oferecer duas alternativas quando ainda não há contexto suficiente: continuar o comentário ou já propor a assinatura da função. Assim que uma delas é aceita, o contexto se torna claro o bastante para que a definição completa seja sugerida em seguida. Comentários também servem para pedir explicações. Um comentário como // explain the code above leva o GitHub Copilot a gerar linhas de comentário explicando o funcionamento do trecho acima, enquanto uma variação como // explique o código acima linha por linha produz uma explicação mais detalhada, linha a linha. O mesmo mecanismo permite fazer perguntas diretas, como // O que o código acima faz?, opcionalmente marcadas com o prefixo q: para deixar explícito que se trata de uma pergunta, ao que o GitHub Copilot responde com um comentário iniciado por a:. Historicamente essa era uma forma de obter respostas parecidas com um chat antes da existência do [GitHub Copilot Chat](https://docs.github.com/en/copilot/how-tos/chat-with-copilot/chat-in-ide?ref=azurebrasil.cloud) integrado ao editor, e ainda é útil quando você quer uma resposta curta embutida no próprio código. Além das sugestões no editor, o GitHub Copilot também se integra aos menus de contexto da IDE. Quando uma definição de função está incompleta, um ícone de sparkle aparece ao lado da linha, e clicar nele abre um menu com opções avançadas, incluindo corrigir o código usando o GitHub Copilot como alternativa para obter uma conclusão. As opções variam conforme o contexto: no terminal, por exemplo, a opção Explicar se refere ao conteúdo exibido ali, não ao editor. Todos esses comandos também ficam acessíveis pela Paleta de Comandos (Meta-P ou F1), bastando digitar GitHub Copilot para listar as ações disponíveis, incluindo a execução direta da função de explicação. Outra tarefa que o GithHub Copilot resolve pelo menu de contexto é a revisão de código. Considere o seguinte composable, criado para um projeto Vue.js e destinado a representar um ponto em três dimensões: ```javascript import { reactive } from 'vue' export function usePoint(x, y, z = 0) { const state = reactive({ x, y }) function distance(other) { return (state.x - other.x) ** 2 + (state.y - other.y) ** 2 + (state.z - other.z) ** 2 ** 0.5 } return { state, distance } } const p1 = usePoint(1, 2) const p2 = usePoint(4, 6, 0) console.log(p1.distance(p2.state)) ``` usePoint() - Recebe x, y e um z opcional, mas o objeto reactive nunca inclui z, o que faz state.z simplesmente não existir na instância. distance() - Calcula a distância entre dois pontos, mas a expressão está com precedência de operadores incorreta e nunca aplica a raiz quadrada ao resultado final, além de depender de state.z, que não foi definido. Selecionando esse trecho, clicando com o botão direito e escolhendo GitHub Copilot, Review and Comment, o GitHub Copilot analisa o código e retorna comentários e alterações sugeridas em formato de diff, com o código atual em vermelho, precedido de menos, e o código sugerido em verde, precedido de mais. Uma caixa de diálogo permite navegar entre os comentários, aplicar ou descartar cada sugestão individualmente e seguir para o próximo item da revisão. Por padrão, o GitHub Copilot só reporta problemas que considera realmente significativos, então é comum receber a mensagem de que nenhum problema foi encontrado mesmo quando existem violações de estilo ou boas práticas que outro revisor apontaria. Para obter um feedback mais rigoroso, é possível fornecer instruções de [revisão **personalizadas**](https://docs.github.com/en/copilot/tutorials/customize-code-review?ref=azurebrasil.cloud)diretamente no settings.json, na configuração github.copilot.chat.reviewSelection.instructions: ```javascript "github.copilot.chat.reviewSelection.instructions": [ { "text": "Certifique-se de que todas as funções exportadas tenham comentários JSDoc adequados" } ] ``` Depois de salvar essa regra, uma nova revisão do mesmo código passa a considerar também esse critério. Como alternativa, é possível manter até cinco regras em um arquivo Markdown salvo em .github/copilot-review-guidelines.md, que o GitHub Copilot localiza e aplica automaticamente, ou apontar para um arquivo Markdown em qualquer diretório do projeto usando a propriedade file: ```javascript "github.copilot.chat.reviewSelection.instructions": [ { "file": "./docs/review-guide.md" } ] ``` Nesse segundo caso, o arquivo docs/review-guide.md conteria simplesmente o texto da regra desejada, como garantir que todas as funções exportadas tenham comentários JSDoc adequados. O mesmo ícone de sparkle aparece ainda no painel de controle de versão, ao final do campo de mensagem de commit, permitindo que o GitHub Copilot sugira uma mensagem com base nas alterações em vez de você escrevê-la manualmente. Por fim, o GitHub Copilot expõe vários controles de configuração direto na IDE. Na barra de status, um clique no ícone do GitHub Copilot permite desativar rapidamente as sugestões de preenchimento para todos os arquivos ou apenas para a linguagem ativa no momento, como JavaScript ou Vue, o que é útil quando as sugestões atrapalham um trabalho que exige digitação rápida e concentrada. No ícone do GitHub Copilot na parte superior da IDE, a opção Configure Code Completions reúne outras três ações relevantes: abrir o painel de sugestões alternativas (o mesmo comportamento do atalho Ctrl+Enter), trocar o modelo usado para as sugestões de código sem afetar o modelo do chat, e ativar ou desativar as sugestões de preenchimento. A partir dali, Edit Settings leva direto às configurações do GitHub Copilot, onde também aparecem opções marcadas como Preview, mais próximas de um lançamento oficial e abertas a testes públicos, e opções Experimental, em estágio inicial e sujeitas a mudanças significativas antes de chegarem à produção. Com o domínio das sugestões inline, dos comentários como contexto e diretriz, e da revisão de código pelo menu de contexto, você já tem a base para acelerar boa parte do trabalho do dia a dia com o GitHub Copilot direto no editor em projetos Vue.js. Links e Docs: [What is GitHub Copilot? - GitHub DocsLearn what Copilot is and what you can do with it.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-4eeefee0-5baa-4e9f-adc2-52cc6e855297.png)GitHub Docs![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/copilot-616dad26-674a-46f0-8332-4d9a03a0d2bb.png)](https://docs.github.com/en/copilot/get-started/what-is-github-copilot?ref=azurebrasil.cloud) [Inline suggestions from GitHub Copilot in VS CodeGet AI-powered inline suggestions from GitHub Copilot in VS Code, including ghost text completions and next edit suggestions.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-d530a453-7ae1-4b2c-8fa3-db233f12ced1.ico)MicrosoftMicrosoft![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/ai-powered-suggestions-510a04e4-9cfd-448e-ab88-a75f9000c2d6.webp)](https://code.visualstudio.com/docs/editing/ai-powered-suggestions?ref=azurebrasil.cloud) [Vue.jsVue.js - The Progressive JavaScript Framework![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/logo-2dcf5f37-2d8d-4749-a3c9-ef1261c923b0.png)Vue Mastery Logo![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/logo-9216041a-03c4-43d5-9240-9d3412b9da1a.png)](https://vuejs.org/guide/introduction.html?ref=azurebrasil.cloud) [Asking GitHub Copilot questions in your IDE - GitHub DocsUse Copilot Chat in your editor to give you code suggestions, explain code, generate unit tests, and suggest code fixes.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-1eb8f28e-17fe-414a-8f21-76d839850184.png)GitHub Docs![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/copilot-fa557fd9-25c7-4f85-82b4-23c3c3576730.png)](https://docs.github.com/en/copilot/how-tos/chat-with-copilot/chat-in-ide?ref=azurebrasil.cloud) [Using custom instructions to unlock the power of Copilot code review - GitHub DocsLearn how to write effective custom instructions that help GitHub Copilot provide more relevant and actionable code reviews.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-1882a9b7-278d-4d9e-9817-85397a038e23.png)GitHub Docs![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/copilot-e8bdb789-2936-47a9-97b2-f83ad77b5608.png)](https://docs.github.com/en/copilot/tutorials/customize-code-review?ref=azurebrasil.cloud) Até a próxima e não esquece de me seguir no [LinkedIn](https://www.linkedin.com/in/flpfaria/?ref=azurebrasil.cloud)! Grande abraço!!! ### AzureBrasil Newsletter - 2026-08-24 URL: https://www.azurebrasil.cloud/blog/azurebrasil-newsletter-2026-08-24/ Last updated: 2026-08-24T20:09:41.000Z ### Azure Updates - [Enabling the Compliance Security Profile (CSP) for HIPAA on Azure Databricks](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/enabling-the-compliance-security-profile-csp-for-hipaa-on-azure/ba-p/4541578?ref=azurebrasil.cloud) - [Expanding Open Model Choice in Microsoft Foundry with New DeepSeek and NVIDIA Nemotron Models](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/expanding-open-model-choice-in-microsoft-foundry-with-new/ba-p/4547926?ref=azurebrasil.cloud) - [Model router updates: new regions, a refreshed model pool, and understanding the hill climb](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/model-router-updates-new-regions-a-refreshed-model-pool-and/ba-p/4521310?ref=azurebrasil.cloud) - [Today I will… Modernize a .NET application](https://devblogs.microsoft.com/visualstudio/today-i-will-modernize-a-net-application/?ref=azurebrasil.cloud) - [Stop restricting the agent. Start restricting its environment.](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/stop-restricting-the-agent-start-restricting-its-environment/ba-p/4548726?ref=azurebrasil.cloud) - [Azure Managed Redis Deployment Automation](https://techcommunity.microsoft.com/t5/azure-paas-blog/azure-managed-redis-deployment-automation/ba-p/4547874?ref=azurebrasil.cloud) - [Announcing Azure Web PubSub chat in public preview](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/announcing-azure-web-pubsub-chat-in-public-preview/ba-p/4548907?ref=azurebrasil.cloud) - [Browser automation with Pydantic-AI + Playwright](https://techcommunity.microsoft.com/t5/microsoft-developer-community/browser-automation-with-pydantic-ai-playwright/ba-p/4547971?ref=azurebrasil.cloud) - [Give your Copilot agents real tools, without hand-wiring MCP](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/give-your-copilot-agents-real-tools-without-hand-wiring-mcp/ba-p/4548254?ref=azurebrasil.cloud) - [Build a SAFE Agent on Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/build-a-safe-agent-on-microsoft-foundry/ba-p/4547570?ref=azurebrasil.cloud) - [From Detection to Action: Extending Azure Monitor Issues with Action Groups](https://techcommunity.microsoft.com/t5/azure-observability-blog/from-detection-to-action-extending-azure-monitor-issues-with/ba-p/4548416?ref=azurebrasil.cloud) - [Voice Live and Observability for Production Agent Systems Part 5/5](https://techcommunity.microsoft.com/t5/microsoft-developer-community/voice-live-and-observability-for-production-agent-systems-part-5/ba-p/4541922?ref=azurebrasil.cloud) - [Who Ordered All These Tokens? Giving AI Spend a Name in FOCUS](https://techcommunity.microsoft.com/t5/finops-blog/who-ordered-all-these-tokens-giving-ai-spend-a-name-in-focus/ba-p/4547978?ref=azurebrasil.cloud) - [Choosing the Right Agent in Microsoft Foundry](https://techcommunity.microsoft.com/t5/azure-architecture-blog/choosing-the-right-agent-in-microsoft-foundry/ba-p/4547827?ref=azurebrasil.cloud) - [Outgrowing SQL Server Express? Upgrade to Azure SQL Database Free Tier in 3 Steps](https://devblogs.microsoft.com/azure-sql/upgrade-from-sql-server-express-to-azure-sql-database/?ref=azurebrasil.cloud) - [MSSQL Extension for VS Code: SQL Formatter, Azure SQL Database Provisioning, and More](https://devblogs.microsoft.com/azure-sql/vscode-mssql-august2026/?ref=azurebrasil.cloud) - [Announcing General Availability of Disable Multithreading and Configurable Constrained Cores](https://techcommunity.microsoft.com/t5/azure-compute-blog/announcing-general-availability-of-disable-multithreading-and/ba-p/4547908?ref=azurebrasil.cloud) - [Announcing public preview: Markdown for Agents in Azure App Service](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/announcing-public-preview-markdown-for-agents-in-azure-app/ba-p/4537023?ref=azurebrasil.cloud) - [What the New API Management AI Gateway Tier Changes for App Service-Hosted Agents](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/what-the-new-api-management-ai-gateway-tier-changes-for-app/ba-p/4543974?ref=azurebrasil.cloud) - [Building a Fully Automated Azure Landing Zone Deployment Using Azure DevOps and Terraform](https://techcommunity.microsoft.com/t5/azure-tools-blog/building-a-fully-automated-azure-landing-zone-deployment-using/ba-p/4547956?ref=azurebrasil.cloud) - [Understanding GitHub Billing and management: from licenses to fair AI credit controls](https://techcommunity.microsoft.com/t5/microsoft-developer-community/understanding-github-billing-and-management-from-licenses-to/ba-p/4546416?ref=azurebrasil.cloud) - [Aspire 13.5: Fresh pixels and better workflows](https://devblogs.microsoft.com/aspire/whats-new-aspire-13-5/?ref=azurebrasil.cloud) - [Azure Copilot Introduces Direct Access to Agents](https://techcommunity.microsoft.com/t5/azure-infrastructure-blog/azure-copilot-introduces-direct-access-to-agents/ba-p/4547932?ref=azurebrasil.cloud) - [Azure Cosmos DB in the Agentic Era: Data Tools for Developers and AI Agents](https://devblogs.microsoft.com/cosmosdb/azure-cosmos-db-in-the-agentic-era-data-tools-for-developers-and-ai-agents/?ref=azurebrasil.cloud) - [Power Azure SRE Agent with the tools it needs](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/power-azure-sre-agent-with-the-tools-it-needs/ba-p/4547882?ref=azurebrasil.cloud) - [Active Directory Domain Services modules on Microsoft Learn](https://techcommunity.microsoft.com/t5/itops-talk-blog/active-directory-domain-services-modules-on-microsoft-learn/ba-p/4547604?ref=azurebrasil.cloud) - [The Two Hybrid Searches in Microsoft SQL](https://devblogs.microsoft.com/azure-sql/two-hybrid-search/?ref=azurebrasil.cloud) - [Smarter signals, broader coverage: UEBA anomalies on top of Behaviors layer and new data sources](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/smarter-signals-broader-coverage-ueba-anomalies-on-top-of/ba-p/4544384?ref=azurebrasil.cloud) - [What’s new for small form factor infrastructure](https://techcommunity.microsoft.com/t5/azure-arc-blog/what-s-new-for-small-form-factor-infrastructure/ba-p/4520901?ref=azurebrasil.cloud) - [Azure DNS introduces Traffic Manager linked records (Public Preview)](https://techcommunity.microsoft.com/t5/azure-networking-blog/azure-dns-introduces-traffic-manager-linked-records-public/ba-p/4547112?ref=azurebrasil.cloud) - [Episode 1: Onboarding Azure Arc at Scale | The Azure Arc Check-In](https://techcommunity.microsoft.com/t5/azure-arc-blog/episode-1-onboarding-azure-arc-at-scale-the-azure-arc-check-in/ba-p/4546441?ref=azurebrasil.cloud) - [\[Now Generally Available\] What-If for Azure Deployment Stacks](https://techcommunity.microsoft.com/t5/azure-governance-and-management/now-generally-available-what-if-for-azure-deployment-stacks/ba-p/4547614?ref=azurebrasil.cloud) - [Announcing General Availability of Managed Instance on Azure App Service](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/announcing-general-availability-of-managed-instance-on-azure-app/ba-p/4541283?ref=azurebrasil.cloud) - [Apple Silicon and Xcode 27 images available in pay-as-you-go (preview)](https://devblogs.microsoft.com/devops/apple-silicon-and-xcode-27-images-availabile-in-pay-as-you-go-preview/?ref=azurebrasil.cloud) - [Distributing Agents to Microsoft Teams and Microsoft 365 Copilot Part 4/5](https://techcommunity.microsoft.com/t5/microsoft-developer-community/distributing-agents-to-microsoft-teams-and-microsoft-365-copilot/ba-p/4541925?ref=azurebrasil.cloud) - [Beyond Deployment: What It Really Takes to Run GitHub Actions Runners on AKS](https://techcommunity.microsoft.com/t5/azure-infrastructure-blog/beyond-deployment-what-it-really-takes-to-run-github-actions/ba-p/4547638?ref=azurebrasil.cloud) - [Why Cloud Browsers Are Becoming Enterprise Infrastructure for AI Agents and Automation](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/why-cloud-browsers-are-becoming-enterprise-infrastructure-for-ai/ba-p/4547583?ref=azurebrasil.cloud) - [From single call to agents: five new Claude capabilities now available in Microsoft Foundry](https://devblogs.microsoft.com/foundry/five-new-claude-capabilities-now-available-in-foundry/?ref=azurebrasil.cloud) ### GitHub Updates - [The August 17 outage, and the work ahead](https://github.blog/news-insights/company-news/the-august-17-outage-and-the-work-ahead/?ref=azurebrasil.cloud) - [GitHub Copilot app for Beginners: Managing your work](https://github.blog/ai-and-ml/github-copilot/github-copilot-app-for-beginners-managing-your-work/?ref=azurebrasil.cloud) - [How canvases make agentic workflows visible, steerable, and cost-efficient](https://github.blog/ai-and-ml/github-copilot/how-canvases-make-agentic-workflows-visible-steerable-and-cost-efficient/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Como Criar um Fluxo de Aprovação com IA usando Azure Logic Apps + Microsoft Teams](https://www.azurebrasil.cloud/blog/como-criar-um-fluxo-de-aprovacao-com-ia-usando-azure-logic-apps-microsoft-teams/) - [Rodando um benchmark do RTK no GitHub Copilot CLI e no Claude Code CLI](https://www.azurebrasil.cloud/blog/rodando-um-benchmark-do-rtk-no-github-copilot-cli-e-no-claude-code-cli/) - [Como Criar um App Interativo com Copilot a Partir de uma Lista do SharePoint](https://www.azurebrasil.cloud/blog/como-criar-um-app-interativo-com-copilot-a-partir-de-uma-lista-do-sharepoint/) - [Azure Newsletter - 2026-08-17](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-08-17/) ### Como Criar um Fluxo de Aprovação com IA usando Azure Logic Apps + Microsoft Teams URL: https://www.azurebrasil.cloud/blog/como-criar-um-fluxo-de-aprovacao-com-ia-usando-azure-logic-apps-microsoft-teams/ Last updated: 2026-08-21T12:30:51.000Z Processos de aprovação ainda ocupam um espaço considerável na rotina de muitas empresas. Solicitações chegam por diferentes canais, alguém precisa analisar as informações, encaminhar para a pessoa responsável, aguardar uma decisão e depois comunicar o resultado. Com Azure Logic Apps e recursos de Inteligência Artificial, é possível transformar esse processo em um fluxo muito mais organizado e automatizado. A solicitação pode ser recebida pelo Microsoft Forms, analisada por um agente de IA no Microsoft Foundry e encaminhada ao Microsoft Teams para que um responsável tome a decisão. Depois disso, o próprio fluxo trata o resultado e envia uma resposta automática ao solicitante pelo Outlook. Além de reduzir tarefas manuais, esse modelo cria um processo mais padronizado e fácil de acompanhar, podendo ser adaptado para diferentes situações, como solicitações de acesso, criação de recursos no Azure, compras, licenças e ambientes de teste. Mas como colocar tudo isso para funcionar na prática? Quer entender como essa arquitetura é construída e como cada ferramenta participa do fluxo? Então confira o vídeo completo e acompanhe o passo a passo da implementação. Links úteis: [GitHub - MateusJn/MicrosoftLogicApps: Demo criada para um video no canal da AzureBrasil mostrando um fluxo de aprovação com Microsoft Foundry e Azure Logic Apps.Demo criada para um video no canal da AzureBrasil mostrando um fluxo de aprovação com Microsoft Foundry e Azure Logic Apps. - MateusJn/MicrosoftLogicApps![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-22344510-8c8c-4220-b54f-50b5b0c69f71.png)GitHubMateusJn![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/MicrosoftLogicApps-bb4ca366-515d-4a84-a278-ef41f106e202)](https://github.com/MateusJn/MicrosoftLogicApps?ref=azurebrasil.cloud) ### Rodando um benchmark do RTK no GitHub Copilot CLI e no Claude Code CLI URL: https://www.azurebrasil.cloud/blog/rodando-um-benchmark-do-rtk-no-github-copilot-cli-e-no-claude-code-cli/ Last updated: 2026-08-19T12:27:38.000Z O [**RTK**,](https://github.com/rtk-ai/rtk?ref=azurebrasil.cloud) sigla para Rust Token Killer, é um proxy de linha de comando escrito em Rust que se posiciona entre o agente de código e o shell, reescrevendo comandos suportados para que a saída retorne comprimida antes de entrar no contexto do modelo. A promessa central é reduzir o volume de tokens gastos com output de terminal, e o próprio projeto expõe isso através do comando **rtk gain**, que mostra um percentual de economia sobre os comandos interceptados. Este artigo documenta, com bastante detalhe de metodologia, um benchmark que rodamos comparando o GitHub Copilot CLI e o Claude Code CLI, com e sem o RTK habilitado, para responder a uma pergunta específica, o percentual de gain que o RTK reporta se traduz na mesma proporção em economia de créditos ou dólares na fatura final do agente. Adiantamos o resultado, não se traduz, e o resto do texto explica por quê, com todos os números que coletamos. Vale um aviso logo de início, isto é um teste prático pequeno, feito em um único repositório, com uma amostra de vinte execuções, e dentro do meu MacBook Air. Não é um estudo estatístico e não deve ser lido como fonte da verdade sobre o RTK, é uma demonstração de um ponto conceitual específico, apoiada em dados reais. Antes de entrar nos números, vale entender como o RTK funciona por baixo do capô, porque isso explica boa parte do resultado. O [mecanismo de interceptação](https://github.com/rtk-ai/rtk?ref=azurebrasil.cloud#how-it-works?wt.mc%5Fid=MVP%5F407589) funciona através de um [**PreToolUse hook**,](https://github.com/rtk-ai/rtk?ref=azurebrasil.cloud) ([doc do GitHub Copilot](https://docs.github.com/en/copilot/how-tos/copilot-sdk/hooks/pre-tool-use?ref=azurebrasil.cloud)) que intercepta a chamada de ferramenta do agente antes da execução, reescreve o comando para sua versão **rtk,** executa esse comando reescrito e devolve ao modelo apenas a saída filtrada e compactada. O RTK não usa o tokenizer real de nenhum provider para estimar economia, ele calcula tokens estimados dividindo o número de bytes de saída por quatro, e "tokens economizados" é simplesmente a diferença entre a estimativa de tokens da saída bruta e da saída filtrada. Essa é uma limitação relevante, os números absolutos do [rtk gain](https://github.com/rtk-ai/rtk?ref=azurebrasil.cloud#token-savings-analytics?wt.mc%5Fid=MVP%5F407589) são aproximações, não uma contagem exata de tokens do provider. Um segundo ponto estrutural do RTK, e talvez o mais importante para entender o resultado deste benchmark, é que o hook de interceptação automática atua apenas sobre chamadas Bash. Ferramentas nativas do Claude Code, como Read, Grep e Glob, não passam automaticamente pelo hook, o agente precisaria usar comandos de shell equivalentes ou invocar explicitamente **rtk read**, **rtk grep** ou **rtk find** para que essas leituras fossem comprimidas. Isso significa que qualquer chamada nativa que não siga essa convenção fica totalmente invisível ao **rtk gain**, tanto no numerador quanto no denominador da conta. Para este benchmark, instalamos o RTK globalmente na máquina (*Mac OS*), o que cobre GitHub Copilot CLI, GitHub Copilot no VS Code, Claude Code CLI, Claude Code no VS Code. A instalação seguiu o caminho recomendado via Homebrew. ```bash brew install rtk-ai/tap/rtk rtk --version ``` Com o binário instalado, cada agente precisa de um comando de inicialização próprio, já que a integração é feita através de hooks e arquivos de instrução específicos de cada ferramenta. Para habilitar o RTK no GitHub Copilot CLI e no Copilot do VS Code globalmente, usamos o seguinte comando. ```bash rtk init --global --copilot ``` E, de forma equivalente, para habilitar no Claude Code CLI e na extensão do Claude Code no VS Code. ```bash rtk init --global ``` Ambos os comandos patcham as configurações do usuário, no caso do Claude Code o arquivo **\~/.claude/settings.json** recebe o hook de **PreToolUse,** e no caso do Copilot os arquivos ficam sob **\~/.copilot**. Depois de cada **rtk init**, rodamos **rtk init --show** para confirmar que a integração estava ativa antes de começar qualquer execução. Também vale registrar que o RTK guarda o histórico de economia em um banco SQLite local, em **\~/.local/share/rtk/history.db**. O ponto mais delicado da metodologia foi evitar que dados de consumo do Copilot se misturassem com dados do Claude no histórico interno do RTK, já que o **rtk gain** acumula tudo o que foi interceptado desde o último reset. Por isso o benchmark foi sequencial e não paralelo, em quatro fases. Na primeira fase, resetamos o histórico do RTK, habilitamos a integração apenas com o Copilot e rodamos toda a bateria de testes do Copilot, sem tocar no Claude Code em nenhum momento. Ao final, salvamos os resultados do rtk gain em arquivo antes de qualquer limpeza. ```bash rtk gain > copilot/rtk-gain.txt rtk gain --all > copilot/rtk-gain-all.txt ``` Na segunda fase, desinstalamos a integração do RTK com o Copilot e resetamos o histórico novamente, com **rtk gain --reset**, garantindo que a bateria do Claude começasse do zero. Na terceira fase, habilitamos a integração com o Claude Code e rodamos toda a bateria de testes equivalente, salvando os resultados da mesma forma. Na quarta e última fase, removemos a integração do RTK com o Claude Code e apagamos o histórico final. Esse cuidado de isolamento é o que nos permite comparar o **rtk gain** de cada agente sem risco de contaminação cruzada entre os dois conjuntos de dados. Fora a parte de instalação do RTK, o desenho do benchmark em si seguiu um conjunto fixo de parâmetros para os dois agentes. Usamos o mesmo repositório em todas as vinte execuções, um projeto de porte razoável, com **2.238 arquivos** e **246.092 linhas** classificadas como código. O modelo foi o mesmo nos dois agentes, [Claude Sonnet 5](https://platform.claude.com/docs/en/about-claude/models/whats-new-sonnet-5?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), com [reasoning effort](https://platform.claude.com/docs/en/build-with-claude/effort?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) configurado como medium, e ambos rodaram em modo autopilot, o modo autônomo em que o agente executa sem pedir confirmação a cada ação. Usamos exclusivamente a versão CLI de cada ferramenta, **copilot --autopilot --yolo** de um lado e **claude --dangerously-skip-permissions** do outro, referenciando a documentação de referência da [CLI do Claude Code](https://code.claude.com/docs/en/cli-reference?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) e a visão geral do **Github copilot CLI**. O escopo das perguntas foi restrito a cem por cento codebase, sem acesso a git explícito, sem internet e sem MCPs, para isolar o consumo de leitura e escrita de código puro. Entre cada execução rodamos **/clear**, para que o consumo de tokens fosse contabilizado separadamente por tarefa, e a qualidade do código gerado não foi validada em nenhum momento, o foco era exclusivamente consumo. Definimos dois tipos de tarefa, aplicados com o mesmo prompt literal nos dois agentes. A tarefa simples pedia ao agente que explicasse a arquitetura da solução, projetos, camadas e padrões utilizados, e gravasse o resultado em um arquivo markdown na raiz do repositório. A tarefa complexa pedia um CRUD completo de uma nova entidade, atravessando a camada de domínio, aplicação, web e frontend, incluindo um novo item no menu lateral e testes para as duas primeiras camadas, com instrução explícita para usar subagentes na implementação. Cada bateria, sem RTK e com RTK, rodou três execuções da tarefa simples e duas da tarefa complexa, por agente, totalizando vinte execuções no total. É uma amostra pequena, e tratamos os números como indicação de ordem de grandeza, não como prova estatística. No GitHub Copilot CLI, a métrica nativa de consumo é o [AI Credits](https://docs.github.com/en/copilot/concepts/billing/usage-based-billing-for-individuals?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), que converte o uso de tokens do modelo em créditos cobrados pelo GitHub, segundo a **tabela oficial de modelos e preços**. Registramos o valor de créditos ao final de cada uma das cinco execuções por bateria. - **Simples 2:** 39,2 (sem RTK) → 22,9 (com RTK) => variação **−41,6%** - **Simples 3:** 37,0 (sem RTK) → 36,7 (com RTK) => variação **−0,8%** - **Média simples:** 38,27 (sem RTK) → 32,03 (com RTK) => variação **−16,3%** - **Complexa 1:** 369 (sem RTK) → 339 (com RTK) => variação **−8,1%** - **Complexa 2:** 336 (sem RTK) → 354 (com RTK) => variação **+5,4%** - **Média complexa:** 352,5 (sem RTK) → 346,5 (com RTK) => variação **−1,7%** - **Total das 5 execuções:** 819,8 (sem RTK) → 789,1 (com RTK) => variação **−3,7%** O gain agregado de 3,7% esconde um detalhe importante, quase toda a redução observada nas tarefas simples veio de uma única execução, a segunda, que caiu para 22,9 créditos enquanto as outras duas ficaram na casa dos 36 a 37 créditos nas duas baterias. Excluindo esse ponto fora da curva das duas baterias, sem RTK e com RTK, a média das simples cai para 37,8 contra 36,6 créditos, uma redução de apenas 3,2%, já dentro da faixa de variação natural que observamos entre execuções idênticas do mesmo agente. No Claude Code CLI, acompanhamos o consumo através do **/usage**, [documentado na página de custos e uso](https://code.claude.com/docs/en/costs?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), que expõe tokens de input, output, cache read e cache write, além de um custo estimado em dólar. Um adendo importante sobre esse valor em dólar, ele é calculado localmente pelo próprio Claude Code, a preço de tabela padrão, sem refletir pricing promocional nem descontos contratados, e pode diferir do valor efetivamente cobrado. - **Simples 1:** não coletado (sem RTK) → $0,97 (com RTK) => variação **não calculável** - **Simples 2:** $0,57 (sem RTK) → $0,80 (com RTK) => variação **+40,4%** - **Simples 3:** $0,66 (sem RTK) → $0,53 (com RTK) => variação **−19,7%** - **Média simples:** $0,615 (sem RTK) → $0,767 (com RTK) => variação **+24,7%** - **Complexa 1:** $5,74 (sem RTK) → $7,42 (com RTK) => variação **+29,3%** - **Complexa 2:** $6,10 (sem RTK) → $6,20 (com RTK) => variação **+1,6%** - **Média complexa:** $5,92 (sem RTK) → $6,81 (com RTK) => variação **+15,0%** - **Ponderado (3 simples + 2 complexas):** $13,69 (sem RTK) → $15,92 (com RTK) => variação **+16,3%** A execução simples 1 sem RTK não foi registrada, então a média sem RTK das simples usa duas amostras contra três da bateria com RTK, uma limitação que carregamos conscientemente pelo resto da análise. Ainda assim, o padrão é claro, a média simples subiu 24,7%, a média complexa subiu 15,0%, e o total ponderado para o mesmo perfil de cinco execuções, três simples e duas complexas, foi de $13,69 para $15,92, um aumento de 16,3%. Acompanhamos também a soma bruta de tokens de cada execução, somando input, output, cache read e cache write reportados pelo **/usage**. - **Simples 1:** não coletado (sem RTK) → 656,3K (com RTK) => variação **não calculável** - **Simples 2:** 486,7K (sem RTK) → 764,8K (com RTK) => variação **+57,1%** - **Simples 3:** 495,0K (sem RTK) → 371,2K (com RTK) => variação **−25,0%** - **Média simples:** 490,9K (sem RTK) → 597,5K (com RTK) => variação **+21,7%** - **Complexa 1:** 11,80M (sem RTK) → 14,60M (com RTK) => variação **+23,7%** - **Complexa 2:** 12,41M (sem RTK) → 13,19M (com RTK) => variação **+6,3%** - **Média complexa:** 12,11M (sem RTK) → 13,89M (com RTK) => variação **+14,7%** O aumento de tokens acompanha o aumento de custo, 21,7% a mais nas simples e 14,8% a mais nas complexas, com RTK habilitado. Chegamos então ao paradoxo aparente que motivou este artigo, o próprio RTK reportou uma economia expressiva na saída de shell que interceptou, mas o custo final da bateria subiu. As duas capturas abaixo mostram exatamente o que o **rtk gain** reportou ao final de cada bateria com RTK habilitado. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/claude.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/copilot.png) Vale a pena olhar para dentro dessas capturas, porque a tabela por comando é o que explica a mecânica do resultado. No Copilot, **rtk read** respondeu por 81 chamadas e 35,1K tokens economizados, mas com apenas 6,0% de redução média por chamada, e **rtk grep** respondeu por 69 chamadas e 5,4K tokens economizados, com 30,2% de redução média. Já comandos estruturais, de baixíssimo volume, tiveram reduções percentuais muito mais altas, **rtk dotnet build** teve uma única execução com 96,7% de redução, e diferentes variações de **rtk ls -la** ficaram entre 50,8% e 76,4% de redução, cada uma aparecendo uma ou duas vezes apenas. No Claude, o padrão se repete, **rtk read** teve 41 chamadas somando 36,7K tokens economizados a apenas 5,8% de redução média, **rtk grep** teve 77 chamadas somando 2,6K tokens a 28,7% de redução média, e **rtk find** apareceu 31 vezes com apenas 6,2% de redução média. Comandos estruturais como **rtk ls -la src/Client...** chegaram a 87,4% de redução, mas de novo em volume baixíssimo, duas chamadas apenas. É exatamente o padrão que o mecanismo de interceptação por Bash sugere, comandos de alto volume como leitura e busca de arquivo têm pouca gordura para cortar proporcionalmente, enquanto comandos raros de saída muito verbosa, como um build, têm muito mais espaço de compressão. Com todos os números coletados, vale explicar exatamente como cada cálculo foi feito, para que qualquer pessoa possa reproduzir ou auditar as contas. A variação percentual em todas as tabelas segue a fórmula padrão de diferença relativa. ```text Δ% = (média_sem_RTK − média_com_RTK) / média_sem_RTK × 100 ``` A soma de tokens por execução no Claude Code é simplesmente a soma dos quatro contadores que o **/usage** expõe. ```text total = input + output + cache_read + cache_write ``` E o total ponderado de custo, usado para comparar as duas baterias no mesmo perfil de cinco execuções, pondera a média de cada categoria pelo número de execuções daquele tipo no desenho original do benchmark. ```text total = 3 × média_simples + 2 × média_complexa sem RTK: 3 × 0,615 + 2 × 5,92 = $13,69 com RTK: 3 × 0,767 + 2 × 6,81 = $15,92 ``` Um ponto que exigiu atenção redobrada foi a base de preço usada nas conversões da análise seguinte. O **/usage** do Claude Code e o conversor de AI Credits do GitHub usam bases de preço diferentes, então usamos cada tabela na comparação que lhe corresponde, para não misturar maçãs com laranjas. A tabela do GitHub, confirmada na documentação oficial de modelos e preços, reflete o pricing promocional do Sonnet 5 vigente até 31 de agosto de 2026, e foi usada em todos os cálculos envolvendo Copilot. - **Input:** US$ 2,00 / MTok → **200 AI Credits** - **Cached input (cache read):** US$ 0,20 / MTok → **20 AI Credits** - **Cache write (5 min):** US$ 2,50 / MTok → **250 AI Credits** - **Output:** US$ 10,00 / MTok → **1.000 AI Credits** > Considerando **1 AI Credit = US$ 0,01**. Já para o Claude Code, como o próprio **/usage** calcula a preço de tabela padrão, sem desconto promocional, usamos a tabela standard list rate do Sonnet 5, com os multiplicadores usuais de cache aplicados sobre o preço de input, dez por cento para cache read e um a dois multiplicadores para cache write dependendo do TTL, conforme documentado na [**página oficial de pricing**](https://platform.claude.com/docs/en/pricing?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). - **Input:** US$ 3,00 / MTok - **Cached input (cache read):** US$ 0,30 / MTok - **Cache write (5 min):** US$ 3,75 / MTok - **Cache write (1h):** US$ 6,00 / MTok - **Output:** US$ 15,00 / MTok Com as duas bases de preço definidas, chegamos ao núcleo da análise, por que a economia que o RTK reportou não apareceu na conta final. A primeira explicação é que o **rtk gain** e o custo da sessão medem coisas fundamentalmente diferentes. O **rtk gain** mede a razão entre tokens removidos e tokens brutos de saída de shell, enquanto o custo da sessão soma tudo o que o agente consumiu, prompt, system instructions, histórico de conversa reenviado a cada turno, chamadas de ferramenta, cache read, cache write e o output do próprio modelo. O RTK só toca o numerador da primeira conta, e o que ele toca é uma fração pequena do segundo. A própria [documentação sobre como o savings é calculado](https://github.com/rtk-ai/rtk/blob/develop/docs/guide/resources/savings-explained.md?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) já deixa isso explícito, uma redução de 90% na saída de um comando não implica sessão 90% mais barata. Para dimensionar essa fração, somamos os contadores de tokens de toda a bateria com RTK do Claude Code, input, output, cache read e cache write das cinco execuções. - **Simples:** 656,3K + 764,8K + 371,2K = **1,79M** - **Complexas:** 14,60M + 13,19M = **27,79M** - **Total:** **29,58M** O **rtk gain** registrou 44,8K tokens economizados na mesma bateria. Contra esse total, a conta fica em torno de 0,15%. ```text 44,8K / 29,58M ≈ 0,15% ``` Vale um cuidado aqui com o denominador, porque é fácil errar essa conta comparando os 44,8K contra uma única tarefa complexa, que sozinha já soma cerca de 12 milhões de tokens. Fazer essa comparação daria algo perto de 0,4%, superestimando o efeito em quase três vezes. O denominador correto é a bateria inteira, já que os 44,8K são o acumulado dos 213 comandos das cinco execuções, não de uma execução isolada. Vale lembrar também que essa soma não é literalmente um tamanho de contexto, o cache read conta o mesmo histórico sendo reprocessado a cada novo request, já que o Claude Code reenvia a conversa inteira a cada turno, conforme explica a documentação de [prompt caching](https://code.claude.com/docs/en/prompt-caching?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). Então o total de 29,58 milhões reflete reprocessamento acumulado ao longo da sessão, não uma janela de contexto única. O RTK fez o trabalho dele dentro do domínio que consegue controlar, e o comportamento não determinístico do agente variou mais do que a economia produzida nesse domínio. O aumento observado é compatível com variação normal do comportamento agêntico, mais turnos, mais leituras, mais chamadas de ferramenta, uso diferente de subagentes entre uma execução e outra, mas o benchmark atual não permite identificar qual desses fatores efetivamente causou a diferença, nem se o RTK teve qualquer participação causal nela. Com apenas duas ou três execuções por célula, não conseguimos separar estatisticamente "o RTK causou um comportamento diferente do agente" de "o agente simplesmente teve uma trajetória diferente por acaso". A própria amostra evidencia o tamanho desse ruído de forma direta, nas duas execuções complexas sem RTK do Copilot, tivemos 369 e 336 créditos, uma diferença de quase 9% entre duas rodadas idênticas, sem mudar absolutamente nada na configuração. Existe uma corroboração externa interessante para esse padrão, embora ela não prove causalidade no nosso experimento específico. Há uma issue fechada no [próprio repositório do RTK](https://github.com/rtk-ai/rtk/issues/582?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) relatando um efeito parecido, um aumento de 18% no custo do Claude Code depois de habilitar o RTK, usando a versão 0.29.0 e o modelo Sonnet 4.5, com os tokens de output subindo 50%. A hipótese levantada nessa issue é que o modelo, ao receber um output compactado e abreviado, compensa gerando mais tokens de saída para interpretar a informação condensada. É um mecanismo plausível e já documentado de forma independente por outro usuário, mas o nosso benchmark não instrumentou volume de turns ou de output por execução, então não podemos confirmar que foi exatamente isso que aconteceu na nossa bateria. Reunindo tudo, dá para separar com clareza o que os dados sustentam do que eles não sustentam. Os dados sustentam que o RTK funcionou tecnicamente, comprimindo entre 42% e 55% da saída de terminal que conseguiu interceptar nos dois agentes, e sustentam que, neste workload específico, saída de terminal representa uma parcela muito pequena do custo total dos agentes, algo em torno de 0,15% dos tokens da bateria do Claude. Sustentam também que uma redução local grande pode virar uma redução global pequena, facilmente encoberta pela variabilidade natural de execuções agênticas, e que, para este repositório e este perfil de tarefas, não houve evidência de redução de custo relevante acima do ruído experimental. O **rtk gain** deve ser interpretado como eficiência de compressão de terminal, não como economia de AI Credits ou de dólares. Por outro lado, os dados não sustentam a afirmação de que o RTK não funciona, ele fez exatamente o que promete dentro do escopo em que atua. Também não sustentam a leitura de que o RTK economiza de 40% a 55% no Copilot ou no Claude, essa é a métrica de compressão de shell, não de fatura. E não sustentam a afirmação de que o RTK aumenta o custo do Claude em 16,3%, esse aumento está dentro da faixa de ruído observada entre execuções e não foi atribuído causalmente ao RTK em nenhum momento da análise, ainda que exista um relato externo de efeito parecido. Também não é correto tratar o $15,92 como o que a bateria custou de fato, é um valor calculado localmente pelo Claude Code a preço de tabela padrão, e para assinantes Pro ou Max o uso já está incluso no plano, então nem chega a representar uma cobrança real. Por fim, listamos as limitações que consideramos importantes para qualquer pessoa que queira usar este benchmark como referência. A amostra total foi de vinte execuções, com apenas duas ou três amostras por célula, um **N** insuficiente para separar sinal de ruído com confiança estatística, e a variância entre execuções idênticas que observamos, como o caso dos 369 contra 336 créditos, é comparável em magnitude aos próprios efeitos que estávamos tentando medir. As métricas dos dois agentes não são diretamente comparáveis entre si, créditos de um lado e dólares do outro, e não instrumentamos o comportamento de cache durante as execuções, o que significa que as faixas de sensibilidade que calculamos dependem de um valor de **N** desconhecido e são estimativas com premissas explícitas, não medições diretas. Nenhuma diferença observada foi atribuída causalmente ao RTK em nenhum ponto deste artigo, os deltas medidos estão dentro da faixa de variação natural que já existe entre execuções agênticas idênticas, e a qualidade e a corretude do código gerado não foram avaliadas em momento algum, é inteiramente possível que o RTK afete a qualidade do código em qualquer direção sem que isso apareça nesses números. Usamos um único repositório, uma única stack e um único modelo. Este benchmark serve para dar uma ideia inicial de ordem de grandeza, não para embasar uma decisão de rollout em produção. Para uma conclusão mais firme seriam necessárias muito mais execuções por célula, instrumentação do comportamento de cache e, principalmente, um perfil de tarefa que inclua comandos de saída realmente verbosa, como builds longos, suítes de teste completas, logs de container ou diffs grandes de git, cenário em que a fatia controlável pelo RTK provavelmente é bem maior do que a que vimos aqui, navegando código e implementando features. Fica como sugestão para um próximo artigo! Até a próxima, abraços! ### Como Criar um App Interativo com Copilot a Partir de uma Lista do SharePoint URL: https://www.azurebrasil.cloud/blog/como-criar-um-app-interativo-com-copilot-a-partir-de-uma-lista-do-sharepoint/ Last updated: 2026-08-18T12:27:52.000Z > Vamos aprender como usar o Copilot em SharePoint para transformar uma lista em colunas, dados de teste e um app HTML interativo, e qual configuração de tenant e de site precisa estar correta antes disso, incluindo o erro mais comum quando o app gerado não carrega os dados. ## Pré-requisitos | Requisito | Obrigatório? | Notas | | -------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------ | | Licença Microsoft 365 Copilot ativa no usuário | Sim | Copilot em SharePoint está incluído na licença, sem custo adicional durante o preview | | Módulo SharePoint Online Management Shell instalado | Sim | Necessário para rodar os comandos de verificação e ajuste do tenant mostrados neste artigo | | Feature liberada no tenant ( KnowledgeAgentScope ) | Sim | O valor padrão do parâmetro é NoSites ; muitos tenants nunca chegaram a revisar isso | | Site AI settings com o botão do Copilot visível | Sim | O dono do site pode ocultar o botão para visitantes | | Restricted Content Discovery desabilitado no site | Sim | Se estiver habilitado, o Copilot em SharePoint não aparece, mesmo com o tenant liberado | | Ciência dos limites diários e semanais de uso do preview | Recomendado | Podem interromper uma geração no meio do processo | ## O Que é o Copilot em SharePoint O recurso usado nesta demo se chama **Copilot em SharePoint**. Ele permite fazer perguntas sobre o conteúdo de um site, automatizar tarefas simples e criar sites, páginas, listas, relatórios interativos e arquivos do Office usando linguagem natural, diretamente na experiência do SharePoint. Para uma equipe de TI que já tem uma lista organizada, isso significa pular etapas manuais de modelagem de coluna e de montagem de relatório, o foco do restante deste artigo. ## Antes de Testar: a Configuração Que Costuma Faltar A maioria das demos desse recurso mostra o resultado final sem explicar o que precisa estar habilitado antes. Na prática, quatro pontos determinam se a experiência aparece e funciona. ### Licença O usuário precisa ter uma licença Microsoft 365 Copilot ativa. Sem ela, o botão do Copilot simplesmente não aparece na lista, independentemente de qualquer outra configuração. ### Disponibilidade da feature no tenant O Copilot em SharePoint está passando por um rollout como *opt-out preview*, disponível automaticamente para usuários licenciados a partir de meados de junho de 2026\. Isso não significa que todo tenant já está com a feature ativa: se sua organização participou de uma fase anterior do preview e optou por não usar o recurso, essa configuração é respeitada mesmo depois do rollout automático. O controle fica no parâmetro `KnowledgeAgentScope`, gerenciado pelo SharePoint Online Management Shell. Se você ainda não tem o módulo instalado, instale antes de conectar: ```powershell # Instalar o módulo (executar como Administrador) Install-Module -Name Microsoft.Online.SharePoint.PowerShell -Force ``` Para verificar o estado atual do tenant, conecte usando a URL do **admin center**, não a URL do site raiz do tenant: ```powershell # Conectar ao SharePoint Online como Administrador do SharePoint # A URL precisa ser a do admin center (sufixo "-admin"), não a do site normal Connect-SPOService https://suaempresa-admin.sharepoint.com # Verificar a configuração atual Get-SPOTenant | Select-Object KnowledgeAgentScope ``` > ⚠️ **Cuidado:** usar a URL do site normal (sem o sufixo `-admin`) no `Connect-SPOService` resulta no erro `Current site is not a tenant administration site.`. Confirme que a URL usada termina em `-admin.sharepoint.com`. Se o retorno for `NoSites`, o Copilot em SharePoint está desabilitado para todo o tenant. Para liberar em todos os sites: ```powershell Set-SPOTenant -KnowledgeAgentScope AllSites ``` Ou, para liberar apenas em sites específicos durante um piloto controlado: ```powershell Set-SPOTenant -KnowledgeAgentScope IncludeSelectedSites Set-SPOTenant -KnowledgeAgentSelectedSitesList @("https://suaempresa.sharepoint.com/sites/ti") ``` ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-13.png) > Este é, na prática, o "script inicial" que a maior parte das demos não menciona. Sem ele, tudo o resto (colunas por linguagem natural, dados fictícios, app interativo) simplesmente não existe na interface do usuário. ### Configurações de site Mesmo com o tenant liberado, o dono de um site específico pode ocultar o botão do Copilot para visitantes em **Site AI settings**. Uma segunda trava age de forma independente dessa: se o site tiver **Restricted Content Discovery** habilitado, o Copilot em SharePoint e as ações de IA não aparecem naquele site, seja qual for a configuração do tenant. Antes de concluir que a feature "não funciona", confirme essas duas configurações no site específico usado no teste. ### Limites de uso do preview Durante o preview, o Copilot em SharePoint aplica limites diários e semanais de uso por usuário. Ao atingir o limite, os recursos de IA ficam temporariamente indisponíveis até o reset automático. Se uma geração parece "travar" no meio de uma demo mais longa, esse é um dos motivos possíveis. ## Montando a Demo: Criando a Lista e as Colunas por Linguagem Natural Com os quatro pontos acima confirmados, o cenário desta demo é um inventário de ativos de TI, um caso de uso comum em qualquer equipe que precisa controlar notebooks, monitores e outros equipamentos por colaborador. 1. Crie uma lista vazia no SharePoint chamada **Inventário de Ativos de TI**. 2. Abra o Copilot na lista e descreva as colunas necessárias em linguagem natural, sem configurar tipos de dado manualmente: > "Crie as colunas que eu preciso nesta lista: nome do ativo, tipo de ativo, colaborador responsável, departamento, data de compra, validade da garantia, status e número de série." O Copilot interpreta o contexto de cada nome e escolhe o tipo de coluna adequado. Colaborador responsável, por exemplo, normalmente é criado como coluna do tipo Pessoa ou Grupo, sem que isso precise ser pedido explicitamente. 1. Com as colunas criadas, peça dados de teste para ter algo para visualizar: > "Crie 50 registros fictícios para popular esta lista, variando os tipos de ativo, os departamentos e o status." O Copilot mostra uma prévia dos itens que pretende criar antes de aplicar. Revise a amostra, principalmente valores de status e datas de garantia, antes de confirmar a criação. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-15.png) ## Pedindo o App Interativo (e Como Escrever um Prompt Melhor) Com a lista populada, o próximo passo é pedir o app interativo. Um prompt direto, no estilo do que normalmente aparece em demos, seria: > "Preciso de uma página HTML interativa que ajude um administrador de TI a visualizar essas informações em estilo dashboard, com gráficos, e que também deixe os formulários de novo item e de edição mais intuitivos e esteticamente agradáveis." Esse prompt funciona, mas deixa decisões importantes nas mãos do modelo: quais métricas priorizar, o que conta como "ativo em risco", quais filtros disponibilizar. Um prompt mais específico reduz a ambiguidade e tende a gerar um resultado mais próximo do que a equipe de TI realmente precisa: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-17.png) > "Crie uma página HTML interativa e independente, conectada a esta lista, pensada para o uso diário de um administrador de TI. Mostre: total de ativos, ativos com garantia vencida ou a vencer nos próximos 30 dias, distribuição de ativos por status em um gráfico de rosca, e uma lista dos ativos que precisam de atenção imediata. Adicione filtros por departamento, tipo de ativo e status. Redesenhe os formulários de novo item e de edição de forma intuitiva. Indique a data e hora da última atualização dos dados e explique como valores em branco são tratados." A diferença entre os dois prompts não é estética. O segundo define público, métricas, dimensões de filtro e uma regra de tratamento de dados ausentes, o que facilita validar depois se o resultado está correto. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-16.png) Nos dois casos, o retorno costuma incluir um gráfico de rosca por status, contadores de destaque (como total de ativos e ativos em risco) e formulários customizados de criação e edição, todos conectados à lista de origem. O arquivo HTML gerado é salvo na biblioteca **Site Assets** do site. ## Onde Abrir o App Gerado Sem Quebrar a Conexão com a Lista Ajuste a expectativa antes de distribuir esse app para outras pessoas: o que o Copilot entrega é um relatório HTML interativo gerado por IA, não uma aplicação de produção com autenticação, controle de estado e tratamento de erro construídos sob medida. Ele pode ter aparência e comportamento de aplicativo, com cartões, gráficos, filtros e formulários, mas isso não equivale aos mesmos mecanismos de confiabilidade de uma aplicação projetada e testada como tal. Isso também afeta como o arquivo deve ser aberto. A documentação oficial descreve o fluxo como algo para ser revisado dentro da experiência suportada do SharePoint, com o Copilot chat disponível ao lado para ajustes. Abrir o arquivo diretamente pela biblioteca de documentos é um caminho diferente desse fluxo de revisão. Foi exatamente isso que aconteceu neste teste: depois de gerado, o arquivo `Inventário de Ativos de TI Dashboard.html` foi aberto diretamente pela biblioteca Site Assets, pela visualização padrão de documentos (`Forms/AllItems.aspx`). O resultado foi a página travada em "Loading live inventory..." com o erro: ```text Failed to load data: no content ``` A Microsoft não documenta em detalhe o limite exato de execução desse tipo de artefato gerado. Trate as causas abaixo como prováveis, não como certezas: - a configuração de `KnowledgeAgentScope` pode ainda não ter propagado totalmente para todos os componentes envolvidos na geração e na leitura de dados; - o contexto de execução ao abrir o arquivo pela biblioteca de documentos pode não ser o mesmo contexto usado quando o Copilot gera e revisa o app durante a criação; - a conta usada para abrir o arquivo pode não ter a mesma permissão de leitura sobre a lista de origem que a conta usada na geração. Na prática, antes de compartilhar o link do app gerado com outras pessoas, reabra e valide o resultado a partir da mesma experiência de Copilot usada na criação, em vez de apenas navegar até o arquivo na biblioteca. ## Checklist de Diagnóstico Quando o App Sai Errado | Sintoma | Causa provável | Solução | | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | | Botão do Copilot não aparece na lista | Usuário sem licença M365 Copilot, ou KnowledgeAgentScope igual a NoSites | Confirmar a licença do usuário; rodar Get-SPOTenant e habilitar com Set-SPOTenant | | Botão aparece em um site e some em outro | Site AI settings oculto pelo dono do site, ou Restricted Content Discovery habilitado nesse site | Revisar as configurações de IA do site específico | | Geração para no meio ou o Copilot recusa continuar | Limite diário ou semanal de uso do preview atingido | Aguardar o reset automático do limite, ou testar com outra conta licenciada | | App abre mas mostra "Failed to load data: no content" | Contexto de execução ou permissão de leitura na lista não resolvidos ao abrir pela biblioteca | Reabrir e validar a partir da experiência de Copilot usada na criação; confirmar permissão de leitura na lista de origem | | Dados do app não batem com a lista atual | O artefato pode ser um retrato estático, não uma consulta em tempo real | Alterar um item na lista, atualizar a página e confirmar se o valor muda antes de chamar o app de "ao vivo" | ## O Risco de Negócio de Tratar Isso Como uma Aplicação Pronta Um artefato gerado por IA que parece uma aplicação funcional, mas falha silenciosamente com uma mensagem genérica como "Failed to load data: no content", é um risco quando é compartilhado com liderança ou com a operação do dia a dia sem validação prévia. A mensagem não indica se o problema é de licença, de configuração de tenant, de permissão ou de contexto de execução, o que torna qualquer diagnóstico apressado pouco confiável. Isso não invalida o recurso. Para leituras rápidas, protótipos e dashboards leves de uso interno, o Copilot em SharePoint reduz de forma real a distância entre "temos uma lista organizada" e "temos algo visual para mostrar". O ponto de atenção é o próximo passo: um processo de negócio crítico, com regras de aprovação, integrações externas ou necessidade de suporte formal, ainda pede uma solução construída e testada como tal, seja Power Apps, Power BI ou uma aplicação dedicada. A decisão não é "Copilot ou a ferramenta certa": é entender qual nível de confiabilidade o cenário exige antes de generalizar um resultado de demo para uso em produção. ## Fechamento Com a licença confirmada, o `KnowledgeAgentScope` liberado no tenant, as configurações de site revisadas e os prompts certos, o fluxo completo (colunas por linguagem natural, dados de teste e app interativo) funciona como esperado. O ponto que decide entre um resultado funcional e uma tela travada em "Failed to load data" quase sempre está numa dessas configurações prévias, não na sequência de prompts em si. Antes de reproduzir esse fluxo no seu tenant, confira o estado atual do `KnowledgeAgentScope` com o comando `Get-SPOTenant` mostrado neste artigo. Se preferir revisar a configuração com apoio, fale com a Azure Brasil. ## Referências - [Get started with Copilot in SharePoint (preview)](https://learn.microsoft.com/en-us/sharepoint/copilot-in-sharepoint-get-started?ref=azurebrasil.cloud) - [What's New in Copilot in SharePoint: July 2026](https://techcommunity.microsoft.com/blog/spblog/what%E2%80%99s-new-in-copilot-in-sharepoint-july-2026/4535420?ref=azurebrasil.cloud) - [Copilot in SharePoint (adoption hub)](https://adoption.microsoft.com/en-us/copilot-in-sharepoint/?ref=azurebrasil.cloud) - [Manage Copilot agents and integrated apps (Agent 365)](https://learn.microsoft.com/en-us/microsoft-365/admin/manage/manage-copilot-agents-integrated-apps?view=o365-worldwide&ref=azurebrasil.cloud) ### Azure Newsletter - 2026-08-17 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-08-17/ Last updated: 2026-08-17T11:50:58.000Z ### Azure Updates - [Keep Azure Monitor issues and ServiceNow ITOM incidents in sync](https://techcommunity.microsoft.com/t5/azure-observability-blog/keep-azure-monitor-issues-and-servicenow-itom-incidents-in-sync/ba-p/4543399?ref=azurebrasil.cloud) - [What to Do When You Hit Capacity in Azure Databricks: Engage, Mitigate, Plan!](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/what-to-do-when-you-hit-capacity-in-azure-databricks-engage/ba-p/4526876?ref=azurebrasil.cloud) - [Running Hosted Agents in Microsoft Foundry Agent Service Part 3/5](https://techcommunity.microsoft.com/t5/microsoft-developer-community/running-hosted-agents-in-microsoft-foundry-agent-service-part-3/ba-p/4541933?ref=azurebrasil.cloud) - [Git-APE SaaS Factory](https://devblogs.microsoft.com/all-things-azure/git-ape-saas-factory/?ref=azurebrasil.cloud) - [Tableau to Power BI Migration: Semantic Layer-First Approach for Cloud Architects](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/tableau-to-power-bi-migration-semantic-layer-first-approach-for/ba-p/4481009?ref=azurebrasil.cloud) - [Update WCF Relay applications to use TLS 1.2 or later](https://techcommunity.microsoft.com/t5/messaging-on-azure-blog/update-wcf-relay-applications-to-use-tls-1-2-or-later/ba-p/4544418?ref=azurebrasil.cloud) - [From Silicon to Systems: Bending the Cost and Complexity Curves of AI](https://techcommunity.microsoft.com/t5/azure-infrastructure-blog/from-silicon-to-systems-bending-the-cost-and-complexity-curves/ba-p/4545207?ref=azurebrasil.cloud) - [From Features to Flow: How Real-World Adoption Reshaped the Azure Architecture Diagram Builder](https://techcommunity.microsoft.com/t5/azure-architecture-blog/from-features-to-flow-how-real-world-adoption-reshaped-the-azure/ba-p/4546817?ref=azurebrasil.cloud) - [Updates to GPT-chat-latest in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/updates-to-gpt-chat-latest-in-microsoft-foundry/ba-p/4546815?ref=azurebrasil.cloud) - [Your best friend: BlockOnPossibleDataLoss=True](https://devblogs.microsoft.com/azure-sql/blockonpossibledataloss/?ref=azurebrasil.cloud) - [Monitoring Azure Service Fabric with Azure Managed Grafana](https://techcommunity.microsoft.com/t5/azure-paas-blog/monitoring-azure-service-fabric-with-azure-managed-grafana/ba-p/4546439?ref=azurebrasil.cloud) - [MCP Community Connect: Bringing the MCP ecosystem together](https://techcommunity.microsoft.com/t5/microsoft-developer-community/mcp-community-connect-bringing-the-mcp-ecosystem-together/ba-p/4537839?ref=azurebrasil.cloud) - [Introducing dependency telemetry in Application Insights for Azure API Management policies](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/introducing-dependency-telemetry-in-application-insights-for/ba-p/4545504?ref=azurebrasil.cloud) - [When AI Agents Fail: Engineering Reliable Recovery with Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/when-ai-agents-fail-engineering-reliable-recovery-with-microsoft/ba-p/4546388?ref=azurebrasil.cloud) - [Resilient Azure Platforms: Durable Functions, Cosmos DB, and DR by Design](https://techcommunity.microsoft.com/t5/itops-talk-blog/resilient-azure-platforms-durable-functions-cosmos-db-and-dr-by/ba-p/4546001?ref=azurebrasil.cloud) - [Building MCP servers for your database: Flexibility, safety, and tradeoffs](https://techcommunity.microsoft.com/t5/microsoft-developer-community/building-mcp-servers-for-your-database-flexibility-safety-and/ba-p/4546385?ref=azurebrasil.cloud) - [Add AI to the workflows you already have using Serverless Agents in Azure Functions](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/add-ai-to-the-workflows-you-already-have-using-serverless-agents/ba-p/4544824?ref=azurebrasil.cloud) - [Governing a Risk Operations Agent with the Microsoft Agent Framework Harness and AGT](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/governing-a-risk-operations-agent-with-the-microsoft-agent/ba-p/4546425?ref=azurebrasil.cloud) - [From Sync APIs to support for the GPT-5 model series and agentic workflows: What’s new in Azure Content Understanding – August 2026](https://devblogs.microsoft.com/foundry/azure-content-understanding-updates-august-2026/?ref=azurebrasil.cloud) - [Azure Content Understanding GPT-5 Series Guide: Model Selection, Grounding Improvements, and Confidence Enhancements](https://devblogs.microsoft.com/foundry/azure-content-understanding-gpt-5-series-guide-model-selection-grounding-improvements-and-confidence-enhancements/?ref=azurebrasil.cloud) - [Azure Content Understanding announces Synchronous Operations](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/azure-content-understanding-announces-synchronous-operations/ba-p/4544475?ref=azurebrasil.cloud) - [Understanding GitHub Billing and management: from licenses to fair AI credit controls](https://dev.to/azure/understanding-github-billing-and-management-from-licenses-to-fair-ai-credit-controls-1hli?ref=azurebrasil.cloud) - [Azure Monitor Auxiliary Logs expands with Azure tables support, plan switching, and sovereign clouds](https://techcommunity.microsoft.com/t5/azure-observability-blog/azure-monitor-auxiliary-logs-expands-with-azure-tables-support/ba-p/4525206?ref=azurebrasil.cloud) - [Building Autonomous Agents with Microsoft Agent Framework and GitHub Copilot SDK Part 2/5](https://techcommunity.microsoft.com/t5/microsoft-developer-community/building-autonomous-agents-with-microsoft-agent-framework-and/ba-p/4541924?ref=azurebrasil.cloud) - [Container Network Insights Agent (CNIA): Your AI Teammate for AKS Networking Incidents](https://techcommunity.microsoft.com/t5/itops-talk-blog/container-network-insights-agent-cnia-your-ai-teammate-for-aks/ba-p/4545971?ref=azurebrasil.cloud) - [Azure Developer CLI extension framework is GA: build dev workflows for apps using Azure](https://devblogs.microsoft.com/azure-sdk/azd-extension-framework-ga/?ref=azurebrasil.cloud) - [Reliability Starter Kit: SLIs, Health models, and SRE Agent](https://techcommunity.microsoft.com/t5/azure-observability-blog/reliability-starter-kit-slis-health-models-and-sre-agent/ba-p/4545733?ref=azurebrasil.cloud) - [August Patches for Azure DevOps Server](https://devblogs.microsoft.com/devops/august-patches-for-azure-devops-server-4/?ref=azurebrasil.cloud) - [GitHub Admin UI + Billing API: Better together for smarter spend decisions](https://techcommunity.microsoft.com/t5/microsoft-developer-community/github-admin-ui-billing-api-better-together-for-smarter-spend/ba-p/4545682?ref=azurebrasil.cloud) - [From Azure Container Apps to Microsoft Foundry: building and evaluating a Patch Tuesday MCP server](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/from-azure-container-apps-to-microsoft-foundry-building-and/ba-p/4541630?ref=azurebrasil.cloud) - [Today I will… manage Git Submodules without leaving the IDE](https://devblogs.microsoft.com/visualstudio/managing-git-submodules-without-leaving-the-ide/?ref=azurebrasil.cloud) - [What the New API Management AI Gateway Tier Changes for App Service-Hosted Agents](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/what-the-new-api-management-ai-gateway-tier-changes-for-app/ba-p/4543974?ref=azurebrasil.cloud) - [Azure Container Apps Sandboxes (Preview): Giving AI Agents a Safe Place to Work](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/azure-container-apps-sandboxes-preview-giving-ai-agents-a-safe/ba-p/4545975?ref=azurebrasil.cloud) - [Building Microsoft Sentinel Connectors in Minutes with the Sentinel Connector Builder Agent](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/building-microsoft-sentinel-connectors-in-minutes-with-the/ba-p/4544378?ref=azurebrasil.cloud) - [Accelerate Inference on AKS with Azure Blob Storage and NVIDIA Dynamo](https://techcommunity.microsoft.com/t5/azure-storage-blog/accelerate-inference-on-aks-with-azure-blob-storage-and-nvidia/ba-p/4543408?ref=azurebrasil.cloud) - [Operating Azure Backup at Scale: Day-2 Excellence for IaaS, PaaS, and Storage Workloads](https://techcommunity.microsoft.com/t5/itops-talk-blog/operating-azure-backup-at-scale-day-2-excellence-for-iaas-paas/ba-p/4545638?ref=azurebrasil.cloud) - [Vector search finds candidates. Reranking decides what your RAG app reads](https://techcommunity.microsoft.com/t5/microsoft-developer-community/vector-search-finds-candidates-reranking-decides-what-your-rag/ba-p/4543923?ref=azurebrasil.cloud) - [Build Locally, Ship to Cloud for $0: Azure SQL for Modern App Developers](https://devblogs.microsoft.com/azure-sql/build-locally-ship-to-cloud-for-0-azure-sql-for-modern-app-developers/?ref=azurebrasil.cloud) - [Intelligent Terminal 0.2 is here with local model support](https://devblogs.microsoft.com/commandline/intelligent-terminal-0-2-is-here-with-local-model-support/?ref=azurebrasil.cloud) - [GitHub Admin UI + Billing API: Better together for smarter spend decisions](https://dev.to/azure/github-admin-ui-billing-api-better-together-for-smarter-spend-decisions-3lp5?ref=azurebrasil.cloud) - [I Enabled RBAC and Everything Broke. What Did I Do Wrong?](https://devblogs.microsoft.com/cosmosdb/i-enabled-rbac-and-everything-broke-what-did-i-do-wrong/?ref=azurebrasil.cloud) - [A simpler way to deploy ZIP packages to Azure App Service from the Azure portal](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/a-simpler-way-to-deploy-zip-packages-to-azure-app-service-from/ba-p/4545430?ref=azurebrasil.cloud) - [Introducing Microsoft IQ Live: A New Biweekly Series for Developers](https://techcommunity.microsoft.com/t5/microsoft-developer-community/introducing-microsoft-iq-live-a-new-biweekly-series-for/ba-p/4543480?ref=azurebrasil.cloud) ### GitHub Updates - [How to bring your software delivery workflow into GitHub with agent apps](https://github.blog/ai-and-ml/github-copilot/how-to-bring-your-software-delivery-workflow-into-github-with-agent-apps/?ref=azurebrasil.cloud) - [Your guide to GitHub Universe 2026 is here: The schedule just launched!](https://github.blog/news-insights/company-news/your-guide-to-github-universe-2026-is-here-the-schedule-just-launched/?ref=azurebrasil.cloud) - [What 50 open source projects taught us about security in the AI era](https://github.blog/open-source/maintainers/what-50-open-source-projects-taught-us-about-security-in-the-ai-era/?ref=azurebrasil.cloud) - [GitHub availability report: July 2026](https://github.blog/news-insights/company-news/github-availability-report-july-2026/?ref=azurebrasil.cloud) - [Write your first prompt with the GitHub Copilot app](https://github.blog/ai-and-ml/github-copilot/write-your-first-prompt-with-the-github-copilot-app/?ref=azurebrasil.cloud) - [Your contributors are AI-first now. Is your project?](https://github.blog/open-source/maintainers/your-contributors-are-ai-first-now-is-your-project/?ref=azurebrasil.cloud) - [From coder to orchestrator: How agents shift the role of a developer](https://github.blog/developer-skills/career-growth/from-coder-to-orchestrator-how-agents-shift-the-role-of-a-developer/?ref=azurebrasil.cloud) - [Using the GitHub Copilot SDK for Java](https://github.blog/engineering/using-the-github-copilot-sdk-for-java/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Como configurar o Copilot Studio no VS Code e clonar seu primeiro agente local](https://www.azurebrasil.cloud/blog/como-configurar-o-copilot-studio-no-vs-code-e-clonar-seu-primeiro-agente-local/) - [Quanto custa uma reunião esquecida? O prejuízo invisível que está drenando dinheiro da sua operação](https://www.azurebrasil.cloud/blog/quanto-custa-uma-reuniao-esquecida-o-prejuizo-invisivel-que-esta-drenando-dinheiro-da-sua-operacao/) - [Li três artigos sobre custo de IA na mesma manhã: budget de coding agent virou requisito de arquitetura](https://www.azurebrasil.cloud/blog/li-tres-artigos-sobre-custo-de-ia-na-mesma-manha-budget-de-coding-agent-virou-requisito-de-arquitetura/) - [Azure Newsletter - 2026-08-10](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-08-10/) ### Como configurar o Copilot Studio no VS Code e clonar seu primeiro agente local URL: https://www.azurebrasil.cloud/blog/como-configurar-o-copilot-studio-no-vs-code-e-clonar-seu-primeiro-agente-local/ Last updated: 2026-08-14T11:12:53.000Z > **O que você vai aprender:** Como instalar e autenticar a extensão oficial do Microsoft Copilot Studio no VS Code, contornar o ponto onde a maioria trava no sign-in, clonar seu primeiro agente e entender o que o conceito de harness muda nesse fluxo. Editar componentes e sincronizar alterações de volta com o Copilot Studio fica para o próximo artigo. ## Pré-requisitos | Requisito | Obrigatório? | Notas | | -------------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------- | | Windows 10 1809+, Windows 11 ou macOS | Sim | A extensão roda nativamente nesses sistemas. | | VS Code 1.80 ou superior | Sim | Recomenda-se a versão estável mais recente. | | Conexão com a internet | Sim | Necessária para instalação e autenticação. | | Conta Microsoft com licença de Copilot Studio | Sim | Precisa ter acesso ativo em [copilotstudio.microsoft.com](https://copilotstudio.microsoft.com/?ref=azurebrasil.cloud). | | Permissão de acesso a pelo menos um ambiente do Copilot Studio | Sim | Sem isso, o painel de agentes aparece vazio mesmo após o login. | | Permissão de leitura/escrita nos agentes que você vai editar | Sim | Necessária para clonar e aplicar alterações depois. | ## O Limite de Criar Agentes Só Pelo Portal Web O portal do Copilot Studio resolve bem a criação inicial de um agente. O problema aparece quando o agente cresce: dezenas de tópicos, várias ações e conectores, mais de uma pessoa mexendo na mesma definição. Navegar entre telas para achar um tópico específico consome tempo, e não existe um jeito nativo de saber quem alterou o quê, quando, ou de reverter uma mudança que quebrou o comportamento esperado. Isso não é um problema exclusivo do Copilot Studio: é o mesmo motivo pelo qual qualquer projeto de desenvolvimento sério não vive só na nuvem. Como em qualquer projeto de desenvolvimento, vale ter uma versão local do agente e a possibilidade de configurar e trabalhar offline, sem ficar refém da disponibilidade do servidor da Microsoft para isso. Se o portal estiver lento, fora do ar ou passando por manutenção, um fluxo local não trava sua capacidade de revisar ou preparar a próxima alteração. É esse o motivo real para adotar a extensão do Copilot Studio no VS Code. Não é sobre preferência de editor: é sobre trazer práticas de engenharia de software (controle de versão, revisão por pares, trabalho offline) para dentro de um processo que hoje vive quase inteiramente no navegador. ## O Que a Extensão Realmente Traz Para o Fluxo de Trabalho A [extensão oficial do Copilot Studio para VS Code](https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-overview?ref=azurebrasil.cloud) conecta o editor diretamente aos seus agentes na nuvem. Na prática, ela permite: | Recurso | O que faz | | ---------------------------- | -------------------------------------------------------------------------------------------------- | | Clonagem de agente | Baixa a definição completa do agente do Copilot Studio para uma pasta local | | Edição em YAML | Edita tópicos, conhecimento, ações e gatilhos como arquivos de texto estruturado, com IntelliSense | | Gerenciamento de componentes | Modifica fontes de conhecimento, ferramentas, tópicos e skills do agente | | Sincronização | Compara e aplica mudanças entre o workspace local e o Copilot Studio | | Aplicação de alterações | Cria um agente novo ou atualiza um existente em um ambiente do Dataverse | Este artigo não entra no detalhe de como usar cada um desses recursos: editar componentes e sincronizar alterações rendem um tutorial próprio. Aqui o objetivo é fechar a etapa que precede tudo isso: instalar a extensão, autenticar corretamente e clonar seu primeiro agente, sem travar no caminho. ## A Mudança Recente: Entenda o Conceito de Harness Antes de instalar qualquer coisa, vale entender uma peça que mudou recentemente na forma como o Copilot Studio descreve seus próprios recursos: o **harness**. Segundo a [documentação oficial](https://learn.microsoft.com/en-us/microsoft-copilot-studio/harnesses-overview?ref=azurebrasil.cloud), harness é o runtime que existe entre o agente que você desenha e o modelo de linguagem que ele usa. Você define tópicos, ações e regras; o harness decide quando chamar o modelo, quais componentes enviar a ele, como interpretar a resposta e qual ferramenta acionar em seguida. Diferentes harnesses mudam o que o agente consegue fazer e como o uso é cobrado. A Microsoft descreve três harnesses hoje: | Harness | Para que serve | Cobrança | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | | **GitHub Copilot harness** | Agentes e fluxos que precisam raciocinar em várias etapas, chamar ferramentas diferentes, criar/editar arquivos do Word, Excel, PowerPoint e PDF, e se recuperar quando um passo falha | Copilot Credits | | **Standard harness** | Agentes baseados em regras e fluxos de conversa estruturados e previsíveis (o cenário clássico de help desk interno) | Conforme licenciamento padrão do Copilot Studio | | **Copilot chat harness** | Estender o Microsoft 365 Copilot Chat com conhecimento corporativo, sem sair da experiência do dia a dia do usuário | Consumo ou incluído na licença de usuário do M365 Copilot | Por que isso importa para quem vai configurar a extensão no VS Code: a própria documentação da extensão traz uma nota explícita informando que os recursos de clonagem, edição e sincronização hoje são potencializados pelo **standard harness**. Ou seja, o fluxo que este artigo ensina a configurar está, neste momento, alinhado ao harness de agentes baseados em regras, não ao GitHub Copilot harness, que é a opção voltada para processos de negócio mais complexos e multietapas. Se o seu agente evoluir para um cenário que exige raciocínio livre, manipulação de arquivos ou orquestração de múltiplas ferramentas, vale revisitar qual harness ele está usando antes de assumir que o fluxo local se comporta da mesma forma. ## Colocando em Prática: Instalando a Extensão Existem dois caminhos oficiais para instalar a extensão. Os dois levam ao mesmo resultado. ### Método 1: Pela aba Extensions do VS Code 1. Abra a aba **Extensions** (`Ctrl+Shift+X`). 2. Busque por **"Copilot Studio"**. Confirme que o publisher é **Microsoft**. 3. Selecione a extensão e clique em **Install**. 4. Se o VS Code pedir para recarregar, clique em **Reload**. 5. Confirme a instalação: o ícone do Copilot Studio deve aparecer na barra de atividades lateral. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-6.png) ### Método 2: Pelo Marketplace web 1. Acesse `https://marketplace.visualstudio.com/` e busque por "Copilot Studio", ou use o link direto `https://marketplace.visualstudio.com/items?itemName=ms-CopilotStudio.vscode-copilotstudio`. 2. Clique em **Install** na página do marketplace. 3. Permita que o navegador abra o VS Code e confirme a instalação pelo ícone na barra de atividades. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-7.png) > 📌 **Por que isso importa:** confirmar o publisher evita instalar uma extensão homônima ou não oficial. O Copilot Studio manipula credenciais de acesso ao seu tenant, então vale o cuidado extra nesse passo. ## Configuração Inicial e Sign-in: Onde Quase Todo Mundo Trava Com a extensão instalada, o fluxo oficial de primeira configuração é: 1. Clique no ícone do Copilot Studio na barra de atividades. Um aviso pede que você faça sign-in. 2. Clique em **Sign In** no aviso e depois em **Allow**. O navegador padrão abre a página de autenticação da Microsoft. 3. Informe suas credenciais e complete a MFA, se exigida. 4. Revise as permissões solicitadas (ler e escrever agentes do Copilot Studio, acessar informações do ambiente e sincronizar arquivos com a nuvem) e selecione **Accept**. 5. Volte ao VS Code. O painel carrega os ambientes e agentes aos quais você tem acesso. Na prática, foi exatamente aqui que travei ao configurar pela primeira vez por isso indico seguir pelo caminho abaixo caso tenham o mesmo problema. ### Se o diálogo de permissão não aparecer ou a autenticação falhar A documentação oficial lista um caminho alternativo e algumas causas comuns: - Abra o Command Palette (`Ctrl+Shift+P`) e execute **`Copilot Studio: Sign In`** diretamente, sem depender do clique no ícone. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-8.png) - Limpe cache e cookies do navegador para `microsoft.com`. - Tente autenticar em um navegador diferente do padrão. - Desative temporariamente extensões de navegador que possam bloquear a autenticação (bloqueadores de pop-up, por exemplo). - Verifique proxy e firewall corporativo: em ambientes de rede restritiva, a autenticação pode falhar silenciosamente. - Confirme que a conta usada é de um tipo suportado pela sua organização. ## Como Confirmar Que a Configuração Funcionou Depois da autenticação, o painel **Agents** deve mostrar uma estrutura parecida com esta: ```text AGENTS └─ Grupo de ambiente (ex.: developer, default, sandbox, production) ├─ Ambiente 1 │ ├─ Agente 1 │ └─ Agente 2 └─ Ambiente 2 └─ Agente 3 ``` Se o sign-in funcionou mas essa estrutura aparece vazia, o problema deixou de ser autenticação e passou a ser permissão: verifique se sua conta tem acesso ao ambiente do Power Platform e se você tem permissão de leitura sobre os agentes daquele ambiente. Um administrador de Power Platform que restringiu o acesso ao ambiente ou não liberou o Copilot Studio para o tenant também bloqueia essa listagem, mesmo com o login concluído sem erros. ## Clonando Seu Primeiro Agente Com o ambiente certo aparecendo no painel **Agents**, o passo seguinte é trazer a definição do agente para o seu computador. O clone não substitui o portal: ele cria uma cópia editável dos arquivos que hoje só existem na nuvem. ### Antes de clonar, escolha bem a pasta - Use um caminho sem espaços quando possível. Espaços são suportados, mas evite quando puder. - Prefira uma pasta já rastreada pelo Git, ou inicialize o Git logo depois de clonar. - Garanta espaço em disco suficiente: o tamanho varia conforme o número de componentes do agente. ### Pelo painel Agents (recomendado) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-9.png) 1. Abra a extensão do Copilot Studio na barra de atividades, ou use `Ctrl+Shift+P` e execute **`Copilot Studio: Focus on Agents View`**. 2. No painel **Agents**, selecione o ambiente que contém o agente desejado. 3. Clique com o botão direito no agente e selecione **Clone agent**. 4. Escolha ou crie uma pasta local no seletor de arquivos e confirme. 5. Aguarde a notificação de sucesso. O processo costuma levar entre 10 e 30 segundos. 6. Confirme que a pasta abriu no Explorer do VS Code e que o painel **Source Control** mostra a árvore de trabalho limpa. ### O que realmente vem na pasta clonada O clone traz a definição completa do agente, não uma exportação parcial: ```text meu-agente/ ├── actions/ # Conectores ├── knowledge/files/ # Fontes de conhecimento ├── topics/ # Tópicos de conversa ├── workflows/ # Ferramentas e ações do agente ├── trigger/ # Gatilhos de evento ├── agent.mcs.yaml # Definição principal do agente ├── icon.png # Ícone do agente ├── settings.mcs.yml # Configurações do agente └── connectioreferences.mcs.yml # Referências de conexão usadas por conectores ``` ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-12.png) > 📌 É essa estrutura que permite versionar o agente com Git com granularidade real, arquivo por arquivo, em vez de depender de uma exportação única e opaca feita pelo portal. ## Quando Vale a Pena Trabalhar Assim Configurar a extensão é rápido; decidir se vale adotar esse fluxo no dia a dia é a parte que exige critério. **Faz sentido quando:** - Mais de uma pessoa mexe no mesmo agente e você precisa de histórico de mudanças e revisão via pull request. - O agente já tem tópicos e ações suficientes para tornar a navegação pelo portal lenta. - Sua equipe já usa Git para outros projetos e quer aplicar a mesma disciplina aqui. - Você quer poder revisar, comentar e preparar alterações mesmo sem depender da disponibilidade do portal do Copilot Studio. **Ainda faz sentido usar só o portal web quando:** - O agente é simples, mantido por uma única pessoa, sem necessidade real de versionamento. - O time não tem prática de Git: nesse caso, adotar a extensão sem essa base tende a criar mais atrito do que ganho. Para contextualizar a utilidade prática desse fluxo, vale saber que a extensão trabalha com três operações de sincronização entre o local e a nuvem: **Preview** (visualizar mudanças remotas sem aplicá-las), **Get** (baixar mudanças da nuvem) e **Apply** (enviar mudanças locais para o Copilot Studio). O detalhe de como usar cada uma delas fica para o próximo artigo desta série; o que importa aqui é entender que a configuração que você acabou de fazer é a base para esse ciclo funcionar depois. ## Fechamento Com a extensão instalada, autenticada, o ambiente correto aparecendo no painel **Agents** e o primeiro agente já clonado, a configuração está pronta. O próximo passo (editar os componentes em YAML e sincronizar as alterações com segurança) eu apresentarei em breve. Se você ainda está decidindo entre criar um agente pelo Agent Builder do Microsoft 365 Copilot ou já partir para o Copilot Studio, veja [Como Criar um Agente no Microsoft 365 Copilot](https://www.azurebrasil.cloud/blog/como-criar-um-agente-no-microsoft-365-copilot/). ## Referências - [Overview da extensão Copilot Studio para VS Code](https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-overview?ref=azurebrasil.cloud) - [Instalar e configurar a extensão](https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-install-configure?ref=azurebrasil.cloud) - [Escolher um harness](https://learn.microsoft.com/en-us/microsoft-copilot-studio/harnesses-overview?ref=azurebrasil.cloud) - [Clonar o agente no VS Code](https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-clone-agent?ref=azurebrasil.cloud) - [Sincronizar alterações](https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-synchronization?ref=azurebrasil.cloud) ### Quanto custa uma reunião esquecida? O prejuízo invisível que está drenando dinheiro da sua operação URL: https://www.azurebrasil.cloud/blog/quanto-custa-uma-reuniao-esquecida-o-prejuizo-invisivel-que-esta-drenando-dinheiro-da-sua-operacao/ Last updated: 2026-08-13T12:23:03.000Z US$ 259 bilhões por ano nos EUA e £50 bilhões por ano no Reino Unido. Esse é o custo estimado de reuniões improdutivas no estudo da [LSE](https://www.lse.ac.uk/news/latest-news-from-lse/j-october-2024/more-than-a-third-of-business-meetings-are-unproductive-due-to-a-lack-of-generational-diversity?ref=azurebrasil.cloud). > Na sua realidade de reuniões e *pós-calls*, você acha que seria muito diferente? **Ainda não existe um cálculo oficial sobre quanto as reuniões improdutivas custam às empresas brasileiras.** Mas um[ levantamento do Bitrix24](https://www.bitrix24.com.br/resources/reunioes-improdutivas-no-brasil.php?ref=azurebrasil.cloud), publicado em 2026, mostra que profissionais de PMEs brasileiras desperdiçam, em média, **14 horas por mês** em reuniões sem resultado. O impacto financeiro? Basta multiplicar esse tempo pelo custo da hora da sua equipe. Ao mesmo tempo, o trabalho virou uma maratona sem fim. Segundo o [Work Trend Index da Microsoft](https://www.lse.ac.uk/news/latest-news-from-lse/j-october-2024/more-than-a-third-of-business-meetings-are-unproductive-due-to-a-lack-of-generational-diversity?ref=azurebrasil.cloud), 40% das pessoas checam email antes das 6h, reuniões noturnas cresceram 16%, quase um terço volta à caixa de entrada às 22h e os profissionais sofrem interrupções a cada 2 minutos. Agora junta as duas pontas: custo financeiro alto com reunião improdutiva e uma rotina cada vez mais fragmentada. O resultado é previsível. Decisões são tomadas, mas se perdem no caminho. E quando se perdem, a empresa paga de novo, em retrabalho, atraso e desalinhamento. A própria [LSE ajuda a explicar parte do problema](https://www.lse.ac.uk/news/latest-news-from-lse/j-october-2024/more-than-a-third-of-business-meetings-are-unproductive-due-to-a-lack-of-generational-diversity?ref=azurebrasil.cloud). O ponto central do estudo não é só o número de improdutividade. É que reuniões com baixa diversidade geracional tendem a ser menos produtivas, com menos vozes relevantes sendo consideradas. Quando há mais representatividade e comportamentos mais inclusivos, a improdutividade cai. > *Calma! A intenção aqui não é militar sobre geração A, B, C, Century Pro Max...* É aqui que a conversa sobre IA precisa amadurecer. O problema não é apenas resumir reunião. O problema é garantir que tudo o que foi dito, inclusive contribuições que normalmente seriam engolidas pela dinâmica da sala, vire contexto estruturado para decisão e execução. ### O custo invisível que não aparece no orçamento Quase nenhuma empresa cria uma linha no DRE para "contexto perdido em reuniões". Mesmo assim, esse custo aparece todos os dias em quatro formas: - Retrabalho: o tema volta para discussão porque ninguém recupera a decisão original. - Atraso: tarefas ficam sem dono claro e o prazo escorrega. - Desalinhamento: áreas diferentes executam interpretações diferentes. - Fadiga: time sênior gasta energia reconstruindo contexto em vez de avançar. Esse custo não vem com fatura. Ele vem com perda de velocidade competitiva. ### Quando a reunião termina e ninguém sabe o que fazer, o prejuízo já começou Existe um tipo de desperdício que não aparece no orçamento, mas corrói resultado todos os dias: sair da reunião sem direção clara. [A Atlassian ouviu 5.000 trabalhadores](https://www.atlassian.com/blog/productivity/page-led-meetings?ref=azurebrasil.cloud) do conhecimento e encontrou um retrato preocupante, 54% afirmam que frequentemente terminam reuniões sem clareza sobre próximos passos ou responsáveis, e 77% dizem que muitas reuniões acabam apenas com o agendamento de outra reunião. Isso não é detalhe de rotina, é sintoma de operação travada. Quando decisão não vira ação, o time perde velocidade, retrabalho vira padrão e a empresa entra em um ciclo silencioso de custo alto e entrega baixa, onde se fala muito, decide pouco e executa menos ainda. ### Por que isso é estratégico [A McKinsey](https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/the-social-economy?ref=azurebrasil.cloud) já mostrava que ganhos de produtividade vêm de comunicação, colaboração e conhecimento compartilhado em escala, com potencial de elevar produtividade de trabalhadores do conhecimento em 20% a 25% quando essas dinâmicas são bem estruturadas. **Tradução prática: não é só sobre fazer mais reunião, nem sobre fazer menos reunião. É sobre não desperdiçar o que a reunião produz.** • Quando decisão não se perde, custo cai. • Quando contexto fica acessível, execução sobe. • Quando a empresa para de depender da memória de quem estava na call, produtividade deixa de ser discurso e vira sistema. ### Existe uma diferença entre armazenar informação e transformar informação em ação O Power ATA ataca exatamente esse vazamento. Ele transforma reunião em base operacional consultável: resumo, decisões, responsáveis, itens de ação e próximos passos. Depois, qualquer pessoa pode consultar em linguagem natural e recuperar o contexto certo em segundos. Isso não substitui liderança nem cultura inclusiva, mas reduz uma perda clássica: quando a reunião termina e a memória organizacional começa a falhar. Com preço de R$ 10 por usuário, ele resolve um problema que muitas empresas ainda tratam como inevitável, mesmo pagando caro por ele todos os meses. [Clique aqui para saber mais sobre o Power ATA.](https://share.azurebrasil.cloud/powerata-azbr?ref=azurebrasil.cloud) > #Publi? ### O que muda na prática Quando a empresa deixa de depender da memória individual e passa a depender de contexto estruturado, três mudanças aparecem rápido: **1) Menos retrabalho:** Assuntos deixam de voltar para a pauta por falta de registro confiável. **2) Mais responsabilidade:** Decisões passam a ter dono claro e acompanhamento objetivo. **3) Mais velocidade:** O time gasta menos tempo procurando informação e mais tempo executando. Esse é o tipo de ganho que não precisa de narrativa bonita. Ele aparece na operação. ## Conclusão > Quanto custa uma reunião esquecida? • Custa dinheiro, foco e vantagem competitiva. • Custa energia de time bom resolvendo problema repetido. • Custa tempo de liderança apagando incêndio de contexto. A empresa que ainda trata isso como “normal” não está só perdendo produtividade. Está financiando desperdício com folha, agenda e oportunidade. O Power ATA não resolve todos os problemas de cultura de reunião, nem substitui liderança. Mas ele resolve um dos mais caros e negligenciados: **garantir que decisão não morra quando a call termina.** Se a sua operação depende de reunião para decidir, ela precisa de um sistema para lembrar. Sem isso, cada reunião esquecida vira uma conta que você paga de novo. ### Li três artigos sobre custo de IA na mesma manhã: budget de coding agent virou requisito de arquitetura URL: https://www.azurebrasil.cloud/blog/li-tres-artigos-sobre-custo-de-ia-na-mesma-manha-budget-de-coding-agent-virou-requisito-de-arquitetura/ Last updated: 2026-08-12T12:25:22.000Z Olá pessoALL, hoje de manhã, tomando café e passando o olho no meu feed de notícias, três artigos apareceram um atrás do outro. Um do Visual Studio Blog sobre um controle novo de "thinking effort" nos modelos. Um do Microsoft Developer Community Blog chamado *"Surprise AI bill?"*. E um do Azure Architecture Blog explicando a hierarquia de budgets do GitHub Copilot. Times diferentes, blogs diferentes, tudo publicado na mesma semana. Esse post não é um case de cliente. É opinião mesmo, minha impressão depois de rodar Copilot num time próprio e de ajudar empresa a montar governança de IA: controle de budget em coding agent deixou de ser tarefa de FinOps e virou requisito de arquitetura. Do mesmo jeito que ninguém sobe API pública sem rate limit, ninguém deveria liberar agente de código numa empresa sem teto e sem alguém responsável por olhar o número. ## As três notícias e o que elas têm em comum [Tell your model when to think harder](https://devblogs.microsoft.com/visualstudio/tell-your-model-when-to-think-harder/?ref=azurebrasil.cloud): o Visual Studio 18.9 Insiders 2 passou a expor um controle de *thinking effort* por modelo, com níveis Low, Medium, High, Extra High e Max. Quanto mais alto, mais raciocínio e mais crédito consumido. [Surprise AI bill? GitHub Billing controls to the rescue!](https://techcommunity.microsoft.com/blog/azuredevcommunityblog/surprise-ai-bill-github-billing-controls-to-the-rescue/4541295?ref=azurebrasil.cloud): o Chris Noring conta a história de uma fatura que veio maior que o esperado e mostra o caminho de investigação, de SKU até cost center, antes de aplicar qualquer guardrail. [Mastering GitHub Copilot Budgets](https://techcommunity.microsoft.com/blog/azurearchitectureblog/mastering-github-copilot-budgets-how-to-prevent-surprise-overages-without-blocki/4542073?ref=azurebrasil.cloud): o Gaurav Bhardwaj destrincha a hierarquia de avaliação dos budgets e a ordem de precedência entre eles. Repara no que os três têm em comum. Nenhum deles fala de qualidade de código ou de produtividade. Os três falam de onde o dinheiro vaza. Quando blogs de produto da Microsoft convergem pro mesmo assunto na mesma semana, normalmente é porque o suporte está recebendo o mesmo ticket repetidas vezes. E eu já vivi esse ticket. [No post em que rodei o CSV do meu time](https://www.azurebrasil.cloud/blog/rodei-o-csv-do-meu-time-no-preview-tool-do-github-457-viram-2-668-e-mesmo-assim-vale-a-pena/) no preview tool do GitHub, a fatura de abril saiu de **$457,91** no modelo PRU para **$2.668,78** no modelo de AI Credits. Multiplicador de **5,83x**, com 9 pessoas. Agora extrapola isso pra uma empresa com 300 devs. Ou 3.000. ## O modelo mental que faltava: o parque aquático Antes de configurar qualquer coisa, você precisa entender como o GitHub cobra. E a analogia do parque aquático que o Gaurav usou é a melhor que eu já vi pra isso, então vou pegar emprestada e adaptar. Imagina sua empresa como um parque aquático: - A caixa d'água compartilhada (**included usage**): cada licença Copilot Business ($19/mês) joga 1.900 AI Credits na caixa e cada licença Enterprise ($39/mês) joga 3.900\. Não é balde individual, é um **pool único** da entidade de billing. - Fase 1, o pool: todo dev licenciado bebe dessa caixa, de graça, até ela secar. - Fase 2, o **metered**: caixa seca, a água extra custa $0,01 por crédito. E essa fase só liga se a empresa habilitar explicitamente a política de *AI Credit Paid Usage*. - A pulseirinha individual (**per-user budget**): limita quanto uma pessoa consome, somando fase 1 e fase 2. - A comanda do grupo (budget de org, cost center ou enterprise): só entra em ação na fase 2, limitando o gasto excedente. Na prática, o que isto significa é que existem dois tipos bem diferentes de limite convivendo no mesmo painel. Um conta crédito incluído mais crédito pago, o outro conta só o pago. Confundir os dois é a origem de quase todo "por que meu dev foi bloqueado se ainda tem budget sobrando?". E aqui já cabe a primeira ressalva honesta: se o seu time nunca estourou o pool, você nunca viu nada disso funcionar de verdade. Você tem uma configuração de billing que nunca foi exercitada, e isso é sorte, não segurança. ## Como o GitHub decide bloquear (a parte que ninguém lê) Toda vez que alguém dispara um Copilot Chat, um agente ou uma sessão de CLI, o GitHub avalia a requisição em três etapas, nessa ordem. **Passo 1, o guardrail pessoal (User-Level Budget).** Limita o consumo total da pessoa, pool mais metered, e é sempre hard stop. Entre os limites de usuário vale o mais específico: override individual, depois cost center (per user), depois universal. **Passo 2, a checagem do pool incluído.** Se a pessoa ainda tem espaço no limite dela, o sistema olha se sobrou crédito incluído. Dá pra cercar o pool por cost center, pra um time não drenar os créditos que outro time trouxe com as licenças dele. **Passo 3, os tetos de excedente.** Pool vazio, começa a cobrança de $0,01/crédito. Aí o sistema checa, nesta ordem: cost center budget, organization budget, enterprise budget. Agora a regra que fecha o raciocínio, e que o Gaurav batizou muito bem de **"lowest headroom wins"**: se o dev tem $10 sobrando na pulseirinha pessoal, mas o budget de enterprise tem só $1 até o teto, quem bloqueia é o enterprise. Vale sempre o limite que chega primeiro no fim. E o que acontece quando bloqueia? Param de funcionar Copilot Chat, CLI, agentes e modelos de raciocínio, ou seja, tudo que consome AI Credit. Continuam funcionando as code completions inline e as next edit suggestions, que vêm inclusas na licença. Isso é uma decisão de produto muito boa e quase ninguém comentou. Mesmo com a torneira fechada, o dev perde o agente mas mantém o autocomplete. **Vale ressaltar** um detalhe cruel: uma requisição bloqueada não cai automaticamente para um modelo mais barato, ela simplesmente falha. Se você esperava um fallback silencioso pra Haiku, esquece. ## Antes do limite, a investigação: siga o dinheiro Aqui é onde o post do Chris Noring brilha, e é onde eu mais concordo com ele. A tentação, quando a fatura assusta, é criar um teto baixo pra todo mundo na sexta-feira à tarde. **Mas** limite criado no susto não resolve o problema, só transfere a dor pro time de produto na segunda de manhã. O caminho é outro: descobrir de onde veio o aumento antes de decidir quanto cortar. Comece por qual produto cresceu. Em **Billing and licensing → Usage → Metered usage**, agrupe por billing category (SKU). Isso te diz se o crescimento é Copilot Enterprise, cloud agent, Actions ou outra coisa. Depois, qual organização. Um total consolidado esconde um pico concentrado numa unidade só. ![metered-usage-por-organizacao.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/metered-usage-por-organizacao.png) Por último, qual cost center. Organização ainda é grosso demais. Cost center é o agrupamento de billing que amarra o consumo a um time, programa ou função, ou seja, a uma pessoa que pode explicar o número. ![metered-usage-por-cost-center.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/metered-usage-por-cost-center.png) No exemplo do artigo, esse drill-down termina com um cost center concentrando a maior parte do consumo, numa média de **$20.000/mês**. Isso muda completamente a conversa. Em vez de "a IA está cara", você passa a discutir "esse time gasta $20.000 por mês, e o líder dele consegue dizer se isso está pagando ou não". Lição aprendida, e essa eu aprendi na marra olhando meu próprio CSV: sem cost center, todo mês vai ser "alguém" que estourou. Com cost center, vira "o squad X, e dá pra investigar". ## Onde quase todo mundo erra: o toggle que não vem ligado Você fez tudo certo. Investigou, achou o cost center, criou o budget de organização de $200.000 e saiu da tela com sensação de dever cumprido. ![budget-organization-200k.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/budget-organization-200k.png) **Mas** olha bem a caixinha *"Stop usage when budget limit is reached"*. Ela não vem marcada por padrão. E budgets de organização, cost center e enterprise, sem esse toggle ligado, não param nada: eles só mandam e-mail enquanto a conta continua subindo. Essa é a diferença entre expectativa e realidade que mais custa dinheiro. O admin acha que blindou a empresa, o gasto continua acumulando sem teto, e a fatura chega. Aí vem a reunião desconfortável em que alguém pergunta *"mas a gente não tinha configurado um budget?"*. E tem uma segunda armadilha, mais sutil, que aparece na letra miúda azul da tela: **"Usage before budget creation isn't counted in the current billing cycle"**. Se você criar o budget no dia 18 do ciclo, o consumo dos dias 1 a 17 não entra na conta, e a primeira fatura pode estourar o limite que está escrito na tela. É comportamento documentado, não é bug. Mas se ninguém te avisar, parece bug. ![budget-alertas-threshold.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/budget-alertas-threshold.png) Agora, sendo justo com quem projetou isso: deixar o `Stop usage` desligado é uma escolha legítima em cost center. O dono do time recebe alerta em 75%, 90% e 100%, e tem tempo de revisar o workload ou pedir mais teto antes de alguém travar no meio da sprint. É exatamente o que eu recomendo nos dois primeiros meses de qualquer piloto. O problema não é o toggle desligado. O problema é o toggle desligado no enterprise, sem ninguém saber que ele está desligado. ## Mea-culpa: agora existe budget por usuário de verdade Aqui eu preciso voltar atrás numa coisa que escrevi. No post anterior, eu disse que não existia budget no nível de usuário e ensinei o workaround: criar um cost center com uma pessoa só dentro, pra simular um teto individual. Funcionava, mas era gambiarra. Não precisa mais. O escopo **Users** apareceu no formulário de New budget, com direito a badge de *New*, e ele faz exatamente o que eu queria: define limite por usuário licenciado, contando crédito incluído e crédito pago. ![budget-escopo-users.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/budget-escopo-users.png) São três níveis, e a ordem importa. O **universal** é a linha de base pra todo mundo com licença. O **cost center (per user)** sobrescreve o universal para os usuários daquele cost center. E o **individual user** sobrescreve tudo, pra uma pessoa específica. ![budget-per-user-200.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/budget-per-user-200.png) O exemplo da tela deixa a conta explícita: $200 por usuário equivalem a 20.000 AI credits a $0,01/crédito. É o tipo de tradução que ajuda muito na hora de defender o número numa reunião de orçamento, porque tira a conversa do abstrato. Um exemplo prático de precedência: universal de $100, cost center de $200, override individual de $500\. O especialista fica com $500, os colegas do cost center dele ficam com $200 cada, e o resto da empresa com $100 cada. Os tetos compartilhados de org e enterprise continuam valendo em paralelo, e quem esgotar primeiro bloqueia. **Mas** a tentação óbvia aqui é errada. Quando o gasto assusta, o instinto é baixar o teto universal pra todo mundo, o que pune exatamente quem está entregando mais, porque heavy user quase sempre é heavy delivery. A ordem certa é a inversa: baseline razoável no universal, exceção por cost center onde o resultado justifica, e override individual só com necessidade documentada. Assim a exceção continua sendo fácil de auditar. ## O outro lado da moeda: cortar desperdício, não só cortar teto Até aqui, tudo que eu falei é sobre teto, e teto é defesa. Mas defesa sozinha não ganha jogo, e é por isso que o terceiro artigo, o do thinking effort, acabou sendo o mais interessante dos três apesar de parecer o menos relacionado. Renomear uma variável e debugar um memory leak não precisam do mesmo nível de raciocínio. Ainda assim, na configuração padrão, o modelo trata os dois igual. O controle novo do Visual Studio muda isso: no model picker, em **Manage models**, o thinking effort ganhou uma coluna própria, do lado das capabilities, do context size e do custo. ![vs-model-picker.webp](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/vs-model-picker.webp) Os níveis são Low, Medium (geralmente o default), High, e em alguns modelos Extra High e Max. Quanto mais alto, mais crédito. ![vs-thinking-effort.webp](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/vs-thinking-effort.webp) Por que isso importa tanto? Porque quando eu abri meu próprio drill-down de custo por modelo, o **Claude Opus 4.6** sozinho respondia por 63% do custo em AI Credits do time, e a família Anthropic inteira passava de 90%. Por unidade real de uso, Opus pesa cerca de **9x** o que pesa Sonnet. E isso com zero otimização consciente da minha parte, diga-se, porque eu mesmo deixei Opus como default achando que garantia a melhor resposta. O thinking effort adiciona um segundo eixo nessa conta. Antes você escolhia só qual modelo. Agora escolhe qual modelo e quanto ele pensa, mesmo modelo e mesma conversa, com esforço diferente por tarefa. Vale registrar que a comunidade reclamou disso nos comentários do artigo, e a crítica é justa: um leitor comparou a experiência com a de um piloto de corrida tendo que ajustar cada botãozinho antes de usar IA. Concordo em parte. Ajuste manual constante mata produtividade, e o ideal seria o modelo calibrar sozinho. Mas enquanto isso não existe, prefiro ter o botão do que não ter, principalmente porque em escala de empresa esse botão vira política e não escolha individual. E é aqui que os três artigos se encontram. Budget cobre o risco depois que o gasto aconteceu; escolha de modelo e thinking effort atacam o desperdício na origem. Governança que só aperta o teto faz o time reclamar, e governança que só solta o consumo faz o CFO reclamar. ## O roteiro que eu implementaria hoje Baseado no que eu já quebrei na minha própria tenant, essa é a sequência que eu seguiria numa empresa começando do zero. 1. **Habilite cost centers antes de habilitar qualquer teto.** Sem eles você não tem sujeito na frase. Um cost center por squad, ou por unidade de negócio, o que fizer sentido no seu organograma. 2. **Rode duas a quatro semanas só com alertas.** Budgets criados, `Stop usage` desligado, alertas de 75/90/100 ligados. Você quer enxergar o baseline antes de bloquear qualquer coisa, porque travar dev com teto mal calibrado no meio de uma sprint é a pior forma possível de começar. 3. **Ligue o `Stop usage` no enterprise.** Esse é o fusível, o que impede uma sessão agentic em loop de custar $5.000 num sábado. Se você for ligar em um lugar só, ligue nesse. 4. **Defina o universal per-user budget com base no dado, não no medo.** No meu time, os $2.668,78 de abril divididos por 9 pessoas dão $296 por cabeça. Um teto universal de $200 bloquearia gente todo mês. Pegue a média real do seu baseline e some uns 50% de folga. 5. **Crie exceções por cost center, não por pessoa.** Data science, plataforma e quem usa coding agent pesado vão precisar de mais. Exceção em grupo é auditável; 300 overrides individuais são um pesadelo de manutenção. 6. **Trate escolha de modelo e thinking effort como política, não como preferência.** Default sensato no settings do time (Sonnet ou equivalente em Medium), com Opus em High reservado pro que realmente exige, tipo refactor complexo e decisão de arquitetura. 7. **Nomeie um dono da revisão.** Alguém que olha alertas, requisições bloqueadas e resultado de negócio numa cadência fixa. Sem dono, budget vira um monte de e-mail que ninguém lê. 8. **Cuidado com budgets sobrepostos.** O menor teto sempre manda. Se você cria budget no enterprise e no cost center pra mesma SKU sem pensar, alguém vai ser bloqueado e ninguém vai entender o porquê. ![budgets-and-alerts-lista.png](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/budgets-and-alerts-lista.png) ## Lições aprendidas 1. **Coding agent entra na mesma categoria de risco de uma API pública sem rate limit.** Consumo elástico, disparado por automação, sem limite natural. Budget aí é decisão de arquitetura, não burocracia de FinOps. 2. **Budget sem `Stop usage` ligado não bloqueia nada.** Nos escopos de org, cost center e enterprise, o toggle desligado só manda e-mail enquanto a conta sobe. 3. **Investigue antes de limitar.** SKU, depois organização, depois cost center. Teto criado no susto castiga quem entrega e não conserta a origem do gasto. 4. **Teto uniforme é o jeito mais rápido de matar adoção.** Baseline universal, exceção por cost center, override individual só com necessidade documentada. 5. **Escolha de modelo e thinking effort cortam o desperdício na origem.** Budget só evita que o desperdício vire prejuízo, ele não reduz consumo burro. 6. **Quem hoje está dentro da cota é quem vai liderar o ranking de custo amanhã.** O subsídio invisível acabou, e o dado que confortava virou o dado que assusta. ## E na sua empresa? Se você administra Copilot em qualquer escala, faz um exercício de cinco minutos comigo. Abre **Billing and licensing → Budgets and alerts** e responde três perguntas, sem consultar ninguém: Quantos budgets existem hoje? Em quantos deles o `Stop usage` está realmente ligado? E quem é a pessoa, com nome e sobrenome, que recebe os alertas de 75%? Se você travou em alguma das três, esse é o seu backlog da semana. E se travou nas três, você não está sozinho: eu também travei quando fiz esse exercício na minha própria tenant, e é exatamente por isso que esse post existe. Me conta nos comentários: na sua empresa, o controle de gasto de IA é responsabilidade de quem? Do time de engenharia, do FinOps, ou daquele lugar confortável chamado "ninguém, até a fatura chegar"? ## Referências ### Os três artigos que originaram esse post - [Tell your model when to think harder](https://devblogs.microsoft.com/visualstudio/tell-your-model-when-to-think-harder/?ref=azurebrasil.cloud) — Rachel Kang, Visual Studio Blog: o controle de thinking effort no Visual Studio 18.9 Insiders 2 - [Surprise AI bill? GitHub Billing controls to the rescue!](https://techcommunity.microsoft.com/blog/azuredevcommunityblog/surprise-ai-bill-github-billing-controls-to-the-rescue/4541295?ref=azurebrasil.cloud) — Chris Noring: o caminho de investigação SKU → org → cost center e os guardrails - [Mastering GitHub Copilot Budgets](https://techcommunity.microsoft.com/blog/azurearchitectureblog/mastering-github-copilot-budgets-how-to-prevent-surprise-overages-without-blocki/4542073?ref=azurebrasil.cloud) — Gaurav Bhardwaj: a hierarquia de avaliação e a analogia do parque aquático ### Changelogs do GitHub - [Assign enterprise teams to cost centers](https://github.blog/changelog/2026-06-25-assign-enterprise-teams-to-cost-centers/?ref=azurebrasil.cloud) — atribuição de times a cost centers - [Per-user AI credit budgets available for cost centers](https://github.blog/changelog/2026-06-30-per-user-ai-credit-budgets-available-for-cost-centers/?ref=azurebrasil.cloud) — o escopo Users que substitui o workaround do cost center unitário - [Cost centers now support included usage caps](https://github.blog/changelog/2026-07-02-cost-centers-now-support-included-usage-caps/?ref=azurebrasil.cloud) — cerca no pool de créditos incluídos ### Documentação - [Setting up budgets to control spending on metered products](https://docs.github.com/en/billing/how-tos/set-up-budgets?ref=azurebrasil.cloud) — escopos, alertas e o toggle de stop usage - [Manage and monitor spending for GitHub Copilot](https://docs.github.com/en/copilot/how-tos/manage-and-track-spending?ref=azurebrasil.cloud) — hub de FinOps do Copilot - [Models and pricing](https://docs.github.com/en/copilot/reference/copilot-billing/models-and-pricing?ref=azurebrasil.cloud) — custo por modelo e por 1M tokens - [Pick, manage, and get the most from your models](https://devblogs.microsoft.com/visualstudio/pick-manage-and-get-the-most-from-your-models/?ref=azurebrasil.cloud) — tour completo da tela de gerenciamento de modelos do Visual Studio ### Posts relacionados aqui no blog - [Rodei o CSV do meu time no preview tool do GitHub: $457 viram $2.668](https://www.azurebrasil.cloud/blog/rodei-o-csv-do-meu-time-no-preview-tool-do-github-457-viram-2-668-e-mesmo-assim-vale-a-pena/) — os números reais que fundamentam esse post - [A Conta Chegou: GitHub Anuncia AI Credits e Marca 1º de Junho como o Fim da Era PRU](https://www.azurebrasil.cloud/blog/a-conta-chegou-github-anuncia-ai-credits-e-marca-1o-de-junho-como-o-fim-da-era-pru/) — a mecânica de PRU → AIC e pooled credits \[\]s e até a próxima. ### Azure Newsletter - 2026-08-10 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-08-10/ Last updated: 2026-08-10T12:04:00.000Z ### Azure Updates - [Zero Ops: Agents Operate, Humans Govern](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/zero-ops-agents-operate-humans-govern/ba-p/4545151?ref=azurebrasil.cloud) - [Announcing Grafana 13 Support in Azure Managed Grafana](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/announcing-grafana-13-support-in-azure-managed-grafana/ba-p/4545199?ref=azurebrasil.cloud) - [Smarter signals, broader coverage: UEBA anomalies on top of Behaviors layer and new data sources](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/smarter-signals-broader-coverage-ueba-anomalies-on-top-of/ba-p/4544384?ref=azurebrasil.cloud) - [Build Durable, Long-Running MCP Tasks on Azure App Service](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/build-durable-long-running-mcp-tasks-on-azure-app-service/ba-p/4545170?ref=azurebrasil.cloud) - [AI-powered playbook generator, now available to more customers](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/ai-powered-playbook-generator-now-available-to-more-customers/ba-p/4544385?ref=azurebrasil.cloud) - [Expanding the Azure Local Security Ecosystem with IBM QRadar and Splunk](https://techcommunity.microsoft.com/t5/azure-arc-blog/expanding-the-azure-local-security-ecosystem-with-ibm-qradar-and/ba-p/4535101?ref=azurebrasil.cloud) - [Public Preview: Nested API Support Comes to Microsoft Sentinel CCF](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/public-preview-nested-api-support-comes-to-microsoft-sentinel/ba-p/4537026?ref=azurebrasil.cloud) - [From Good to Great: We Put Agent Optimizer to the Test in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/from-good-to-great-we-put-agent-optimizer-to-the-test-in/ba-p/4543982?ref=azurebrasil.cloud) - [The Hidden Reason Your Foundry Agent Can't Reach Any of Your Private (Bring-Your-Own) Resources](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/the-hidden-reason-your-foundry-agent-can-t-reach-any-of-your/ba-p/4543619?ref=azurebrasil.cloud) - [Enabling the Compliance Security Profile (CSP) for HIPAA on Azure Databricks](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/enabling-the-compliance-security-profile-csp-for-hipaa-on-azure/ba-p/4541578?ref=azurebrasil.cloud) - [Generally Available: Windows Server 2016 Extended Security Updates enabled by Azure Arc](https://techcommunity.microsoft.com/t5/azure-arc-blog/generally-available-windows-server-2016-extended-security/ba-p/4543640?ref=azurebrasil.cloud) - [Microsoft Foundry's New Model Wave](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/microsoft-foundry-s-new-model-wave/ba-p/4543620?ref=azurebrasil.cloud) - [Pull request annotations on work item cards](https://devblogs.microsoft.com/devops/pull-request-annotations-on-work-item-cards/?ref=azurebrasil.cloud) - [From Distillation to Reinforcement Fine-Tuning: Hill-Climbing in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/from-distillation-to-reinforcement-fine-tuning-hill-climbing-in/ba-p/4543260?ref=azurebrasil.cloud) - [You can now use the Azure DevOps Service Connection instead of a PAT or Build Session token](https://devblogs.microsoft.com/devops/you-can-now-use-the-azure-devops-service-connection-instead-of-a-pat-or-build-session-token/?ref=azurebrasil.cloud) - [Beyond Model Evaluation: Choosing Between Microsoft Foundry and PyRIT for AI Red Teaming](https://techcommunity.microsoft.com/t5/microsoft-developer-community/beyond-model-evaluation-choosing-between-microsoft-foundry-and/ba-p/4538110?ref=azurebrasil.cloud) - [Zonal Resiliency in Azure: Application-Centric Goals, Recovery Plans, and Drills](https://techcommunity.microsoft.com/t5/itops-talk-blog/zonal-resiliency-in-azure-application-centric-goals-recovery/ba-p/4542514?ref=azurebrasil.cloud) - [Build and Deploy Confidential Virtual Machines on Azure Local (Public Preview)](https://techcommunity.microsoft.com/t5/azure-arc-blog/build-and-deploy-confidential-virtual-machines-on-azure-local/ba-p/4543995?ref=azurebrasil.cloud) - [Understanding the Standard HDD I/O unit size update and what it means for your workloads](https://techcommunity.microsoft.com/t5/azure-storage-blog/understanding-the-standard-hdd-i-o-unit-size-update-and-what-it/ba-p/4499128?ref=azurebrasil.cloud) - [Update WCF Relay applications to use TLS 1.2 or later](https://techcommunity.microsoft.com/t5/messaging-on-azure-blog/update-wcf-relay-applications-to-use-tls-1-2-or-later/ba-p/4544418?ref=azurebrasil.cloud) - [Exploring Multi-Agent Workflows with Microsoft Agent Framework](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/exploring-multi-agent-workflows-with-microsoft-agent-framework/ba-p/4542512?ref=azurebrasil.cloud) - [Introducing Real-Time Multichannel Speech-to-Text](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/introducing-real-time-multichannel-speech-to-text/ba-p/4541701?ref=azurebrasil.cloud) - [When Does RL Actually Help Fine-Tuning? A Difficulty-Controlled Study on Structured Generation](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/when-does-rl-actually-help-fine-tuning-a-difficulty-controlled/ba-p/4535077?ref=azurebrasil.cloud) - [Announcing Public Preview - Azure Private Link over IPv6](https://techcommunity.microsoft.com/t5/azure-networking-blog/announcing-public-preview-azure-private-link-over-ipv6/ba-p/4543978?ref=azurebrasil.cloud) - [Building a CCF Nested API Pull Connector: A Technical Lab Walkthrough](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/building-a-ccf-nested-api-pull-connector-a-technical-lab/ba-p/4537027?ref=azurebrasil.cloud) - [Azure DevOps Remote MCP Server is generally available](https://devblogs.microsoft.com/devops/azure-devops-remote-mcp-server-ga/?ref=azurebrasil.cloud) - [From Build to Run to Distribute: Autonomous Agents with Microsoft Foundry Agent Service Part 1/5](https://techcommunity.microsoft.com/t5/microsoft-developer-community/from-build-to-run-to-distribute-autonomous-agents-with-microsoft/ba-p/4541930?ref=azurebrasil.cloud) - [Agentic Migrations and Modernization: How the Azure Migrate Agent Keeps Your Intent Alive End to End](https://techcommunity.microsoft.com/t5/itops-talk-blog/agentic-migrations-and-modernization-how-the-azure-migrate-agent/ba-p/4542513?ref=azurebrasil.cloud) - [Use connectors with Managed Identity in the Logic Apps Standard extension](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/use-connectors-with-managed-identity-in-the-logic-apps-standard/ba-p/4539485?ref=azurebrasil.cloud) - [Azure Virtual Network routing appliance is now generally available](https://techcommunity.microsoft.com/t5/azure-networking-blog/azure-virtual-network-routing-appliance-is-now-generally/ba-p/4543616?ref=azurebrasil.cloud) - [Build Azure Skills Faster with Cloud Academy, a Visual Studio Subscriber Benefit](https://devblogs.microsoft.com/visualstudio/build-azure-skills-faster-with-cloud-academy-a-visual-studio-subscriber-benefit/?ref=azurebrasil.cloud) - [Cloud-Native Multi-Agent: Running Agents Safely on Kubernetes with Kars](https://techcommunity.microsoft.com/t5/microsoft-developer-community/cloud-native-multi-agent-running-agents-safely-on-kubernetes/ba-p/4543047?ref=azurebrasil.cloud) - [From Alert to Resolved: Building a Self-Healing Azure Platform with SRE Agent](https://techcommunity.microsoft.com/t5/itops-talk-blog/from-alert-to-resolved-building-a-self-healing-azure-platform/ba-p/4542491?ref=azurebrasil.cloud) - [Logic Apps Aviators Newsletter - August 2026](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-august-2026/ba-p/4543662?ref=azurebrasil.cloud) - [Built-In Observability for Serverless AI Agents on Azure Functions](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/built-in-observability-for-serverless-ai-agents-on-azure/ba-p/4542087?ref=azurebrasil.cloud) - [Building an operations assistant on Azure that waits for approval before it acts](https://devblogs.microsoft.com/all-things-azure/building-an-operations-assistant-on-azure-that-waits-for-approval-before-it-acts/?ref=azurebrasil.cloud) - [Announcing public preview: Markdown for Agents in Azure App Service](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/announcing-public-preview-markdown-for-agents-in-azure-app/ba-p/4537023?ref=azurebrasil.cloud) - [Check This Out! (CTO!) Guide (August 2026)](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/check-this-out-cto-guide-august-2026/ba-p/4543597?ref=azurebrasil.cloud) - [Microsoft Defender for Cloud Customer Newsletter](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/microsoft-defender-for-cloud-customer-newsletter/ba-p/4543596?ref=azurebrasil.cloud) - [Microsoft Foundry Now Has an AI Gateway Control Plane — What Changes for App Service](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/microsoft-foundry-now-has-an-ai-gateway-control-plane-what/ba-p/4538320?ref=azurebrasil.cloud) - [Simplify secure, zone-resilient outbound connectivity with Azure Firewall and StandardV2 NAT Gateway](https://techcommunity.microsoft.com/t5/azure-networking-blog/simplify-secure-zone-resilient-outbound-connectivity-with-azure/ba-p/4542573?ref=azurebrasil.cloud) - [Announcing Azure Linux on WSL - Beta](https://techcommunity.microsoft.com/t5/linux-and-open-source-blog/announcing-azure-linux-on-wsl-beta/ba-p/4542903?ref=azurebrasil.cloud) - [Learn how to use the four IQs: Web IQ, Work IQ, Fabric IQ, Foundry IQ](https://techcommunity.microsoft.com/t5/microsoft-developer-community/learn-how-to-use-the-four-iqs-web-iq-work-iq-fabric-iq-foundry/ba-p/4542916?ref=azurebrasil.cloud) - [Designing Azure Networks That Scale: From Small Deployments to Enterprise-Grade](https://techcommunity.microsoft.com/t5/itops-talk-blog/designing-azure-networks-that-scale-from-small-deployments-to/ba-p/4542489?ref=azurebrasil.cloud) ### GitHub Updates - [A guide to slash commands in the GitHub Copilot app](https://github.blog/ai-and-ml/github-copilot/a-guide-to-slash-commands-in-the-github-copilot-app/?ref=azurebrasil.cloud) - [How we took malware advisories beyond npm](https://github.blog/security/supply-chain-security/how-we-took-malware-advisories-beyond-npm/?ref=azurebrasil.cloud) - [How the GitHub legal team used Copilot CLI to streamline their workflows](https://github.blog/ai-and-ml/github-copilot/how-the-github-legal-team-used-copilot-cli-to-streamline-their-workflows/?ref=azurebrasil.cloud) - [Turn one giant AI-generated pull request to a reviewable stack](https://github.blog/engineering/turn-one-giant-ai-generated-pull-request-to-a-reviewable-stack/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Microsoft Foundry com Managed Identity consumindo um MCP Server protegido pelo Microsoft Entra ID](https://www.azurebrasil.cloud/blog/microsoft-foundry-com-managed-identity-consumindo-um-mcp-server-protegido-pelo-microsoft-entra-id/) - [Como Criar um Agente no Microsoft 365 Copilot](https://www.azurebrasil.cloud/blog/como-criar-um-agente-no-microsoft-365-copilot/) - [Copilot Studio ou Microsoft Foundry? A pergunta está errada (e o meu primeiro reflexo estava também)](https://www.azurebrasil.cloud/blog/copilot-studio-ou-microsoft-foundry-a-pergunta-esta-errada-e-o-meu-primeiro-reflexo-estava-tambem/) - [Azure Newsletter - 2026-08-03](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-08-03/) ### Microsoft Foundry com Managed Identity consumindo um MCP Server protegido pelo Microsoft Entra ID URL: https://www.azurebrasil.cloud/blog/microsoft-foundry-com-managed-identity-consumindo-um-mcp-server-protegido-pelo-microsoft-entra-id/ Last updated: 2026-08-07T12:07:12.000Z O [Microsoft Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/what-is-azure-ai-foundry?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) é a plataforma da Microsoft para construir, orquestrar e operar agentes de IA, reunindo modelos, ferramentas e serviços de dados em um único lugar. Um dos recursos mais interessantes do Foundry Agent Service é a capacidade de conectar um agente a um [Model Context Protocol (MCP) Server remoto](https://learn.microsoft.com/en-us/azure/ai-foundry/agents/how-to/tools/model-context-protocol?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), permitindo que o modelo chame ferramentas reais expostas por uma API sua. O problema é que, na prática, esse MCP Server quase nunca pode ficar aberto para qualquer caller. Neste artigo vou mostrar como protegi um MCP Server com Microsoft Entra ID de um jeito que só o próprio Foundry consegue chamar, e como configurar o agente no portal para testar o fluxo completo de criação e listagem de livros. O cenário aqui é simples de entender: vamos ter um MCP Server, o **Books.Mcp**, que expõe operações de CRUD sobre livros. Esse servidor está protegido pelo [Microsoft Entra ID](https://learn.microsoft.com/pt-br/entra/identity-platform/scenario-protected-web-api-app-configuration?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), e a regra de negócio é clara: só podemos aceitar chamadas vindas do projeto do Foundry configurado, mais especificamente da identidade gerenciada associada a esse projeto. Nenhum outro client, usuário ou aplicação, mesmo dentro do mesmo tenant, consegue chamar as tools desse MCP server. Esse é exatamente o tipo de arquitetura descrita na [documentação de MCP authentication do Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/agents/how-to/mcp-authentication?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), que lista quatro formas de autenticar um MCP Server a partir de um agente: **Project Managed Identity**, **Agent Identity**, [OAuth identity passthrough](https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-2/) ou **API Key**. Para esse post, vamos usar o caminho de Project Managed Identity, onde o próprio projeto do Foundry obtém um token de aplicação (app-only) via client credentials e o repassa nas chamadas ao MCP Server. Vale entender quando essa integração via Managed Identity, e não via OAuth identity passthrough, faz sentido. O [identity passthrough](https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-2/) é indicado quando você precisa que o agente atue em nome do usuário final, propagando o contexto de autorização dele para o backend, útil quando cada usuário tem permissões diferentes dentro da API alvo. Já a Project Managed Identity é indicada quando o agente representa a própria aplicação, sem depender de um usuário logado, e você só precisa garantir que a chamada realmente partiu daquele projeto específico do Foundry, e de nenhum outro lugar. É o caso típico de um agente automatizado, rodando em produção, que precisa consultar ou manipular dados através de um MCP Server interno da empresa. Como o Books.Mcp representa justamente esse cenário (um agente de back office manipulando um catálogo de livros), o modelo de app-only token com validação por Object ID foi a escolha mais direta. Do lado do Entra ID, a base de tudo é o conceito de [identidade](https://learn.microsoft.com/en-us/azure/ai-foundry/agents/concepts/agent-identity?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), que explica como os agentes do Foundry obtêm tokens para chamar serviços externos. Cada projeto do Foundry possui uma identidade própria no Entra ID, e é essa identidade, e não a do usuário que está testando no sandbox, que aparece nos claims do token JWT quando o MCP Server recebe a requisição. Para o MCP Server aceitar esse token, é preciso primeiro registrar uma App Registration no Entra ID. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/1.png) Depois de criada, o App Registration expõe dois valores essenciais para a configuração da API: o Application (client) ID e o Directory (tenant) ID, ambos visíveis na página de visão geral do registro. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/2.png) O próximo passo é declarar o Application ID URI do MCP Server, feito na aba Expose an API do App Registration, seguindo o formato **api://**, conforme as regras de formato descritas em identifier [URI restrictions](https://learn.microsoft.com/pt-br/entra/identity-platform/identifier-uri-restrictions?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). Esse URI é o audience que o token emitido para o Foundry precisa carregar para ser aceito pela API. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/3.png) Com o App Registration pronto, o próximo pedaço é o projeto do Foundry em si, que já está criado no meu portal. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/4.png) Cada projeto do Foundry tem um Object ID de identidade próprio, e é justamente esse valor que precisamos capturar para configurar a autorização no lado da API. É esse Object ID que vai para o appsettings do MCP Server como o único **caller** permitido. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/5.png) Passando para o código, o projeto já está na raiz do repositório, dentro da pasta **Books.Mcp.** O ponto de entrada é o **Program.cs**: ```csharp using Books.Mcp.Extensions; var builder = WebApplication.CreateBuilder(args); builder.AddConfigurations(); var app = builder.Build(); app.ConfigureApplication(); app.Run(); public partial class Program { } ``` **Program.cs** - Cria o WebApplicationBuilder, chama AddConfigurations() para registrar autenticação, autorização, EF Core e o servidor MCP, depois builda e executa a aplicação. Toda a parte de autenticação e autorização fica concentrada em **Extensions/ConfigurationExtensions.cs**, que é o coração da proteção do MCP Server: ```csharp public static void AddConfigurations(this WebApplicationBuilder builder) { var services = builder.Services; var configuration = builder.Configuration; var tenantId = configuration["AzureAd:TenantId"] ?? throw new InvalidOperationException("AzureAd:TenantId is required."); var apiClientId = configuration["AzureAd:ClientId"] ?? throw new InvalidOperationException("AzureAd:ClientId is required."); var foundryObjectId = configuration["FoundryCaller:ObjectId"] ?? throw new InvalidOperationException("FoundryCaller:ObjectId is required."); var applicationIdUri = $"api://{apiClientId}"; services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(configuration.GetSection("AzureAd")); services.Configure(JwtBearerDefaults.AuthenticationScheme, options => { options.TokenValidationParameters.ValidateAudience = true; options.TokenValidationParameters.ValidAudiences = [apiClientId, applicationIdUri]; }); services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.AddPolicy("FoundryProjectOnly", policy => { policy.RequireAuthenticatedUser(); policy.RequireAssertion(context => IsFoundryProjectCaller(context.User, tenantId, foundryObjectId)); }); }); services.AddDbContext(options => options.UseInMemoryDatabase("BooksDb")); services.AddScoped(); services.AddMcpServer() .WithHttpTransport(options => options.Stateless = true) .WithTools(); } public static void ConfigureApplication(this WebApplication app) { app.UseAuthentication(); app.UseAuthorization(); app.MapGet("/health", () => Results.Ok(new { status = "Healthy", message = "Books MCP Server is running." })) .AllowAnonymous(); app.MapMcp("/mcp").RequireAuthorization("FoundryProjectOnly"); } private static bool IsFoundryProjectCaller(ClaimsPrincipal caller, string tenantId, string foundryObjectId) { var tokenTenantId = caller.FindFirstValue("tid") ?? caller.FindFirstValue("http://schemas.microsoft.com/identity/claims/tenantid"); var tokenObjectId = caller.FindFirstValue("oid") ?? caller.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier"); var tokenSubject = caller.FindFirstValue("sub") ?? caller.FindFirstValue(ClaimTypes.NameIdentifier); var isApplicationOnlyToken = !string.IsNullOrWhiteSpace(tokenObjectId) && !string.IsNullOrWhiteSpace(tokenSubject) && string.Equals(tokenObjectId, tokenSubject, StringComparison.OrdinalIgnoreCase); var isAllowedTenant = string.Equals(tokenTenantId, tenantId, StringComparison.OrdinalIgnoreCase); var isAllowedFoundryIdentity = string.Equals(tokenObjectId, foundryObjectId, StringComparison.OrdinalIgnoreCase); return isApplicationOnlyToken && isAllowedTenant && isAllowedFoundryIdentity; } ``` **AddConfigurations()** - Lê TenantId, ClientId e o ObjectId da identidade do Foundry a partir da configuração, monta o Application ID URI no formato **api://**, registra a autenticação JWT Bearer via [AddMicrosoftIdentityWebApi()](https://learn.microsoft.com/en-us/entra/msidweb/getting-started/quickstart-webapi?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) e restringe os audiences válidos ao client ID puro e ao Application ID URI. - Define a política FoundryProjectOnly, que exige usuário autenticado e aplica a validação customizada IsFoundryProjectCaller(). - Registra o EF Core InMemory para persistir os livros e o servidor MCP com a ferramenta **BookTools**. **ConfigureApplication()** - Ativa autenticação e autorização, expõe um endpoint **/health** anônimo para health checks do App Service, e mapeia o endpoint **/mcp** exigindo a política **FoundryProjectOnly.IsFoundryProjectCaller()** - Compara o oid (Object ID) com o sub (Subject) do token para confirmar que se trata de um token de aplicação (app-only), já que nesse tipo de token os dois claims são iguais, ao contrário de um token de usuário delegado. - Valida se o tid (Tenant ID) do token corresponde ao tenant configurado e se o oid corresponde exatamente ao Object ID da identidade do projeto do Foundry, o mesmo valor visto na imagem5. - Só retorna true quando as três condições são verdadeiras, garantindo que nenhum outro chamador, mesmo com um token válido do mesmo tenant, consiga acessar o **/mcp**. Essa validação por claims é o que a documentação de [**access token claims reference** ](https://learn.microsoft.com/en-us/entra/identity-platform/access-token-claims-reference?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud)descreve em detalhes, explicando o significado de aud, tid, oid, sub, appid e roles dentro de um token emitido pelo Entra ID. Combinando ValidAudiences com a checagem manual de oid e tid, o Books.Mcp implementa uma autorização baseada em [ACL](https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.web.microsoftidentityoptions.allowwebapitobeauthorizedbyacl?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) em vez de depender de app roles, o que é suficiente quando existe apenas um chamador confiável. As entidades e o restante da aplicação seguem um desenho enxuto. O modelo de domínio é a classe Book: ```csharp public class Book { public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; } ``` A classe **Book** representa um livro com **Id**, **Name** e **Description**, persistido via [EF Core InMemory](https://learn.microsoft.com/en-us/ef/core/providers/in-memory/?tabs=dotnet-core-cli?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) pelo BooksDbContext. O **BooksDbContext** apenas registra esse mapeamento simples: ```csharp public class BooksDbContext(DbContextOptions options) : DbContext(options) { public DbSet Books => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => { entity.HasKey(book => book.Id); entity.Property(book => book.Name).IsRequired(); entity.Property(book => book.Description).IsRequired(); }); } } ``` **BooksDbContext** expõe o **DbSet** e configura a chave primária e a obrigatoriedade dos campos Name e Description. A regra de negócio do CRUD fica isolada no **BookService**, que o **BookTools** apenas invoca: ```csharp public class BookService(BooksDbContext dbContext) { public async Task CreateAsync(string name, string description, CancellationToken cancellationToken) { var book = new Book { Id = Guid.NewGuid(), Name = name, Description = description, }; dbContext.Books.Add(book); await dbContext.SaveChangesAsync(cancellationToken); return book; } public async Task> GetAllAsync(CancellationToken cancellationToken) { return await dbContext.Books.AsNoTracking().ToListAsync(cancellationToken); } public async Task GetByIdAsync(Guid id, CancellationToken cancellationToken) { return await dbContext.Books.AsNoTracking().FirstOrDefaultAsync(book => book.Id == id, cancellationToken); } public async Task UpdateAsync(Guid id, string? name, string? description, CancellationToken cancellationToken) { var book = await dbContext.Books.FirstOrDefaultAsync(book => book.Id == id, cancellationToken); if (book is null) { return null; } if (!string.IsNullOrWhiteSpace(name)) { book.Name = name; } if (!string.IsNullOrWhiteSpace(description)) { book.Description = description; } await dbContext.SaveChangesAsync(cancellationToken); return book; } public async Task DeleteAsync(Guid id, CancellationToken cancellationToken) { var book = await dbContext.Books.FirstOrDefaultAsync(book => book.Id == id, cancellationToken); if (book is null) { return false; } dbContext.Books.Remove(book); await dbContext.SaveChangesAsync(cancellationToken); return true; } } ``` - **CreateAsync() -** Cria um novo Book com Guid gerado, adiciona ao contexto e persiste. - **GetAllAsync()** \- Retorna todos os livros sem tracking, já que é uma operação somente leitura. - **GetByIdAsync() -** Busca um único livro pelo Id, retornando null quando não encontrado. - **UpdateAsync() -** Localiza o livro pelo Id e atualiza Name e/ou Description apenas quando os novos valores não são vazios, mantendo o restante intacto. - **DeleteAsync()** \- Remove o livro pelo Id e retorna um booleano indicando se a exclusão aconteceu. Por fim, o **BookTools** é a camada que o Foundry realmente enxerga como ferramentas MCP, decorada com os atributos do pacote **ModelContextProtocol.AspNetCore**: ```csharp [McpServerToolType] public sealed class BookTools { [McpServerTool(Name = "create_book"), Description("Creates a new book with a name and description.")] public static async Task CreateBook( BookService bookService, [Description("Name of the book. Required.")] string name, [Description("Description of the book. Required.")] string description, CancellationToken cancellationToken) { var book = await bookService.CreateAsync(name, description, cancellationToken); return book; } [McpServerTool(Name = "get_books"), Description("Lists all books.")] public static async Task GetBooks(BookService bookService, CancellationToken cancellationToken) { return await bookService.GetAllAsync(cancellationToken); } } ``` Toda essa configuração de tenant, client e chamador permitido vem do appsettings.json, com os valores reais preenchidos por ambiente: ```json { "AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "", "ClientId": "", "AllowWebApiToBeAuthorizedByACL": true }, "FoundryCaller": { "ObjectId": "" } } ``` Com o código pronto, falta colocar o Books.Mcp no ar. O deploy é feito em um [Azure App Service ](https://learn.microsoft.com/en-us/azure/app-service/overview?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) já existente, através do **deploy.sh**, que primeiro garante uma sessão ativa via az login, depois publica o projeto em modo Release e envia o pacote via ZIP Deploy: ```bash chmod +x deploy.sh ./deploy.sh ``` Rodando o script, ele valida se o Azure CLI está autenticado, confirma que o App Service de destino existe no resource group informado, publica o **Books.Mcp.csproj**, compacta a saída e chama az webapp deploy com o pacote gerado, reiniciando a aplicação ao final. O resultado é o endpoint **https://.azurewebsites.net/mcp** pronto para receber chamadas autenticadas do Foundry. Com o **MCP Server** no ar, a última etapa é configurar o agente dentro do Foundry Agent Service. Primeiro, criamos um agente novo, usando o modelo gpt-5.6-luna como LLM por trás das respostas. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/6.png) Depois, dentro das configurações do agente, adicionamos Books.Mcp como uma ferramenta do tipo MCP Server, informando a URL do endpoint **/mcp** publicado no App Service e selecionando o modo de autenticação Project Managed Identity, exatamente o que o código em ConfigurationExtensions.cs espera validar. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/7.png) Com o agente configurado, testamos diretamente no sandbox do Foundry, pedindo para ele criar um novo livro através da ferramenta **create\_book**. A resposta confirma que o token emitido para o projeto do Foundry passou pela política **FoundryProjectOnly** sem nenhum erro 401 ou 403. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/8.png) Em seguida, pedimos para o agente listar os livros cadastrados, o que aciona a ferramenta **get\_books** e devolve, entre outros, o livro criado no teste anterior. Isso comprova que o mesmo agente, com a mesma identidade, consegue tanto escrever quanto ler dados através do MCP Server protegido. Em cenários onde o agente precisa herdar as permissões de um usuário específico, vale considerar o modelo de OAuth identity passthrough descrito na documentação de MCP authentication, que já explorei em dois artigos anteriores: OAuth Identity Passthrough no Foundry Agent Service com MCP Server customizado em .NET, [Parte 1](https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-1) e [**Parte 2**](https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-2). Você já pode baixar o projeto por esse [link](https://github.com/TallesValiatti/MsftFoundryMcpApplicationAccess?ref=azurebrasil.cloud), e não esquece de me seguir no [LinkedIn](https://www.linkedin.com/in/tallesvaliatti/?ref=azurebrasil.cloud)! Até a próxima, abraços! ### Como Criar um Agente no Microsoft 365 Copilot URL: https://www.azurebrasil.cloud/blog/como-criar-um-agente-no-microsoft-365-copilot/ Last updated: 2026-08-06T12:52:16.000Z > **O que você vai aprender:** Como criar um agente no Microsoft 365 Copilot com o Agent Builder, selecionar fontes confiáveis, testar o acesso e reconhecer quando o Copilot Studio passa a ser necessário. ## Pré-requisitos | Requisito | Obrigatório? | Notas | | ----------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------ | | Assinatura Microsoft 365 compatível | Sim | Confirme a disponibilidade do Agent Builder e as capacidades liberadas para seu tenant. | | Acesso ao Microsoft 365 Copilot | Sim | O Agent Builder é acessado pela opção **Create agent** no Microsoft 365 Copilot. | | Fontes de conhecimento revisadas | Sim | O piloto precisa de conteúdo atual, com responsáveis definidos e permissões corretas. | | Grupo piloto | Recomendado | Comece com usuários que conhecem o processo e conseguem avaliar as respostas. | | Acesso de rede ao Power Platform | Conforme ambiente | O Agent Builder usa o endpoint \*.api.powerplatform.com para autoria, configuração, publicação e compartilhamento. | --- ## O Help Desk Não Precisa Responder Sempre a Mesma Pergunta Em muitas organizações, o suporte interno recebe as mesmas perguntas toda semana: como solicitar um equipamento, onde está a política de férias, qual procedimento seguir para acessar um sistema ou quem aprova determinada solicitação. O problema não é só volume. A resposta costuma ficar dividida entre um PDF no SharePoint, uma mensagem antiga no Teams e a memória de quem atende. Quando a informação muda, o usuário continua recebendo a versão que alguém lembra de cabeça. Um [agente declarativo](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/overview-declarative-agent?ref=azurebrasil.cloud) no Microsoft 365 Copilot pode concentrar essa experiência. Ele recebe instruções específicas e fontes de conhecimento delimitadas para responder dentro de um contexto. Não é uma central de automação por si só. É uma forma de transformar uma base bem organizada em uma conversa mais útil para o usuário final. Esse detalhe muda o ponto de partida. Não comece pelo botão **Create agent**. Comece pela pergunta que se repete, pelo público que precisa da resposta e pela fonte que já deveria ser a referência oficial. > **Recomendação:** O primeiro caso de uso deve ser interno, ter um público delimitado e depender de uma base de informações que a organização já consegue revisar. Suporte a políticas, onboarding e procedimentos são candidatos melhores do que processos críticos ou integrações complexas. ## Quando o Agent Builder É Suficiente O [Agent Builder](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/agent-builder?ref=azurebrasil.cloud) é a opção sem código para criar agentes declarativos dentro do Microsoft 365 Copilot. Ele atende bem a cenários diretos: orientar um novo colaborador, responder perguntas sobre procedimentos internos ou ajudar uma equipe a consultar uma coleção de documentos confiáveis. A vantagem não está em criar um agente em poucos minutos. Está em criar uma experiência com escopo. Um agente de suporte interno pode, por exemplo, ser instruído a responder somente sobre políticas de trabalho remoto, benefícios e abertura de chamados. Quando não encontrar uma resposta nas fontes definidas, ele deve dizer isso em vez de completar a lacuna com uma suposição. Esse é um uso adequado para um primeiro piloto porque permite validar três pontos que continuam importantes mesmo em projetos maiores: - A documentação está atualizada e é fácil de localizar? - As permissões do SharePoint correspondem ao público que deve consultar a informação? - As perguntas reais dos usuários cabem no escopo que foi definido? O Agent Builder oferece fontes de conhecimento como conteúdo do SharePoint, conteúdo web e dados disponibilizados por Copilot connectors. Ele também permite testar o agente antes de compartilhá-lo. A ferramenta não substitui a organização da informação. Se a base estiver desatualizada, contraditória ou aberta para pessoas que não deveriam acessá-la, o agente apenas deixa esse problema mais visível. ## Defina o Escopo Antes de Configurar o Agente Antes de abrir o portal, escreva um briefing de uma página. Ele evita que o agente vire uma caixa de perguntas genérica com uma lista longa de documentos anexados. | Pergunta | Exemplo para um agente de suporte interno | | --------------------------------------------- | -------------------------------------------------------------------------------------------- | | Quem vai usar? | Colaboradores da organização, sem acesso a conteúdo de RH restrito. | | Qual problema resolve? | Dúvidas recorrentes sobre onboarding, equipamentos e procedimentos internos. | | Quais fontes pode consultar? | Biblioteca de políticas revisadas, portal de onboarding e base de conhecimento do help desk. | | O que fica fora do escopo? | Aprovação de solicitações, consulta de dados pessoais e alteração de registros. | | Como o agente deve agir diante de uma lacuna? | Informar que não encontrou conteúdo confiável e encaminhar o usuário ao canal de suporte. | A curadoria das fontes merece mais atenção do que o texto das instruções. Escolha documentos com proprietário definido, data de revisão e linguagem que o usuário final consiga entender. Uma biblioteca com procedimentos concorrentes não se torna confiável porque foi adicionada ao Copilot. Também vale revisar o que está exposto no SharePoint antes de conectar uma fonte. O [Microsoft 365 Copilot](https://learn.microsoft.com/en-us/microsoft-365-copilot/microsoft-365-copilot-overview?ref=azurebrasil.cloud) respeita as permissões existentes. Isso é uma proteção necessária, mas não corrige oversharing. Se um usuário já consegue abrir um documento inadequado, um agente também pode retornar informação baseada nesse conteúdo. ## Criando o Primeiro Agente no Portal O Agent Builder pode ser acessado pelo Microsoft 365 Copilot em `microsoft365.com/chat`,`portal.office.com` e também pela experiência do Copilot no Teams. O caminho mais simples é selecionar **Create agent** e iniciar a configuração guiada. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image.png) ### Dê ao Agente uma Função Clara Comece com um nome que descreva a responsabilidade, não a tecnologia. "Assistente de Onboarding" informa mais do que "Copilot RH". Em seguida, escreva instruções curtas e operacionais. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-1.png) Uma instrução inicial pode seguir esta lógica: 1. Explique qual público o agente atende. 2. Defina os assuntos que ele pode responder. 3. Determine quais fontes devem sustentar as respostas. 4. Oriente o comportamento quando não houver informação suficiente. 5. Proíba conclusões sobre assuntos que estão fora do escopo. Não tente antecipar todas as perguntas no primeiro texto. O objetivo do piloto é descobrir as perguntas que faltaram e melhorar as fontes ou as instruções com base em evidência. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-2.png) ### Adicione Apenas Fontes que Você Consegue Defender Inclua as **fontes de conhecimento** uma por vez. Para cada fonte, confirme três coisas: ela é atual, tem um responsável e o público piloto já possui a permissão correta para consultá-la. Se o caso usar **conteúdo web**, confirme antes se a política de busca na web está liberada no tenant. A documentação do Agent Builder informa que uma política administrativa pode bloquear conteúdo web mesmo que a opção continue visível na interface. Nesse caso, a política prevalece sobre o controle exibido no painel. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-3.png) Para um agente de suporte interno, comece com poucas fontes. Uma biblioteca de procedimentos revisada é um começo melhor do que apontar para todos os sites do SharePoint. Depois que o piloto demonstrar utilidade, amplie o escopo de forma consciente. ### Teste Perguntas que o Usuário Faria de Verdade O painel de teste existe para verificar a experiência antes do compartilhamento. Não limite o teste a perguntas cuja resposta você já conhece. Use uma matriz simples: | Tipo de pergunta | O que validar | | -------------------------------- | ---------------------------------------------------------------------------------- | | Pergunta conhecida | A resposta cita ou se baseia na fonte correta. | | Pergunta ambígua | O agente pede contexto em vez de assumir uma intenção. | | Pergunta fora do escopo | O agente declara o limite e indica o canal adequado. | | Pergunta sobre conteúdo restrito | O usuário sem permissão não recebe informação que não poderia acessar diretamente. | ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-4.png) Registre as respostas problemáticas. Às vezes a correção está na instrução. Em outros casos, o documento é antigo, a permissão está errada ou a pergunta revela que o processo não foi documentado. Esse diagnóstico é um resultado útil do piloto, mesmo quando a primeira resposta do agente não é perfeita. ## Compartilhar Exige Governança, Não Só um Link Depois de testar, a tentação é compartilhar o agente com toda a organização. Evite esse salto. Escolha um grupo pequeno que execute o processo com frequência e consiga relatar se as respostas ajudam ou confundem. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/08/image-5.png) Administradores podem **controlar a disponibilidade do Agent Builder** na organização e gerenciar agentes. Antes de ampliar o público, valide se a política de uso, o proprietário do conteúdo e o canal de suporte estão definidos. O agente deve ter alguém responsável por revisar fontes, analisar perguntas recorrentes e ajustar o escopo quando o processo mudar. Há também limites que precisam entrar na expectativa do projeto. Agentes criados pelo Microsoft 365 Copilot não podem ser usados no chat do Teams. O compartilhamento automático de arquivos e pastas do SharePoint tem limitações para determinados públicos. Esses pontos não invalidam um piloto de suporte interno, mas impedem que ele seja apresentado como resposta para qualquer cenário de atendimento. ## Quando o Copilot Studio Passa a Ser o Caminho Certo O Agent Builder é a escolha certa enquanto o trabalho principal é responder perguntas a partir de fontes curadas. Quando o agente precisa executar um processo, a conversa muda de categoria. | Necessidade | Agent Builder no Microsoft 365 Copilot | Copilot Studio | | --------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------ | | Responder perguntas sobre uma base interna revisada | Adequado para começar | Também possível, mas pode ser mais do que o caso exige | | Acionar fluxo de aprovação ou abertura de chamado | Não é o foco da ferramenta | Adequado com fluxos e ferramentas | | Consultar ou atualizar sistema por API | Não atende a esse cenário complexo | Adequado com conectores e ações | | Reagir a evento ou executar automação programada | Não é o foco da ferramenta | Adequado com fluxos e gatilhos | | Controlar uma conversa com variáveis e condições | Capacidade limitada para processos complexos | Adequado para lógica conversacional e tópicos | | Publicar em outros canais ou integrar uma aplicação | Limitado ao cenário do Microsoft 365 Copilot | Adequado para distribuição multicanal e integração | Essa não é uma escada obrigatória. Um agente de suporte interno bem delimitado pode continuar no Agent Builder por muito tempo. O [Copilot Studio](https://learn.microsoft.com/en-us/microsoft-copilot-studio/fundamentals-what-is-copilot-studio?ref=azurebrasil.cloud) entra quando a organização precisa combinar conhecimento com ação: chamar um conector, executar um fluxo, coletar dados, atualizar um sistema ou controlar uma jornada mais estruturada. Minha recomendação é não começar no Copilot Studio apenas porque ele tem mais recursos. Primeiro confirme que há uma pergunta recorrente, uma base confiável e usuários que realmente precisam da experiência. Depois, quando o processo exigir integração ou automação, a migração deixa de ser uma aposta e passa a ser uma decisão técnica justificável. ## Um Piloto Pequeno Mostra Onde o Agente Ajuda Escolha um processo interno com documentação suficiente para uma primeira rodada. Onboarding, políticas de trabalho remoto, procedimentos de solicitação de equipamento ou uma base de conhecimento do help desk são bons candidatos. Defina um grupo piloto, acompanhe as perguntas e estabeleça três sinais de sucesso: - O agente responde às dúvidas recorrentes usando fontes que o time reconhece como corretas. - O piloto revela lacunas de documentação que antes apareciam somente em chamados ou mensagens. - A equipe consegue identificar quais perguntas pedem automação, integração ou um fluxo mais controlado. O primeiro agente não precisa resolver todo o suporte interno. Ele precisa responder bem a um problema específico, sem ampliar indevidamente o acesso à informação. Quando isso acontece, a organização ganha uma base concreta para melhorar o conteúdo, ajustar permissões e decidir se o próximo passo continua simples ou exige Copilot Studio. ## Referências - [Agent Builder in Microsoft 365 Copilot](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/agent-builder?ref=azurebrasil.cloud) - [Choose the Right Tool to Build a Declarative Agent for Microsoft 365 Copilot](https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/declarative-agent-tool-comparison?ref=azurebrasil.cloud) - [Overview - Microsoft Copilot Studio](https://learn.microsoft.com/en-us/microsoft-copilot-studio/fundamentals-what-is-copilot-studio?ref=azurebrasil.cloud) - [What is Microsoft 365 Copilot?](https://learn.microsoft.com/en-us/microsoft-365-copilot/microsoft-365-copilot-overview?ref=azurebrasil.cloud) ### Copilot Studio ou Microsoft Foundry? A pergunta está errada (e o meu primeiro reflexo estava também) URL: https://www.azurebrasil.cloud/blog/copilot-studio-ou-microsoft-foundry-a-pergunta-esta-errada-e-o-meu-primeiro-reflexo-estava-tambem/ Last updated: 2026-08-04T11:43:52.000Z Olá pessoALL, semana passada eu estava numa reunião com um cliente de varejo, uns 600 funcionários, quando a diretora de RH fez a pergunta mais direta que eu ouvi no mês: > "Rafael, a gente quer um assistente que responda dúvidas de política interna, férias, benefícios e reembolso. Meu time vive respondendo a mesma coisa no Teams. Vocês recomendam o quê?" E eu respondi na hora: **Microsoft Foundry**. Arquitetura própria, RAG customizado, controle total, observabilidade, o pacote completo. Se você trabalha com Azure e é desenvolvedor, aposto que teria respondido a mesma coisa. Então aqui vai a primeira confissão do post: eu respondi errado. E o pior é que eu respondi errado por um motivo que não tinha nada a ver com o problema dela. Alguns dias atrás eu escrevi aqui no blog sobre o fim de semana que perdi construindo meu próprio harness de IA, e a lição foi mais ou menos essa: não construa o que já existe pronto e testado. Pois é. Levei alguns dias pra perceber que eu tinha acabado de cometer exatamente o mesmo erro, só que agora com o dinheiro do cliente. Esse post nasceu de um [artigo do time do Microsoft Foundry sobre como escolher o ponto de partida certo pra agentes corporativos](https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/choosing-the-right-starting-point-for-enterprise-ai-agents-with-copilot-studio-a/4535024?ref=azurebrasil.cloud). O framework de lá é bom. Mas eu quero contar essa história com uma camada a mais, que é o lugar de onde eu falo: somos um Solutions Partner, e parceiro tem incentivo. Vou ser honesto sobre esse incentivo antes de te dar qualquer recomendação. ## O reflexo que eu preciso admitir Por que eu disse "Foundry" antes mesmo de terminar de ouvir a pergunta? Porque eu sou desenvolvedor. Passei os últimos quinze anos escrevendo C#. Quando eu vejo um problema, meu cérebro abre o Visual Studio antes de abrir a planilha. Ferramenta low-code me dá uma coceira: "e se eu precisar de um retry customizado?", "e se eu quiser trocar o modelo?", "e o pipeline de CI/CD?". Perguntas legítimas. **Mas** repare em quem é o sujeito de todas elas. Eu. Nenhuma delas era sobre o cliente. E tem uma segunda camada nesse reflexo, mais desconfortável ainda. Um projeto de Foundry fatura consultoria. Arquitetura, integração, deployment, observabilidade, sustentação. Um agente feito no Copilot Studio pela própria pessoa de RH fatura... quase nada. Se você é parceiro Microsoft e nunca sentiu esse puxão, ou você é melhor pessoa que eu, ou você não estava prestando atenção. Sendo um dos maiores parceiros Microsoft do Brasil, esse incentivo aparece na nossa mesa toda semana. E a única forma de não ser capturado por ele é falar dele em voz alta, de preferência num post público, que é o que eu estou fazendo agora. Voltando ao cliente: gastei tempo precioso desenhando um diagrama bonito. App Service, Azure AI Search, Foundry Agent Service, private endpoint, tudo dentro da VNet. Mandei pro cliente numa quinta-feira. Na sexta ele me respondeu com uma pergunta de uma linha que derrubou o desenho inteiro: > "Rafael, e quem vai mexer nisso quando a política de férias mudar em janeiro?" Silêncio do meu lado. Porque a resposta honesta era "eu". Ou seja, eles ficariam dependentes de nós pra editar um documento de RH. **Quem vai manter isso daqui a seis meses?** Guarda essa pergunta, porque ela vai voltar várias vezes até o final do post. ## A pergunta certa não é "qual é melhor" O problema é que a pergunta "Copilot Studio ou Foundry?" trata as duas plataformas como concorrentes. E elas não são. Copilot Studio é uma plataforma low-code, gerenciada, onde você monta agentes por configuração: você conecta conhecimento (SharePoint, Dataverse, sites, arquivos), define tópicos, adiciona ações, publica no Teams, no site ou no WhatsApp. Microsoft Foundry é uma plataforma code-first, dentro da sua assinatura Azure, onde você constrói agentes como software: SDK, catálogo de modelos, orquestração customizada, tracing, avaliação, rede privada, CI/CD. Perceba que eu não descrevi capacidade. Descrevi **modelo de trabalho**. E é aí que mora a decisão. Na prática, a pergunta útil não é "qual plataforma é mais poderosa". É essa aqui: **Quem constrói, quem opera e quem responde por esse agente quando ele der problema numa sexta-feira às 18h?** Se a resposta for "o time de RH, que muda a política duas vezes por ano", você já tem a plataforma. Se a resposta for "o time de engenharia, que já tem repositório, pull request e pipeline", você também já tem a plataforma. E é outra. O artigo do time de Foundry organiza isso em três perguntas que eu achei ótimas e adotei: quem constrói e mantém, como esse time trabalha hoje, e qual nível de controle o cenário realmente exige. Vou usar essas três como espinha dorsal daqui pra frente, mas com números brasileiros em cima. ## Onde o Copilot Studio ganha — e ganha feio Vamos ser honestos sobre uma coisa que desenvolvedor tem dificuldade de admitir: velocidade de entrega é capacidade técnica, não consolo pra quem não sabe programar. O agente de RH daquele cliente? A analista de processos dele montou a primeira versão em dois dias. Dois dias. Apontou pra biblioteca do SharePoint com as políticas, escreveu as instruções em português, testou no painel e publicou no Teams. Sem chamado, sem sprint, sem deploy, sem eu. E quando a política de férias mudar em janeiro, ela sobe o PDF novo no SharePoint. Não tem reindexação manual nem release, e ela não precisa abrir chamado com a gente. Os cenários em que eu recomendo Copilot Studio sem hesitar hoje: - Agentes de conhecimento departamental: política de RH, manual de procedimentos, base de conhecimento de produto, onboarding. - Automação de processo de negócio, tipo abertura de chamado, solicitação de compra ou aprovação de despesa. Especialmente quando o processo já vive no Power Platform ou no Dataverse. - Experiências dentro do Microsoft 365, porque se o usuário final já passa o dia no Teams, publicar ali é um clique. - Conteúdo que muda toda semana e precisa ser editado por quem é dono dele, não por quem faz deploy. - Empresas que não têm time de desenvolvimento. Esse último merece um parágrafo próprio, porque é o ponto cego de quem escreve conteúdo técnico. Eu escrevo pra você, que provavelmente é dev ou arquiteto. Mas boa parte das empresas que compram Azure no Brasil tem "TI" formada por três pessoas que cuidam de rede, ERP, Microsoft 365 e do notebook do diretor. Não existe backlog nem sprint, e repositório de código muito menos. Recomendar Foundry pra elas não é ser rigoroso tecnicamente. É empurrar um problema operacional que elas não têm como absorver. Low-code soa como limitação. **Mas** quando o gargalo real da empresa é capacidade de engenharia, tirar a engenharia do caminho é exatamente o que faz o projeto existir. ## Onde o Foundry é inegociável Agora vamos pro outro lado, porque eu detesto post que só defende uma tese. Existem cenários em que recomendar Copilot Studio seria irresponsabilidade minha. E eles não são raros. O primeiro é quando o agente é o seu produto, e não a sua ferramenta. Se o comportamento do agente é o que a sua empresa vende, você precisa ser dono das primitivas: prompt, retrieval, roteamento, retry, avaliação. Vale a mesma régua que eu usei no post sobre harness próprio, e o "custo de construir" deixa de ser desperdício pra virar roadmap de produto. Depois vem rede privada e residência de dados. Cliente de serviço financeiro, saúde, setor público. Se o dado não pode sair da sua VNet, se você precisa de private endpoint, se auditoria exige controle sobre onde a inferência acontece, o Foundry roda dentro dos seus recursos Azure. Esse é um requisito binário: ou atende, ou não atende. O terceiro é orquestração multi-agente ou fluxo de longa duração. Um processo de sinistro que passa por leitura de documento, análise de fraude, validação de apólice e escalonamento não é um chatbot. É um sistema distribuído com IA dentro, e você quer isso em código, versionado e testado. Tem também o caso em que avaliação e tracing são requisito, e não desejo. Se você precisa medir qualidade de resposta com rigor, comparar versões de prompt e rastrear cada chamada de ferramenta, o Foundry Agent Service traz tracing ponta a ponta e integração com Application Insights. E aqui eu repito o que aprendi na marra no post anterior: **não dá pra melhorar o que você não consegue medir.** O último é o time já trabalhar com engenharia de software. Se já existe repositório, pull request, pipeline e code review, o Foundry se encaixa no que o time faz todo dia. Pedir pra esse time configurar agente por interface gráfica é tirar deles a única ferramenta de controle de qualidade que eles têm. Repare que nenhum desses cinco critérios é "o agente é complexo". Complexidade é um péssimo critério isolado, e esse é provavelmente o erro mais comum que eu vejo em decisão de plataforma. O que decide é quem opera, sob quais restrições, com qual nível de controle exigido. ## A conta de guardanapo que muda tudo Se você chegou até aqui, deve estar curioso pra saber quanto isso custa. Eu também estava, então fiz a conta. E ela me surpreendeu. Comece pelo custo de construir. No Copilot Studio, o agente de RH saiu em dois dias de uma analista que já estava na folha, então o custo marginal foi praticamente zero. No Foundry, o mesmo agente com RAG, deployment e observabilidade decente é coisa de 4 a 6 semanas entre dev sênior e arquiteto. Com hora sênior no Brasil entre R$ 120 e R$ 180, você está falando de algo entre R$ 60.000 e R$ 100.000\. Estimativa minha, baseada em projetos que a gente entregou, não é tabela oficial. Agora o custo por interação, e aqui a maré vira. O Copilot Studio cobra **Copilot Credits**, e cada crédito sai por $0,01 no pay-as-you-go. Uma resposta generativa consome 2 créditos, uma ação de agente consome 5, e grounding no tenant graph consome 10\. Ou seja, uma pergunta que puxa dado e executa uma ação facilmente vira 7 créditos, sete centavos de dólar. No Foundry você paga token na tarifa do modelo, e uma consulta RAG bem enxuta fica na casa de um centavo ou menos. Sete centavos contra um. Parece que o Foundry ganha disparado, né? **MAS (aqui entra um GRANDE MAS)**: essa comparação só importa se você tiver volume pra amortizar os R$ 60.000 a R$ 100.000 da construção. Vamos fazer a conta de guardanapo. Se a economia é de uns US$ 0,05 por interação e o investimento inicial é de uns US$ 15.000 (usando R$ 5,50 pro dólar, no meio da faixa), o ponto de equilíbrio fica em torno de 300.000 interações. Diluído em 24 meses, dá aproximadamente 12.500 interações por mês, ou algo como 500 por dia útil. Agora olha o cliente do começo do post. São 600 funcionários, e a estimativa realista dele era de 3 a 5 perguntas por funcionário por mês. Não por dia. Isso dá entre 1.800 e 3.000 interações mensais, uns US$ 130 a US$ 210 por mês em créditos. Pra chegar no ponto de equilíbrio do Foundry nesse volume, ele levaria mais de dez anos. E naquela altura o modelo, a plataforma e provavelmente a empresa já seriam outros. Falta a linha que quase ninguém coloca no orçamento, que é o custo de manter. No Copilot Studio, manter é subir um PDF. No Foundry, manter é um time. Se o cliente não tem esse time, ele vai contratar sustentação, provavelmente a nossa. Some mais uns R$ 5.000 a R$ 8.000 por mês nessa hipótese e a conta do Foundry piora ainda mais no cenário dele. E agora a parte que não favorece o meu próprio argumento. Existe um cliente meu, de outro segmento, com um agente de atendimento fazendo 40.000 interações por mês. Pra ele a conta inverte completamente: os créditos passariam de US$ 2.800 mensais, e a construção no Foundry se paga em menos de seis meses. Nesse caso eu recomendo Foundry sem pestanejar, e recomendaria mesmo que ele não tivesse time, porque aí a conta justifica montar o time. Ou seja, não existe resposta única. O que decide é o volume, a capacidade de operação do cliente e o requisito regulatório, mais ou menos nessa ordem de importância. Se você quiser fazer essa conta pro seu caso antes de decidir qualquer coisa, a Microsoft publicou um [estimador de consumo de Copilot Credits](https://microsoft.github.io/copilot-studio-estimator/?ref=azurebrasil.cloud) que aceita tipo de agente, tráfego, orquestração e ferramentas. Use antes de assinar contrato, não depois. ## Os dois juntos: o cenário mais comum e o menos discutido Agora que a conta está na mesa, dá pra falar do cenário que a maioria das empresas acaba vivendo e quase ninguém planeja: **usar os dois**. O padrão que mais funciona é esse: Copilot Studio como a cara do agente, Foundry como o cérebro nos pedaços que exigem código. Na prática, você mantém a experiência no Teams, o time de negócio continua dono do conteúdo e dos fluxos, e o Copilot Studio chama um agente publicado no Foundry pras partes que precisam de orquestração customizada, integração com sistema legado ou raciocínio mais pesado. O Foundry Agent Service permite publicar agentes com endpoint estável e distribuí-los via Microsoft 365 Copilot e Teams, então essa ponte não é gambiarra, é caminho suportado. Voltando ao meu cliente do varejo: foi exatamente onde a gente chegou. O agente de políticas de RH ficou 100% no Copilot Studio, com a analista dela como dona. O pedaço de solicitação de compra, que precisa consultar o ERP legado deles via uma API que ninguém em sã consciência exporia direto, virou um agente no Foundry, mantido por nós, chamado pelo Copilot Studio. Dois donos diferentes, duas velocidades diferentes, e do ponto de vista de quem usa é um agente só. E o mais importante: a diretora de RH não depende de sprint nenhuma pra atualizar a política de férias em janeiro. Vale ressaltar um ponto que costuma aparecer tarde demais nesses projetos: **governança**. No momento em que a empresa tem agentes nascendo em duas plataformas, criados por perfis diferentes, você precisa definir antes quem é dono de cada agente, qual identidade ele usa, a quais dados ele tem acesso e como você mede se ele está respondendo besteira. Isso não é burocracia. É o que separa "três agentes úteis" de "quarenta agentes que ninguém sabe quem criou". Defina esse mínimo antes do terceiro agente, não depois do trigésimo. ## Uma sequência pragmática pra decidir Se essa discussão está acontecendo aí na sua empresa agora, é assim que eu conduziria hoje. E repare que a plataforma só aparece no passo 4: 1. Identifique quem vai manter o agente daqui a seis meses. Não quem vai construir, quem vai manter. Se a resposta for "a gente contrata alguém", a resposta real é "ninguém". 2. Estime o volume mensal de interações usando o estimador oficial. Sem esse número, qualquer comparação de custo é chute com cara de planilha. 3. Liste os requisitos binários: rede privada, residência de dados, integração com sistema que não pode ser exposto, exigência de auditoria. Requisito binário não negocia com preferência de plataforma, ele decide sozinho. 4. Só agora escolha a plataforma. Time de negócio, volume baixo ou médio e nenhum requisito binário: Copilot Studio. Time de engenharia, ou volume alto, ou requisito binário: Foundry. Os dois ao mesmo tempo: híbrido, com fronteira clara de quem é dono de quê. 5. Comece pelo caso de uso mais chato que você tem. Política de RH, status de pedido, procedimento interno. Caso de uso empolgante é o que faz PoC virar cemitério. 6. Defina avaliação e monitoramento antes de publicar. Como você vai saber que o agente está errando? Se a resposta é "quando alguém reclamar", você não tem monitoramento, tem sorte. 7. Reavalie em seis meses. Ponto de partida não é sentença. Agente que nasce no Copilot Studio e cresce pode migrar pedaços pro Foundry. O contrário quase nunca acontece, e isso já diz muita coisa sobre por onde começar. ## A lição que ficou Voltando pra diretora de RH e pra pergunta dela de uma linha só: "quem vai mexer nisso quando a política de férias mudar em janeiro?" A resposta certa era "você mesma, em três minutos". E eu quase entreguei uma arquitetura em que a resposta seria "abre um chamado com a gente". A lição que ficou não é sobre Copilot Studio nem sobre Foundry. É sobre viés. **Todo mundo recomenda a ferramenta que sabe usar.** Desenvolvedor recomenda código. Parceiro recomenda o projeto que fatura mais. E a única defesa contra os dois vieses é começar a conversa pelo modelo operacional do cliente, não pela capacidade da plataforma. O Foundry é mais poderoso? É, sem discussão. Mas capacidade que ninguém dentro do cliente consegue operar não vira autonomia, vira dependência de terceiro. E o terceiro sou eu. E se você é dev como eu e ficou incomodado lendo isso: eu também fiquei escrevendo. A parte difícil de ser tecnicamente rigoroso é aceitar que rigor técnico inclui reconhecer quando a solução com menos código é a solução certa. E aí, qual foi a última vez que você recomendou a ferramenta que **você** gosta em vez da que o cliente consegue manter? Conta nos comentários, prometo não julgar — eu acabei de fazer isso alguns dias atrás. Aqui na AzureBrasil.cloud a gente ajuda times brasileiros a fazer exatamente esse tipo de escolha: onde vale low-code, onde vale código, e como faturar tudo dentro do contrato Azure em BRL. Se essa decisão está travada aí, fala com a gente. \[\]s e até a próxima. ## Referências ### O artigo que motivou este post - [Choosing the Right Starting Point for Enterprise AI Agents with Copilot Studio and Microsoft Foundry — Microsoft Tech Community](https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/choosing-the-right-starting-point-for-enterprise-ai-agents-with-copilot-studio-a/4535024?ref=azurebrasil.cloud) — o framework de decisão por persona e modelo operacional que serviu de base aqui ### Copilot Studio - [Copilot Studio licensing — Microsoft Learn](https://learn.microsoft.com/en-us/microsoft-copilot-studio/billing-licensing?ref=azurebrasil.cloud) — pay-as-you-go, packs pré-pagos e plano de pré-compra de Copilot Credits - [Copilot Studio agent usage estimator](https://microsoft.github.io/copilot-studio-estimator/?ref=azurebrasil.cloud) — estime consumo por tipo de agente, tráfego, orquestração e ferramentas antes de decidir - [Copilot Credits billing rates — Microsoft Learn](https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-messages-management?ref=azurebrasil.cloud) — quanto cada tipo de ação consome ### Microsoft Foundry - [What is Microsoft Foundry Agent Service? — Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/agents/overview?ref=azurebrasil.cloud) — prompt agents, hosted agents, Responses API e ciclo de vida - [Virtual networks no Foundry Agent Service — Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/agents/how-to/virtual-networks?ref=azurebrasil.cloud) — isolamento de rede e residência de dados - [Agent identity — Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/agents/concepts/agent-identity?ref=azurebrasil.cloud) — identidade Entra dedicada por agente, RBAC e OBO - [Publicar agentes no Microsoft 365 Copilot e Teams — Microsoft Learn](https://learn.microsoft.com/en-us/azure/ai-foundry/agents/how-to/publish-copilot?ref=azurebrasil.cloud) — a ponte que viabiliza o cenário híbrido ### Posts relacionados aqui do blog - ["Eu construí meu próprio harness de IA num fim de semana (e foi assim que entendi por que não vale a pena)"](https://www.azurebrasil.cloud/blog/eu-construi-meu-proprio-harness-de-ia-num-fim-de-semana-e-foi-assim-que-entendi-por-que-nao-vale-a-pena/) — o post anterior, sobre o mesmo viés aplicado a ferramenta de desenvolvimento - ["Copilot Studio + Azure SQL Grátis: Agentes de IA por $10/Mês — Verdade ou Marketing?"](https://www.azurebrasil.cloud/blog/copilot-studio-azure-sql-gratis-agentes-de-ia-por-10-mes-verdade-ou-marketing/) — a análise de custo de Copilot Credits em três cenários de PME Faça parte da comunidade da AZBR e conecte-se com profissionais de tecnologia de todo o Brasil. Receba vagas, eventos, conteúdos exclusivos, networking e acompanhe as principais novidades do ecossistema Microsoft, Azure e IA. [Quero fazer parte da comunidade](https://chat.whatsapp.com/Hu5QrTM5yIvLNjQmOpfp9r?ref=azurebrasil.cloud) ### Azure Newsletter - 2026-08-03 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-08-03/ Last updated: 2026-08-03T09:40:33.000Z ### Azure Updates - [Enabling the Compliance Security Profile (CSP) for HIPAA on Azure Databricks](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/enabling-the-compliance-security-profile-csp-for-hipaa-on-azure/ba-p/4541578?ref=azurebrasil.cloud) - [Scale limits in network security perimeter](https://techcommunity.microsoft.com/t5/azure-networking-blog/scale-limits-in-network-security-perimeter/ba-p/4542911?ref=azurebrasil.cloud) - [AI-Enabled Map Production Using Microsoft's MARS Model](https://techcommunity.microsoft.com/t5/microsoft-planetary-computer/ai-enabled-map-production-using-microsoft-s-mars-model/ba-p/4542498?ref=azurebrasil.cloud) - [What’s new in Microsoft Sentinel: July 2026](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/what-s-new-in-microsoft-sentinel-july-2026/ba-p/4542130?ref=azurebrasil.cloud) - [Governing Log Analytics retention at scale](https://techcommunity.microsoft.com/t5/azure-observability-blog/governing-log-analytics-retention-at-scale/ba-p/4542538?ref=azurebrasil.cloud) - [🚀 Foundry Toolkit for VS Code — July 2026 Update](https://techcommunity.microsoft.com/t5/microsoft-developer-community/foundry-toolkit-for-vs-code-july-2026-update/ba-p/4542786?ref=azurebrasil.cloud) - [Move a live GitLab project between groups without breaking Terraform state or CI/CD](https://techcommunity.microsoft.com/t5/azure-infrastructure-blog/move-a-live-gitlab-project-between-groups-without-breaking/ba-p/4539677?ref=azurebrasil.cloud) - [Securing Enterprise AI Agents with Microsoft Sentinel](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/securing-enterprise-ai-agents-with-microsoft-sentinel/ba-p/4542583?ref=azurebrasil.cloud) - [Domain controller showing "Not ready for migration"](https://techcommunity.microsoft.com/t5/microsoft-defender-for-identity/domain-controller-showing-quot-not-ready-for-migration-quot/m-p/4542534?ref=azurebrasil.cloud#m4327) - [Skill or Sub-Agent. Choosing AI Capabilities You Will Actually Reuse](https://techcommunity.microsoft.com/t5/azure-architecture-blog/skill-or-sub-agent-choosing-ai-capabilities-you-will-actually/ba-p/4542099?ref=azurebrasil.cloud) - [Azure Developer CLI (azd) July 2026](https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-july-2026/?ref=azurebrasil.cloud) - [Azure Files, Reimagined: Top-Level Shares with Per-Share Networking, Billing, and Scale](https://techcommunity.microsoft.com/t5/itops-talk-blog/azure-files-reimagined-top-level-shares-with-per-share/ba-p/4535079?ref=azurebrasil.cloud) - [Terraform AzureRM provider 5.0 now generally available](https://techcommunity.microsoft.com/t5/azure-tools-blog/terraform-azurerm-provider-5-0-now-generally-available/ba-p/4542085?ref=azurebrasil.cloud) - [Built to Protect: The Architecture Behind Codename MDASH](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/built-to-protect-the-architecture-behind-codename-mdash/ba-p/4541662?ref=azurebrasil.cloud) - [Azure Front Door edge actions: programmable compute for a secure, resilient, AI-ready edge](https://techcommunity.microsoft.com/t5/azure-networking-blog/azure-front-door-edge-actions-programmable-compute-for-a-secure/ba-p/4542177?ref=azurebrasil.cloud) - [Securing On-Device AI: Evaluating Foundry Local Models with AI Red Teaming Agent](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/securing-on-device-ai-evaluating-foundry-local-models-with-ai/ba-p/4541303?ref=azurebrasil.cloud) - [Reservation exchanges for Azure services covered by savings plans end starting Feb. 1, 2027](https://techcommunity.microsoft.com/t5/finops-blog/reservation-exchanges-for-azure-services-covered-by-savings/ba-p/4542437?ref=azurebrasil.cloud) - [Give Your E-Commerce App a Memory: Adding Agents That Actually Remember Your Customers](https://techcommunity.microsoft.com/t5/microsoft-developer-community/give-your-e-commerce-app-a-memory-adding-agents-that-actually/ba-p/4524021?ref=azurebrasil.cloud) - [Introducing Cost Management and Pricing Toolsets in Azure Resource Manager MCP Server](https://techcommunity.microsoft.com/t5/finops-blog/introducing-cost-management-and-pricing-toolsets-in-azure/ba-p/4530710?ref=azurebrasil.cloud) - [Introducing GPT-transcribe and GPT-live-transcribe in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/introducing-gpt-transcribe-and-gpt-live-transcribe-in-microsoft/ba-p/4541740?ref=azurebrasil.cloud) - [Bring Your Own Orchestrator to Azure Container Apps Jobs](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/bring-your-own-orchestrator-to-azure-container-apps-jobs/ba-p/4541275?ref=azurebrasil.cloud) - [Mastering GitHub Copilot Budgets: How to Prevent Surprise Overages Without Blocking Devs](https://techcommunity.microsoft.com/t5/azure-architecture-blog/mastering-github-copilot-budgets-how-to-prevent-surprise/ba-p/4542073?ref=azurebrasil.cloud) - [Share Azure Monitor Logs to Microsoft Fabric (preview)](https://techcommunity.microsoft.com/t5/azure-observability-blog/share-azure-monitor-logs-to-microsoft-fabric-preview/ba-p/4541199?ref=azurebrasil.cloud) - [Azure SDK Release (July 2026)](https://devblogs.microsoft.com/azure-sdk/azure-sdk-release-july-2026/?ref=azurebrasil.cloud) - [Azure Arc Server June Forum](https://techcommunity.microsoft.com/t5/azure-arc-blog/azure-arc-server-june-forum/ba-p/4542082?ref=azurebrasil.cloud) - [Tell your model when to think harder](https://devblogs.microsoft.com/visualstudio/tell-your-model-when-to-think-harder/?ref=azurebrasil.cloud) - [Executive AI Avatar Platform on Azure: Frontier Intelligence Meets Fireworks AI Open-Source](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/executive-ai-avatar-platform-on-azure-frontier-intelligence/ba-p/4541301?ref=azurebrasil.cloud) - [Building and Deploying Microsoft Hosted Agents to Microsoft Teams](https://techcommunity.microsoft.com/t5/microsoft-developer-community/building-and-deploying-microsoft-hosted-agents-to-microsoft/ba-p/4540376?ref=azurebrasil.cloud) - [Join us for our MCP Live! — A free livestream covering all things MCP](https://techcommunity.microsoft.com/t5/microsoft-developer-community/join-us-for-our-mcp-live-a-free-livestream-covering-all-things/ba-p/4537980?ref=azurebrasil.cloud) - [Now Generally Available: Built-in CIS Benchmark Auditing for Linux on Azure](https://techcommunity.microsoft.com/t5/linux-and-open-source-blog/now-generally-available-built-in-cis-benchmark-auditing-for/ba-p/4529819?ref=azurebrasil.cloud) - [Secretless Microsoft Entra ID Authentication for AKS with Istio and oauth2-proxy](https://azureglobalblackbelts.com/2026/07/29/secretless-entra-authentication-on-aks?ref=azurebrasil.cloud) - [Introducing Compliance Substate for Azure Policy Exemptions!](https://techcommunity.microsoft.com/t5/azure-governance-and-management/introducing-compliance-substate-for-azure-policy-exemptions/ba-p/4541703?ref=azurebrasil.cloud) - [Surprise AI bill? GitHub Billing controls to the rescue!](https://techcommunity.microsoft.com/t5/microsoft-developer-community/surprise-ai-bill-github-billing-controls-to-the-rescue/ba-p/4541295?ref=azurebrasil.cloud) - [Token Economics in Practice](https://techcommunity.microsoft.com/t5/azure-architecture-blog/token-economics-in-practice/ba-p/4540472?ref=azurebrasil.cloud) - [Introducing Kimi K3 through Fireworks AI on Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/introducing-kimi-k3-through-fireworks-ai-on-microsoft-foundry/ba-p/4540187?ref=azurebrasil.cloud) - [Microsoft is headed to VMware Explore 2026 in Las Vegas](https://techcommunity.microsoft.com/t5/azure-migration-and/microsoft-is-headed-to-vmware-explore-2026-in-las-vegas/ba-p/4541643?ref=azurebrasil.cloud) - [Visual Studio July Update — Meet the New Agent, Powered by the GitHub Copilot SDK](https://devblogs.microsoft.com/visualstudio/visual-studio-july-update-meet-the-new-agent-powered-by-copilot-sdk/?ref=azurebrasil.cloud) - [Introducing Physical-World Intelligence: How GeoAI Is Helping Expand Enterprise AI](https://techcommunity.microsoft.com/t5/microsoft-planetary-computer/introducing-physical-world-intelligence-how-geoai-is-helping/ba-p/4541309?ref=azurebrasil.cloud) - [Find any commit in seconds: Commit Search comes to Azure DevOps](https://devblogs.microsoft.com/devops/find-any-commit-in-seconds-commit-search-comes-to-azure-devops/?ref=azurebrasil.cloud) - [Refactor your database with SQL projects in VS Code](https://devblogs.microsoft.com/azure-sql/refactor-your-database-with-sql-projects-in-vs-code/?ref=azurebrasil.cloud) - [Azure landing zone (ALZ) enters its next chapter](https://techcommunity.microsoft.com/t5/azure-governance-and-management/azure-landing-zone-alz-enters-its-next-chapter/ba-p/4533520?ref=azurebrasil.cloud) - [Cap it with GitHub, make it count with Azure: governing GitHub Copilot spend](https://techcommunity.microsoft.com/t5/finops-blog/cap-it-with-github-make-it-count-with-azure-governing-github/ba-p/4539492?ref=azurebrasil.cloud) - [Turning surprise AI bills into accountable growth with GitHub Billing Controls](https://dev.to/azure/turning-surprise-ai-bills-into-accountable-growth-4343?ref=azurebrasil.cloud) - [Microsoft Foundry Model Deployment Pricing Update](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/microsoft-foundry-model-deployment-pricing-update/ba-p/4535385?ref=azurebrasil.cloud) - [AI Gateway tier of API Management now in public preview](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/ai-gateway-tier-of-api-management-now-in-public-preview/ba-p/4540170?ref=azurebrasil.cloud) - [Building Autonomous Network Operations: From Vision to Measurable Business Impact](https://techcommunity.microsoft.com/t5/telecommunications-industry-blog/building-autonomous-network-operations-from-vision-to-measurable/ba-p/4540483?ref=azurebrasil.cloud) - [Preserve a Legacy IP During Azure Migration with Private Link Service Direct Connect](https://techcommunity.microsoft.com/t5/azure-architecture-blog/preserve-a-legacy-ip-during-azure-migration-with-private-link/ba-p/4540575?ref=azurebrasil.cloud) - [MCP Connect: Why Every AI Engineer and Developer Should Care About the Model Context Protocol](https://techcommunity.microsoft.com/t5/microsoft-developer-community/mcp-connect-why-every-ai-engineer-and-developer-should-care/ba-p/4537839?ref=azurebrasil.cloud) - [Device Code Flow: The Gift That Keeps on Giving — To Attackers](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/device-code-flow-the-gift-that-keeps-on-giving-to-attackers/ba-p/4540949?ref=azurebrasil.cloud) ### GitHub Updates - [Don’t stop early: Case-folding source code at memory speed](https://github.blog/engineering/architecture-optimization/dont-stop-early-case-folding-source-code-at-memory-speed/?ref=azurebrasil.cloud) - [Stacked sessions and pull requests in the GitHub Copilot app](https://github.blog/ai-and-ml/github-copilot/stacked-sessions-and-pull-requests-in-the-github-copilot-app/?ref=azurebrasil.cloud) - [Tame Dependabot: Group your updates, slow the cadence, keep security fast](https://github.blog/security/supply-chain-security/tame-dependabot-group-your-updates-slow-the-cadence-keep-security-fast/?ref=azurebrasil.cloud) - [Disrupting supply chain attacks on npm and GitHub Actions](https://github.blog/security/supply-chain-security/disrupting-supply-chain-attacks-on-npm-and-github-actions/?ref=azurebrasil.cloud) - [The harness is all you need (mostly)](https://github.blog/ai-and-ml/github-copilot/the-harness-is-all-you-need-mostly/?ref=azurebrasil.cloud) - [GitHub Copilot app for Beginners: Getting started](https://github.blog/ai-and-ml/github-copilot/github-copilot-app-for-beginners-getting-started/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [A fábrica roda sozinha. O seu time também precisa rodar com alguma coisa.](https://www.azurebrasil.cloud/blog/a-fabrica-roda-sozinha-o-seu-time-tambem-precisa-rodar-com-alguma-coisa/) - [Microsoft Foundry Routines: como agendar a execução dos seus agentes](https://www.azurebrasil.cloud/blog/microsoft-foundry-routines-como-agendar-a-execucao-dos-seus-agentes/) - [Eu construí meu próprio harness de IA num fim de semana (e foi assim que entendi por que não vale a pena)](https://www.azurebrasil.cloud/blog/eu-construi-meu-proprio-harness-de-ia-num-fim-de-semana-e-foi-assim-que-entendi-por-que-nao-vale-a-pena/) - [Implementando o Back-end com GitHub Copilot: .NET Minimal API, DTOs e EF Core InMemory na prática (Parte 3)](https://www.azurebrasil.cloud/blog/implementando-o-back-end-com-github-copilot-net-minimal-api-dtos-e-ef-core-inmemory-na-pratica-parte-3/) - [AzureBrasil Newsletter - 2026-07-27](https://www.azurebrasil.cloud/blog/azurebrasil-newsletter-2026-07-27/) ### A fábrica roda sozinha. O seu time também precisa rodar com alguma coisa. URL: https://www.azurebrasil.cloud/blog/a-fabrica-roda-sozinha-o-seu-time-tambem-precisa-rodar-com-alguma-coisa/ Last updated: 2026-07-31T12:36:14.000Z ## A cena que não esquece A visita às instalações da Solito Alimentos começou pela linha de ração. Na **sala de automação**, painéis de controle monitoravam o processo inteiro: recepção, processamento, formulação, empacotamento. Sem operador em cada etapa. Sem mão humana nos pontos críticos do fluxo. Depois, a linha de arroz. Máquinas de **seleção eletrônica de grãos** trabalhando em sequência, identificando e separando cada unidade por parâmetros que olho humano não alcança com essa velocidade nem com essa precisão. A tecnologia não estava lá para impressionar visitante. Estava lá para produzir. A linha de ração é o segmento mais recente da empresa, uma operação de alta escala que a Solito construiu com automação de ponta. E funcionava. Com precisão industrial. Com eficiência que fala por si. Aquilo não era uma demo. Era o dia a dia. Saí de lá pensando em quantas empresas de setores que se consideram "mais digitais" ainda dependem de planilha manual para fechar o mês, de e-mail encadeado para tomar uma decisão ou de reunião de alinhamento para transmitir informação que deveria estar num sistema. O agro não esperou o restante do mercado de tecnologia descobrir automação. Ele foi. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-18-1.png) ## O setor que chegou antes Existe uma narrativa no mercado de tecnologia que coloca o agronegócio como setor conservador, avesso à inovação. Essa narrativa está errada. O agronegócio brasileiro opera hoje com um nível de **automação operacional** que poucos setores alcançaram. Rastreabilidade de insumos, controle de processo em tempo real, linhas autônomas com mínima intervenção humana. Isso não é diferencial competitivo de uma empresa isolada. É o padrão de quem quer escalar no setor. A entrada da Solito no mercado de ração é um exemplo preciso desse movimento. Não se entra numa operação de alta complexidade sem processo e sem automação. O setor exige. Quem chega com improviso, perde para quem chegou com sistema. O debate da Indústria 4.0 popularizou conectividade, sensores e automação como símbolos de modernização industrial. O agro absorveu esse conceito e foi além, por pressão real: produzir mais, com menos margem para erro, em escala que não perdoa ineficiência. O ponto não é que o agro é tecnológico. O ponto é que a transformação tecnológica acontece onde existe pressão real para acontecer. E isso vale para qualquer setor. ## Dois movimentos que não são o mesmo **Automação industrial** e **adoção de IA no trabalho** são frentes distintas. Confundir as duas é um erro que distorce como as empresas tomam decisões de investimento e treinamento. Automação industrial opera em máquinas, sensores, PLCs e sistemas de controle. A decisão de automatizar uma linha de produção é uma decisão de engenharia e capital. O retorno é mensurável em toneladas por hora, custo por unidade, taxa de rejeição. Adoção de IA no trabalho, como o Microsoft 365 Copilot, opera em pessoas, processos e dados corporativos. A decisão de adotar envolve mudança de comportamento, governança de informação e treinamento. O retorno aparece em horas recuperadas, decisões mais rápidas, relatórios que levavam meio dia e passam a levar vinte minutos. São lógicas diferentes, com timelines diferentes e com critérios de sucesso diferentes. A Solito avança nas duas frentes ao mesmo tempo, cada uma com sua lógica própria. Ver a fábrica automatizada funcionando me lembrou que o mesmo nível de seriedade com que a empresa trata a operação industrial precisa existir na adoção das ferramentas de IA para o time. Não porque são a mesma coisa. Porque ambas exigem método. ## O que separa adoção real de piloto parado Existe um entusiasmo legítimo em torno de IA generativa. O Copilot no Microsoft 365 tem capacidade real de transformar como equipes trabalham: gera rascunhos de comunicação, resume reuniões com pontos de ação, analisa dados em linguagem natural, automatiza relatórios que antes consumiam tempo de analistas. O problema não é a ferramenta. O problema é a **expectativa sem estrutura**. A maioria das empresas que frustra com adoção de IA chega ao mesmo lugar pelo mesmo caminho: comprou a licença, fez uma demo para o time, liberou o acesso e esperou a transformação acontecer. Não aconteceu. O que aconteceu foi um grupo de pessoas que abriu a ferramenta, não soube o que fazer com ela, fechou e voltou para o fluxo de trabalho que já conhecia. Adoção de IA segue a mesma lógica de qualquer mudança organizacional relevante: precisa de método, de governança e de treinamento antes de resultado. No projeto da Solito, a sequência foi diferente. Antes do treinamento presencial de três dias com C-levels e gestão, a equipe de TI da empresa passou por uma etapa de **governança e capacitação técnica** conduzida pela AzureBrasil.cloud. O time de TI precisava entender como o Copilot acessa dados corporativos, quais permissões estão envolvidas, o que precisa estar configurado corretamente no ambiente antes de abrir o acesso para o restante da organização. Esse trabalho prévio não aparece no vídeo de lançamento. Não tem foto bonita. Mas é o que determina se a adoção vai funcionar ou vai gerar retrabalho, exposição de informação que não deveria ser exposta e ceticismo que leva meses para desfazer. O resultado concreto veio durante os próprios treinamentos. Antes do encerramento, o time já saía com ideias de agentes construídas e casos de uso do Copilot mapeados para o trabalho real de cada área. Não como exercício teórico. Como aplicação imediata, com eficácia comprovada dentro do próprio processo de aprendizado. Isso é adoção em produção, não promessa de roadmap. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/20260723_090406-1-1.jpg) ## O que muda para quem decide Quando a governança está no lugar e o treinamento é feito com método, o resultado para lideranças é concreto. Gestores que adotam o Copilot de forma estruturada ganham um **deslocamento de esforço**: menos tempo em tarefas de consolidação, formatação e busca de informação. Mais tempo em análise, decisão e relacionamento. Para um C-level, isso não é conforto. É capacidade estratégica. Cada hora recuperada de tarefa operacional é uma hora disponível para pensar o crescimento da empresa, acompanhar indicadores com mais profundidade ou dedicar atenção a projetos que ficavam no segundo plano por falta de tempo. Para o analista, é a diferença entre passar a tarde montando um relatório e passar a tarde interpretando o que o relatório diz. Para o operacional, é a diferença entre responder "eu preciso verificar e te falo amanhã" e ter a informação disponível em segundos numa conversa com a ferramenta. Na Solito, ver os próprios líderes da empresa na mesma sala que o time de gestão, aprendendo Copilot juntos, foi um sinal claro de que a organização trata essa adoção como prioridade, não como projeto de TI isolado. Quando a liderança participa do treinamento, a mensagem para o time é direta: isso importa aqui. E essa mensagem vale mais do que qualquer comunicado interno. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/20260722_171641-1.jpg) ## O que vale para qualquer setor O caso do agronegócio não é exceção. É o exemplo mais visível de um movimento que atravessa todos os mercados. Empresas de serviços, saúde, educação, varejo e indústria em geral estão no mesmo dilema: a tecnologia evoluiu rápido, as ferramentas estão disponíveis, mas a adoção real ainda depende de cultura, processo e parceiro certo. A barreira que mais encontro nos projetos não é técnica. Não é a licença. Não é o portal de configuração. A barreira é a **ausência de método**: sem diagnóstico de quem usa o quê, sem política de dados organizada, sem treinamento contextualizado para o trabalho real de cada time, a ferramenta vira mais um ícone na área de trabalho. O Microsoft 365 Copilot precisa de dados bem organizados no SharePoint e no OneDrive, permissões revisadas no Microsoft Entra ID e uma estratégia de adoção que começa antes da ativação. Sem isso, a capacidade da ferramenta fica represada, e o investimento fica no papel. Isso não é crítica ao produto. É o pré-requisito para que ele entregue o que promete. ## O acompanhamento que não termina no treinamento Treinamento pontual não sustenta adoção. Esse é o ponto que mais vejo ser ignorado no mercado. Empresas investem em uma semana de capacitação e esperam que o time incorpore novos hábitos de trabalho a partir daí. O comportamento humano não funciona assim. Mudança de rotina exige reforço, suporte e tempo. O que diferencia um projeto de adoção bem-sucedido é o **acompanhamento contínuo**: alguém que monitora como o uso evolui, identifica onde o time trava, atualiza o treinamento conforme novas funcionalidades chegam e responde dúvidas antes que o ceticismo tome o lugar da curiosidade. No projeto da Solito, a AzureBrasil.cloud não encerrou o trabalho no último dia do treinamento presencial. A parceria segue. Esse modelo, governança antes, treinamento com método, acompanhamento depois, é o que separa adoção real de piloto bem-intencionado que não vira rotina. ## O próximo passo é seu A pergunta que fica depois de tudo isso não é "minha empresa precisa de IA?". Essa resposta já é sim para qualquer organização que precisa de times mais produtivos e decisões mais rápidas. A pergunta certa é: "minha empresa tem o método para fazer isso funcionar?" Se a resposta for não, ou se você não souber, esse é o ponto de partida. **Diagnóstico, governança, treinamento e acompanhamento.** Nessa ordem. Se a sua empresa quer dar esse passo com estrutura, fale com a [AzureBrasil.cloud](https://azurebrasil.cloud/?ref=azurebrasil.cloud). É o trabalho que fazemos. ## Referências - [O que é o Microsoft 365 Copilot](https://learn.microsoft.com/en-us/microsoft-365/copilot/microsoft-365-copilot-overview?ref=azurebrasil.cloud) - [Microsoft 365 Copilot Skilling Center](https://adoption.microsoft.com/copilot/skilling-center/?ref=azurebrasil.cloud) ### Microsoft Foundry Routines: como agendar a execução dos seus agentes URL: https://www.azurebrasil.cloud/blog/microsoft-foundry-routines-como-agendar-a-execucao-dos-seus-agentes/ Last updated: 2026-07-30T12:09:02.000Z Se você já tentou colocar um agente do Microsoft Foundry para executar sozinho todos os dias, provavelmente precisou usar outro serviço para cuidar do agendamento. O agente era criado no Foundry, o prompt era testado no playground e tudo funcionava bem. Mas, na hora de executar esse agente às 8h da manhã, era comum criar um Logic App com um gatilho de recorrência ou uma Azure Function com Timer Trigger. Funciona, claro. O problema é que uma automação simples acaba ganhando mais uma peça de infraestrutura para configurar, monitorar e manter. Apresentado no ciclo de novidades do Microsoft Build 2026, o Routines leva esse agendamento para dentro do próprio projeto do Microsoft Foundry. Com ele, você define quando o agente deve executar, qual prompt será enviado e acompanha o resultado sem precisar criar um serviço separado apenas para disparar a chamada. O recurso está em public preview. ## O que é o Routines? Uma routine é uma regra de automação associada a um agente. Ela possui duas partes: ```text Trigger ↓ Routine ↓ Agente do Microsoft Foundry ``` O trigger define quando a rotina começa. E a action informa qual agente será chamado. Quando o gatilho dispara, o Foundry cria um registro da execução, envia o input para o agente e guarda o resultado. O agente continua usando o mesmo modelo, instruções, ferramentas e identidade que já estavam configurados no projeto. Atualmente, estão disponíveis três tipos de gatilho: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-9.png) - `Recurring schedule`: execução recorrente por expressão cron; - `One-time schedule`: execução única em uma data, horário ou intervalo futuro; - `github_issue`: execução quando uma issue é aberta ou fechada em um repositório monitorado. Cada routine aceita somente um trigger e uma action. Para executar o mesmo agente em dois horários diferentes, por exemplo, você precisa criar duas routines. ### No momento, o Routines está liberado para projetos criados nestas regiões: - East US - East US 2 - West US - West US 2 - West Central US - North Central US - Sweden Central - Japan East Como estamos falando de um recurso em preview, essa lista pode mudar. Consulte a documentação oficial antes de criar um ambiente especificamente para usar o Routines. ## Antes de começar Para acompanhar o exemplo, você precisa ter: - Um projeto ativo no Microsoft Foundry; - Um agente já criado e implantado; - A função Foundry User (Azure Ai User) ou superior no projeto; - O projeto em uma das regiões suportadas. Neste artigo, vamos criar uma rotina que executa um agente que consulta os tickets em aberto de segunda a sexta-feira às 8h. ## Criando uma routine pela interface do Foundry Abra o Microsoft Foundry e entre no projeto onde o agente está implantado. Depois, siga estes passos: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-10.png) - Antes de tudo verifique se está no New Foundry. - Clique em Agents e depois em `Routines` e `+ New routine`. - Informe um nome, como `resumo-matinal`. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-11.png) - Escolha o agente que será executado e o prompt enviado em cada execução. - Em `Trigger`, selecione `Recurring schedule`. - Escolha a frequência e o horário. - Clique em `Create & start`. Um exemplo de prompt seria: ```text Consulte os tickets criados ou atualizados nas últimas 24 horas. Organize o resultado com: quantidade total de tickets; tickets novos; tickets ainda abertos; chamados com prioridade alta ou crítica; tickets próximos de ultrapassar o SLA; Ao final, apresente um resumo curto com os pontos que precisam de atenção. Caso não existam tickets críticos ou próximos do vencimento do SLA, informe isso claramente. ``` Para uma execução única, selecione `One-time schedule` e informe a data e o horário em `Run at`. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-12.png) Há um detalhe importante: o horário escolhido na interface é interpretado usando o fuso local do navegador. Se você quiser fixar a execução em uma zona específica, independentemente de quem estiver acessando o portal, use a REST API e informe o campo `time_zone`. ## Testando e acompanhando a execução Depois de criar a rotina, abra sua página e clique em `Test run`. O Foundry coloca a execução na fila sem esperar pelo próximo horário programado. O status pode passar de `Queued` para `Completed` ou `Failed`. Na mesma página, você encontra o histórico das execuções, com informações como horário, duração, estado e identificador da resposta. Também é possível pausar e retomar a rotina sem excluí-la. ### Criando a mesma routine pela REST API Os exemplos desta seção utilizam Bash. No Windows, você pode executá-los pelo Git Bash dentro do Visual Studio Code ou pelo WSL. A API também pode ser chamada por PowerShell, Postman, .NET ou qualquer outro cliente HTTP. O endpoint e o JSON permanecem os mesmos; apenas a sintaxe usada para enviar a requisição muda. Vamos criar a mesma rotina do exemplo anterior, mas agora fixando o fuso horário como `America/Recife`. ### Preparando o acesso Primeiro, faça login na Azure CLI: ```bash az login ``` Depois, configure o endpoint do projeto e o nome do agente: ```bash PROJECT_ENDPOINT="https://.services.ai.azure.com/api/projects/" AGENT_NAME="" ROUTINE_NAME="resumo-diario-tickets" ``` O `PROJECT_ENDPOINT` é o endereço do projeto no Microsoft Foundry. Ele não é o endpoint do modelo. Você pode encontrá-lo nas informações do projeto no portal. Agora obtenha um token de acesso do Microsoft Entra ID: ```bash TOKEN=$(az account get-access-token \ --resource https://ai.azure.com \ --query accessToken \ -o tsv) ``` Esse token será enviado no cabeçalho `Authorization` de cada chamada. ### Criando a routine Para evitar problemas com aspas e caracteres especiais no terminal, vamos colocar a configuração em um arquivo JSON. Crie o arquivo `routine.json`: ```bash cat > routine.json < As informações deste artigo foram verificadas em julho de 2026\. Como o Routines está em public preview, regiões, campos da API e opções da interface podem mudar. ### Eu construí meu próprio harness de IA num fim de semana (e foi assim que entendi por que não vale a pena) URL: https://www.azurebrasil.cloud/blog/eu-construi-meu-proprio-harness-de-ia-num-fim-de-semana-e-foi-assim-que-entendi-por-que-nao-vale-a-pena/ Last updated: 2026-07-29T12:17:44.000Z Olá pessoALL, semana passada, numa reunião técnica com um cliente, um dev do time fez a pergunta que eu já tinha ouvido em três conversas diferentes no último mês. Se você trabalha com IA em time de engenharia, aposto que já ouviu também. Mas dessa vez ela veio com um argumento novo, e bem construído: > "Rafael, agora que o Copilot cobra AI Credits em cima da tarifa de API dos modelos, me explica uma coisa: por que eu pago Copilot em vez de chamar a API direto? É o mesmo modelo. É o mesmo preço de token. Eu escrevo meu loop de agente em C# num fim de semana." E aqui vai a primeira confissão do post: eu não soube responder na hora. Falei alguma coisa genérica sobre integração e governança, daquelas que soam bem numa call e não convencem ninguém de verdade. Saí da reunião incomodado. Então fui fazer o que ele disse. Passei o fim de semana construindo meu próprio harness. E foi a melhor forma que encontrei de responder a pergunta dele. Só que a resposta não é a que eu esperava quando abri o Visual Studio no sábado de manhã. ## A conta que parece fechar Vamos ser justos com o argumento antes de derrubar qualquer coisa. Porque ele é bom. Desde 1º de junho, quando o GitHub [virou a chave do billing por uso e enterrou as PRUs](https://www.azurebrasil.cloud/blog/a-conta-chegou-github-anuncia-ai-credits-e-marca-1o-de-junho-como-o-fim-da-era-pru/), o consumo do Copilot é calculado em cima de input, output e cached tokens, na tarifa oficial de API de cada modelo. Ou seja, aquele véu que existia antes ("quanto custa um premium request, afinal?") sumiu. Agora dá pra comparar diretamente. E quando você compara direto, a primeira camada é essa: | | API direta do fornecedor | GitHub Copilot | | --------------- | ------------------------ | ------------------------ | | Preço por token | Tarifa oficial do modelo | Tarifa oficial do modelo | Empate. Literalmente empate. Se o token custa o mesmo, o argumento do dev se sustenta sozinho: por que pagar um intermediário? Você chama o endpoint, monta seu contexto, executa suas ferramentas, e fica com o controle total. Sem seat, sem plano, sem nada no meio. A conta parece fechar. **Mas** ela só parece fechar porque está faltando linha na planilha. E eu só descobri quais linhas faltavam depois de tentar preenchê-las na mão. ## Então eu fui construir o meu Antes de contar como foi, preciso definir o termo que dá título ao post, porque ele ainda não caiu na boca do povo por aqui. **Harness**, no contexto de IA, é toda a camada de software que fica entre você e o modelo. É quem decide quais arquivos entram no contexto, como as ferramentas são descritas pro modelo, o que fazer quando uma tool call vem malformada, quando comprimir o histórico da conversa, quando parar de iterar, quando pedir permissão pra rodar um comando destrutivo. O modelo é o cérebro. O harness é tudo que traduz "resolve esse bug" numa sequência de leituras, edições, execuções de teste e correções. Guarda essa frase, porque ela vai voltar: **o modelo pensa, mas o harness decide o que ele vê.** Meu experimento de sábado foi exatamente isso, na versão mais ingênua possível. Um loop em C# com function calling, três ferramentas (`read_file`, `write_file`, `run_command`) e um system prompt razoável. O esqueleto era mais ou menos assim: ```csharp var messages = new List { new SystemMessage(SYSTEM_PROMPT), new UserMessage(task) }; while (true) { var response = await client.CompleteAsync(messages, tools); messages.Add(response); if (response.ToolCalls.Count == 0) break; foreach (var call in response.ToolCalls) messages.Add(await ExecuteToolAsync(call)); } ``` Umas 200 linhas no total, contando as implementações das ferramentas. Rodei numa API .NET pequena, pedi pra corrigir um bug de validação, e ele corrigiu. Rodou o teste, o teste passou, ele parou. Funcionou! Sério, funcionou. E eu fiquei genuinamente empolgado por uns quarenta minutos. **Mas** funcionou uma vez, num repositório de 30 arquivos que eu conhecia de cor, numa tarefa que eu mesmo tinha escolhido. Basta trocar qualquer uma dessas três variáveis pra casa começar a cair. ## Os problemas que aparecem depois da demo Aqui é onde o fim de semana virou aula. Vou listar na ordem em que os problemas apareceram, porque a ordem importa: cada um só fica visível depois que você resolve o anterior. O primeiro foi contexto. No repo de 30 arquivos, eu mandava a árvore inteira no prompt. Apontei o mesmo agente pra um repositório real de cliente, com 2.400 arquivos, e estourei a janela de contexto na primeira mensagem. Aí você precisa decidir: manda só a estrutura de pastas? Faz busca semântica? Deixa o modelo pedir arquivo por arquivo, queimando tokens em ida e volta? Cada escolha muda o custo e a taxa de acerto, e não existe resposta óbvia. O segundo foram tool calls quebradas. O modelo às vezes devolve JSON com um caractere a mais, chama uma ferramenta que não existe, ou passa um caminho relativo quando você esperava absoluto. Meu loop simplesmente explodia. Tratar isso significa retry com feedback estruturado — e retry custa tokens. O terceiro foi loop infinito. Duas vezes o agente ficou lendo e relendo os mesmos três arquivos, convencido de que ia entender melhor na quarta passada. Eu não tinha nenhum mecanismo de detecção. Só percebi olhando a fatura. O quarto foi compactação de histórico. Numa tarefa longa, o histórico cresce e o custo por iteração cresce junto, porque você reenvia tudo. Compactar sem perder a informação que importa é um problema de engenharia sério, e a decisão de *quando* compactar é tão importante quanto o *como*. O quinto foi permissão. No meu protótipo, `run_command` executava qualquer coisa. Na minha máquina, com o repo versionado, tudo bem. Em qualquer ambiente compartilhado, isso é irresponsável. E não adianta terceirizar pro modelo a decisão de "esse comando é perigoso?" — quem decide precisa ser o seu código. O sexto doeu. Eu tinha calibrado tudo com um modelo da família GPT, troquei pra um Claude pra comparar, e a taxa de sucesso despencou. Não porque o Claude seja pior. É porque o formato das descrições de ferramenta, o estilo do system prompt e a forma de sinalizar "termine agora" respondem diferente em cada família de modelo. Eu não tinha construído um harness. Eu tinha construído um harness *pra um modelo específico*. Lição aprendida: **cada modelo novo que sai reabre todo esse trabalho.** E hoje sai modelo novo a cada semana. ## O dado que virou minha cabeça Chegando no domingo à noite, eu tinha uma versão bem melhor. Tinha resolvido retry, tinha um limite de iterações, tinha um seletor de contexto menos burro. Rodei o benchmark improvisado que eu mesmo tinha montado (umas 12 tarefas em repositórios diferentes) e a taxa de acerto subiu de 7 para 9\. Ótimo, né? Melhorei o agente em 17%. Aparentemente. **MAS (aqui entra um GRANDE MAS)**: eu tinha rodado uma vez. Foi aí que eu esbarrei no [estudo que o GitHub publicou em junho comparando o harness agêntico do Copilot com os harnesses dos próprios fornecedores de modelo](https://github.blog/ai-and-ml/github-copilot/evaluating-performance-and-efficiency-of-the-github-copilot-agentic-harness-across-models-and-tasks/?ref=azurebrasil.cloud). E o que me pegou não foi o resultado. Foi a metodologia. Eles compararam o GitHub Copilot CLI contra o Claude Code (com Sonnet 4.6 e Opus 4.7) e contra o Codex CLI (com GPT-5.4 e GPT-5.5). Mesmo modelo dos dois lados. Mesma tarefa. Janela de contexto normalizada, mesmo reasoning effort, mesma seleção de ferramentas, mesmos MCP servers. Timeout de duas horas por execução. Cinco benchmarks: SWE-bench Verified (500 tarefas de bugfix validadas por humanos), SWE-bench Pro, SkillsBench, TerminalBench 2.0 e Win-Hill, esse último interno, rodando dentro de containers Windows. E no TerminalBench 2.0, com 89 tarefas, eles rodaram cada combinação de agente e modelo no mínimo cinco vezes. Não pra ter média bonita. Pra medir a variância entre execuções. Você entendeu onde eu quero chegar? Modelos são estocásticos. A mesma tarefa, com o mesmo prompt, no mesmo modelo, dá resultados diferentes em execuções diferentes. O gráfico deles mostra isso com elipses de ±1σ em volta de cada configuração, e as elipses são grandes. Ou seja: minha "melhoria de 17%", medida em 12 tarefas com uma execução, provavelmente era ruído. Eu passei o domingo comemorando variância. Não dá pra melhorar o que você não consegue medir. E medir harness de IA direito exige um volume de execução que, sinceramente, não cabe no orçamento de quase ninguém. Vou botar número nisso mais pra frente. Antes disso, o resultado em si, e vou dar o dado honesto inclusive onde ele não favorece o Copilot: nos benchmarks, o harness do Copilot entregou taxa de resolução de tarefa em paridade com os harnesses dos fornecedores, consumindo menos tokens na maioria das configurações. Na maioria, não em todas. No SWE-bench Verified com GPT-5.4 e GPT-5.5, o Copilot CLI ficou 7% e 4% *pior* em eficiência de token, respectivamente. As diferenças de resolução, nos dois sentidos, ficam dentro da variância entre execuções. Isso não é "o Copilot ganha de todo mundo". É uma afirmação bem mais modesta e bem mais útil: o mesmo modelo entrega resultado equivalente gastando menos token, e isso foi medido com rigor suficiente pra eu acreditar. ## Comparando maçãs com maçãs: a conta real Agora que sabemos quais linhas faltavam, dá pra montar a planilha inteira. Vou usar valores do mercado brasileiro e deixar claro o que é estimativa minha. **Camada 1, preço do token.** Empate, como já vimos. **Camada 2, tokens consumidos por tarefa.** Aqui a conta muda de dono. Se o harness resolve a mesma tarefa gastando menos token, a eficiência dele *é* desconto direto na sua fatura. E o meu harness caseiro, que reenviava histórico inteiro sem compactar e não tinha nenhuma estratégia de roteamento, gastava muito mais que isso. Não meço em percentual porque minha amostra é ruído, e eu acabei de dizer que isso não vale. Mas a direção é inequívoca. **Camada 3, custo de construir.** Meu protótipo levou umas 14 horas entre sábado e domingo. Hora de dev sênior no Brasil não sai por menos de R$ 120 a R$ 180, então são uns R$ 2.000 pra chegar num agente que funciona numa demo controlada. Pra chegar em algo que roda em produção (com permissão, compactação, tratamento de erro decente, telemetria) some pelo menos mais um mês de trabalho. Chame de R$ 25.000, sendo otimista. **Camada 4, custo de manter.** Modelo novo a cada semana. Cada um exige recalibrar prompt, formato de ferramenta e critério de parada. Isso não é projeto, é rotina. E rotina tem dono, e dono tem salário. **Camada 5, custo de avaliar.** Essa é a linha que ninguém coloca no orçamento, e é a mais cara. Faz a conta comigo usando só o TerminalBench 2.0, que é o benchmark pequeno da lista: 89 tarefas, cinco execuções por configuração, quatro modelos, dois harnesses comparados. Dá 3.560 execuções de agente. A um custo conservador de US$ 1 por tarefa, são US$ 3.560 em tokens antes de você olhar pros outros quatro benchmarks, e o SWE-bench Verified sozinho tem 500 tarefas. Toda vez que mexer numa linha do seu seletor de contexto. Você vai fazer isso? Eu não vou, e nenhum cliente meu vai. **Camada 6, governança e faturamento.** Com API direta, cada dev tem uma chave. As chaves vão parar em `.env`, em script de CI, em variável de ambiente de máquina local. Você perde visibilidade de custo, perde controle de qual modelo está sendo usado, e ganha um problema de segurança. Chave de API é credencial de longa duração, e chave vazada em repositório é das formas mais comuns de incidente que eu vejo. Com Copilot em plano de organização, os AI Credits são pooled, o admin define budget e acompanha consumo no dashboard de billing, e a política de quais modelos ficam habilitados é decisão do enterprise, não de cada dev. Juntando tudo: | Fator | API direta (harness próprio) | GitHub Copilot | | ------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------ | | Preço do token | Tarifa oficial | Tarifa oficial | | Tokens por tarefa | O que o seu código conseguir | Paridade de resolução com menos token na maioria das configurações | | Construção | \~R$ 25.000 pra chegar em produção (estimativa minha) | Incluído | | Manutenção por modelo novo | Recalibração recorrente | Incluído | | Avaliação com rigor estatístico | Inviável pra maioria dos times | Feita e publicada | | Chaves e credenciais | Espalhadas, longa duração | Centralizadas na organização | | Visibilidade de custo | Você constrói | Dashboard de billing com budget | | Escolha de modelo | Um por implementação | 20+ modelos no mesmo harness | Repare na última linha, porque ela é contraintuitiva. Adotar uma plataforma parece lock-in. **Mas** o harness multi-modelo é exatamente o contrário: é a camada que te deixa trocar de modelo sem reescrever nada. Se amanhã sai um modelo melhor e mais barato, você muda um seletor. No harness que você construiu, você reabre os seis problemas que eu listei lá em cima. E tem capacidade que só existe porque o harness é multi-modelo. O [Rubber Duck](https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-combines-model-families-for-a-second-opinion/?ref=azurebrasil.cloud), por exemplo: um modelo de uma família revisa o trabalho de outra família, justamente porque foram treinados com dados diferentes e têm pontos cegos diferentes. Um harness de fornecedor único não tem como oferecer isso. O seu, muito menos. ## Quando a API crua é a resposta certa Agora vamos ser equilibrados, porque eu detesto post que só defende um lado. Existe um cenário em que chamar a API direto é a decisão certa, e não é raro: quando o agente é o seu produto, e não a sua ferramenta. Se você está construindo uma feature dentro do seu software, uma plataforma interna de agentes, um pipeline de automação com trilha de auditoria própria, ou qualquer coisa em que o comportamento do agente *é* o diferencial que você vende, você precisa ser dono das primitivas. Prompts, retrieval, roteamento, retry, logs, modelo de segurança, billing. Nesse caso, o "custo de construir" que eu listei acima não é desperdício. É o seu roadmap de produto. O critério que eu uso hoje com clientes é simples: **o trabalho começa e termina dentro do fluxo de desenvolvimento de software?** Issue, código, teste, pull request, review, deploy. Se sim, você quer o harness pronto. Construir o seu é reinventar uma roda que já foi medida contra cinco benchmarks e quatro modelos. Se o trabalho é um agente que lê um sistema interno, cria um change request num ITSM e grava evidência de compliance num formato que o seu auditor exige, aí você está construindo produto. Vai de API. E tem um meio-termo que pouca gente conhece. São dois caminhos: O [Copilot SDK](https://github.com/github/copilot-sdk?ref=azurebrasil.cloud) expõe exatamente o mesmo runtime de agente que roda no Copilot CLI. Você embute um harness já testado dentro da *sua* aplicação, em vez de escrever o seu. É a opção que eu teria escolhido se soubesse dela antes do meu fim de semana perdido. E o **BYOK** (Bring Your Own Key), hoje em public preview, deixa você usar modelos do seu próprio contrato (Anthropic, AWS Bedrock, Google AI Studio, Microsoft Foundry, OpenAI, provedores compatíveis com OpenAI, xAI, e até modelos locais via Ollama no Copilot CLI) passando pelo harness e pelas integrações que o GitHub mantém. A conta do token vai pro seu fornecedor. A engenharia do harness continua sendo problema deles. Na prática, se o seu argumento pra API direta era comercial ("já tenho compromisso de gasto com fornecedor X"), dá pra manter o contrato e não pagar o pedágio de construir o harness. Vale ressaltar que BYOK ainda é preview, então valide antes de amarrar decisão de arquitetura nisso. ## Uma sequência pragmática pro seu time Se essa discussão está acontecendo aí na sua empresa agora, é assim que eu conduziria: 1. Separe as duas perguntas. "Qual modelo usar" e "qual harness usar" são decisões independentes, e misturar as duas é o que faz a discussão nunca terminar. 2. Classifique cada caso de uso em "trabalho de desenvolvimento de software" ou "produto com comportamento de agente próprio". A resposta muda completamente entre os dois. 3. Se for desenvolvimento, use o harness pronto e invista o tempo do time em `copilot-instructions.md`, custom agents e MCP servers, que é onde o conhecimento do *seu* domínio realmente entra. [O Burke Holland escreveu um post excelente](https://github.blog/ai-and-ml/github-copilot/the-harness-is-all-you-need-mostly/?ref=azurebrasil.cloud) argumentando que a maior parte do ganho vem de aprender bem o harness, não de instalar mais coisa em cima dele. Concordo integralmente. 4. Se for produto, comece pelo Copilot SDK antes de escrever seu próprio loop. Você pode descobrir que boa parte do que ia construir já está pronto. 5. Nunca meça melhoria com uma execução só. Se for comparar qualquer coisa, rode no mínimo cinco vezes. Eu aprendi na marra. 6. Centralize credencial. Chave de API espalhada em `.env` de dev é dívida de segurança, não conveniência. ## A lição que ficou Voltando à pergunta daquele dev na reunião: "por que eu pago Copilot se é o mesmo modelo e o mesmo preço de token?" A resposta que eu daria hoje, e que eu não tinha na semana passada: porque você não está pagando pelo modelo. O modelo pensa, mas o harness decide o que ele vê. E decidir o que ele vê é um problema de engenharia contínuo, com custo de construção, custo de manutenção a cada modelo novo, e um custo de avaliação estatística que praticamente nenhum time consegue bancar sozinho. Eu construí o meu. Levou 14 horas pra funcionar numa demo e uns 20 minutos pra quebrar num repositório real. E a parte mais valiosa do experimento não foi o código. Foi descobrir que eu não tinha como saber se estava melhorando ou piorando. Isso não é marketing. É o que aconteceu na minha máquina num fim de semana que eu poderia ter usado pra qualquer outra coisa. E você, já tentou montar seu próprio loop de agente? Chegou até que problema antes de desistir, ou está rodando em produção e eu estou errado? Conta nos comentários, tenho curiosidade genuína de ouvir quem foi mais longe que eu. Aqui na AzureBrasil.cloud a gente ajuda times brasileiros a fazer exatamente esse tipo de escolha: onde usar plataforma pronta, onde construir, e como faturar tudo isso dentro do contrato Azure em BRL. Se essa conversa está travada aí, fala com a gente. \[\]s e até a próxima. ## Referências ### Artigos que motivaram este post - [Copilot vs. raw API access: What are you actually paying for? — GitHub Blog](https://github.blog/ai-and-ml/github-copilot/copilot-vs-raw-api-access-what-are-you-actually-paying-for/?ref=azurebrasil.cloud) — Andrea Griffiths, o post que puxou o fio dessa discussão - [Evaluating performance and efficiency of the GitHub Copilot agentic harness across models and tasks — GitHub Blog](https://github.blog/ai-and-ml/github-copilot/evaluating-performance-and-efficiency-of-the-github-copilot-agentic-harness-across-models-and-tasks/?ref=azurebrasil.cloud) — a metodologia e os números de benchmark citados aqui - [The harness is all you need (mostly) — GitHub Blog](https://github.blog/ai-and-ml/github-copilot/the-harness-is-all-you-need-mostly/?ref=azurebrasil.cloud) — Burke Holland, sobre extrair valor do harness sem empilhar ferramenta ### Harness, SDK e escolha de modelo - [GitHub Copilot SDK](https://github.com/github/copilot-sdk?ref=azurebrasil.cloud) — o mesmo runtime de agente do Copilot CLI, pra embutir na sua aplicação - [Auto model selection — GitHub Docs](https://docs.github.com/en/copilot/concepts/models/auto-model-selection?ref=azurebrasil.cloud) — como o Copilot escolhe modelo por intenção da tarefa e saúde do modelo - [Rubber Duck: crítica cruzada entre famílias de modelo — GitHub Blog](https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-combines-model-families-for-a-second-opinion/?ref=azurebrasil.cloud) — capacidade que só existe em harness multi-modelo - [Getting more from each token: context handling e model routing — GitHub Blog](https://github.blog/ai-and-ml/github-copilot/getting-more-from-each-token-how-copilot-improves-context-handling-and-model-routing/?ref=azurebrasil.cloud) — as otimizações que explicam a diferença de consumo ### BYOK e planos - [Use your own API keys with GitHub Copilot (enterprise) — GitHub Docs](https://docs.github.com/copilot/how-tos/administer-copilot/manage-for-enterprise/use-your-own-api-keys?ref=azurebrasil.cloud) — BYOK no nível de organização, ainda em public preview - [Use BYOK models in Copilot CLI — GitHub Docs](https://docs.github.com/copilot/how-tos/copilot-cli/customize-copilot/use-byok-models?ref=azurebrasil.cloud) — incluindo endpoints compatíveis com OpenAI, Azure OpenAI e Ollama local - [GitHub Copilot plans e AI Credits](https://github.com/features/copilot/plans?ref=azurebrasil.cloud) — o que cada plano inclui ### Posts relacionados aqui do blog - [A Conta Chegou: GitHub Anuncia AI Credits e Marca 1º de Junho como o Fim da Era PRU](https://www.azurebrasil.cloud/blog/a-conta-chegou-github-anuncia-ai-credits-e-marca-1o-de-junho-como-o-fim-da-era-pru/) — o modelo de cobrança por token que torna essa comparação possível - [A IA Barata Está Acabando: Por Que GitHub Copilot Business é a Aposta Mais Segura Agora](https://www.azurebrasil.cloud/blog/a-ia-barata-esta-acabando-por-que-github-copilot-business-e-a-aposta-mais-segura-agora/) — previsibilidade contratual e governança em time - [GitHub Copilot CLI ACP Server: o "USB-C" para agentes de IA chegou ao terminal](https://www.azurebrasil.cloud/blog/github-copilot-cli-acp-server-o-usb-c-para-agentes-de-ia-chegou-ao-terminal/) — como consumir o harness do Copilot de dentro das suas ferramentas - [GitHub Copilot Coding Agent: Como a IA Autônoma Está Transformando a Produtividade de Times de Desenvolvimento](https://www.azurebrasil.cloud/blog/github-copilot-coding-agent-como-a-ia-autonoma-esta-transformando-a-produtividade-de-times-de-desenvolvimento/) — o agente que trabalha a partir de issues ### Implementando o Back-end com GitHub Copilot: .NET Minimal API, DTOs e EF Core InMemory na prática (Parte 3) URL: https://www.azurebrasil.cloud/blog/implementando-o-back-end-com-github-copilot-net-minimal-api-dtos-e-ef-core-inmemory-na-pratica-parte-3/ Last updated: 2026-07-28T12:15:14.000Z Nas duas primeiras partes desta série, o foco foi inteiramente o front-end. Na [Parte 1](https://www.azurebrasil.cloud/blog/como-refatorar-o-seu-codigo-front-end-utilizando-github-copilot-com-instructions-agents-e-skills-especializadas-parte-1/), construí a camada de governança do [GitHub Copilot](https://github.com/features/copilot?ref=azurebrasil.cloud) para um projeto Vue 3 com PrimeVue 4, com um arquivo de instructions, um agent especializado e uma skill de criação de componentes. Na [Parte 2](https://www.azurebrasil.cloud/blog/integrando-tailwind-css-v4-ao-primevue-com-github-copilot-quando-usar-cada-um-e-como-garantir-consistencia-parte-2/), integrei o Tailwind CSS aos tokens do PrimeVue mantendo essa mesma governança, eliminando mais de 400 linhas de CSS scoped duplicado. Ao final da Parte 2, os formulários de Sign in, Create account e Reset password estavam visualmente prontos, consistentes e sem erros de tipagem, mas ainda emitiam eventos que não chegavam a lugar nenhum. Nesta Parte 3, esse vazio é preenchido: entra em cena o back-end real do projeto, construído em .NET com apoio direto do GitHub Copilot. → Sign in ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-3-1.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-7.png) ***→*** Create account ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-4-1.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-6.png) → Reset password ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-5-1.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-8.png) Diferente do front-end, onde a governança vive em um arquivo de instructions carregado automaticamente para todo arquivo `.vue`, o back-end deste projeto não precisou de um arquivo de instructions próprio. A razão é simples: são três endpoints HTTP com um contrato já definido pelo front-end existente ([api.ts](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/src/services/api.ts?ref=azurebrasil.cloud) e [auth.service.ts](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/src/services/auth.service.ts?ref=azurebrasil.cloud)). Em vez de documentar regras para dezenas de arquivos futuros, o briefing técnico foi passado diretamente ao GitHub Copilot em modo de conversa, descrevendo a stack esperada: uma API .NET usando [Minimal APIs](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?ref=azurebrasil.cloud), DTOs fortemente tipados para request e response, e o Entity Framework Core com o provider [InMemory](https://learn.microsoft.com/en-us/ef/core/providers/in-memory/?ref=azurebrasil.cloud) como base de dados. Esse tipo de prompt funciona como um contrato: ao declarar a tecnologia e a forma esperada dos dados antes de pedir qualquer implementação, o GitHub Copilot para de "adivinhar" a arquitetura e passa a gerar código já alinhado ao que o front-end espera consumir. Para uma prova de conceito de front-end como essa, cujo objetivo é validar chamadas HTTP reais de registro, login e recuperação de senha, o Minimal API do ASP.NET Core é a escolha natural desde o início. São três endpoints HTTP simples, sem filas, sem timers e sem bindings de infraestrutura, então o back-end foi desenhado para rodar direto com `dotnet run` sobre Kestrel, sem nenhuma camada de hosting adicional. O [api.csproj](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/api.csproj?ref=azurebrasil.cloud) reflete essa simplicidade: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image.png) Uma única dependência de pacote, o [Microsoft.EntityFrameworkCore.InMemory](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Program.cs?ref=azurebrasil.cloud), é suficiente para simular uma base de dados persistente sem exigir Docker, SQL Server ou Azurite rodando localmente. Isso é particularmente valioso para uma prova de conceito de front-end, onde o objetivo é validar chamadas HTTP reais, não montar infraestrutura de dados. O ponto de entrada da aplicação já mostra o quanto o Minimal API reduz o boilerplate: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-1.png) [AddDbContext()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Data/AppDbContext.cs?ref=azurebrasil.cloud) Registra o [AppDbContext](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Data/AppDbContext.cs?ref=azurebrasil.cloud) no container de injeção de dependência, configurado para usar o provider InMemory com o nome de base `MockDb`. **AddCors()** e **UseCors()** Configuram e ativam uma política de [CORS](https://learn.microsoft.com/en-us/aspnet/core/security/cors?ref=azurebrasil.cloud) liberando `http://localhost:5173`, exatamente a porta onde o Vite serve o front-end, permitindo que o navegador aceite as respostas da API. [MapAuthEndpoints()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Endpoints/AuthEndpoints.cs?ref=azurebrasil.cloud) Método de extensão que registra os três endpoints de autenticação no pipeline HTTP. **UseUrls("http://localhost:7071")** Fixa a porta do Kestrel na mesma que o [vite.config.ts](vscode-file://vscode-app/Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html) já usa como proxy para [api](vscode-file://vscode-app/Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html), o que significa que o front-end não precisou de nenhuma alteração para passar a falar com o back-end. O modelo de dados também é enxuto. [User](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Models/User.cs?ref=azurebrasil.cloud) é uma entidade simples do EF Core, e [AppDbContext](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Data/AppDbContext.cs?ref=azurebrasil.cloud) define apenas o [DbSet](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Data/AppDbContext.cs?ref=azurebrasil.cloud) e uma constraint de unicidade no e-mail: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-2.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-3.png) [OnModelCreating()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Data/AppDbContext.cs?ref=azurebrasil.cloud) Declara um índice único sobre [Email](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Models/User.cs?ref=azurebrasil.cloud), garantindo que o provider InMemory rejeite duplicatas da mesma forma que uma base relacional real rejeitaria. Foi exatamente nesse ponto do desenvolvimento que as sugestões inline do GitHub Copilot (não o chat, o autocomplete "ghost text" direto no editor) tiveram o maior impacto no ritmo de implementação. Ao abrir o arquivo [AppDbContext.cs](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Data/AppDbContext.cs?ref=azurebrasil.cloud) e começar a digitar o método [OnModelCreating](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Data/AppDbContext.cs?ref=azurebrasil.cloud), o próprio nome do método e a entidade [User](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Models/User.cs?ref=azurebrasil.cloud) já aberta em outra aba deram contexto suficiente para o GitHub Copilot sugerir a constraint de unicidade completa como ghost text, aceita com um simples Tab. Esse é o uso mais básico e ainda assim mais valioso do GitHub Copilot em um back-end: contexto do arquivo, do nome do método e de arquivos vizinhos abertos já é o bastante para acelerar código repetitivo do EF Core sem sair do editor. Os DTOs (Data Transfer Objects) definem exatamente o formato de request e response que o front-end espera, e aqui o benefício de "instruir por contrato" fica visível: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-4.png) [RegisterRequest](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Dtos/AuthDtos.cs?ref=azurebrasil.cloud), [LoginRequest](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Dtos/AuthDtos.cs?ref=azurebrasil.cloud), [ForgotPasswordRequest](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Dtos/AuthDtos.cs?ref=azurebrasil.cloud) Representam exatamente o corpo JSON enviado pelo front-end em cada chamada, com propriedades anuláveis para permitir validação explícita em vez de depender do model binding para rejeitar payloads incompletos. [AuthUserResponse](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Dtos/AuthDtos.cs?ref=azurebrasil.cloud) É a forma pública e segura de devolver um usuário: nunca inclui o hash da senha, apenas **Id**, **Name** e **Email**. [MessageResponse](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Dtos/AuthDtos.cs?ref=azurebrasil.cloud) Um envelope único para mensagens de erro e sucesso, usado tanto no `400 Bad Request` de validação quanto no `200 OK` de esqueci minha senha. Como o Minimal APIs do ASP.NET Core já usa `JsonSerializerDefaults.Web` por padrão (camelCase, case-insensitive), esses records são serializados exatamente no formato que `auth.service.ts` já espera consumir, sem nenhuma camada extra de mapeamento manual. O hashing de senha foi outro ponto onde os comentários funcionaram como diretiva direta para o GitHub Copilot gerar código. Escrever o comentário de resumo da classe antes do corpo do método é suficiente para que o autocomplete gere a implementação de PBKDF2 completa usando [**Rfc2898DeriveBytes**](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rfc2898derivebytes?ref=azurebrasil.cloud): ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/image-5.png) [Hash()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Services/PasswordHasher.cs?ref=azurebrasil.cloud) Gera um salt aleatório, deriva o hash com PBKDF2 e serializa iterações, salt e hash em uma única string separada por pontos. [Verify()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Services/PasswordHasher.cs?ref=azurebrasil.cloud) Faz o parse do hash armazenado, deriva o hash da senha informada com o mesmo salt e número de iterações, e compara os dois usando **CryptographicOperations.FixedTimeEquals**. Esse **FixedTimeEquals** é um bom exemplo de quando vale a pena abrir o painel de completions com Ctrl+Enter em vez de aceitar a primeira sugestão com Tab. Ao pedir alternativas para a comparação final entre o hash calculado e o hash armazenado, o painel mostra lado a lado diferentes implementações possíveis, e a comparação de tempo constante do [CryptographicOperations.FixedTimeEquals](vscode-file://vscode-app/Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html) se destaca das demais por evitar que a diferença de tempo de execução vaze informação sobre a senha, um cuidado que só faz sentido comparando as opções antes de aceitar qualquer uma delas. Os três endpoints de autenticação concentram a maior parte da lógica de negócio, e aqui os comentários deixados no código são as próprias diretivas usadas para orientar o GitHub Copilot durante a escrita: ```csharp using System.Text.RegularExpressions; using Api.Data; using Api.Dtos; using Api.Models; using Api.Services; using Microsoft.EntityFrameworkCore; namespace Api.Endpoints; public static class AuthEndpoints { private static readonly Regex EmailPattern = new(@"^[^\s@]+@[^\s@]+\.[^\s@]+$", RegexOptions.Compiled); private const string InvalidCredentialsMessage = "Invalid email or password."; private const string ForgotPasswordSuccessMessage = "If an account exists for this email, you'll receive a reset link shortly."; public static void MapAuthEndpoints(this WebApplication app) { var group = app.MapGroup("/api"); group.MapPost("/register", Register); group.MapPost("/login", Login); group.MapPost("/forgot-password", ForgotPassword); } private static async Task Login(LoginRequest request, AppDbContext db) { var email = request.Email?.Trim() ?? ""; var password = request.Password ?? ""; var user = await db.Users.FirstOrDefaultAsync(u => u.Email.ToLower() == email.ToLower()); // Same generic error for "no such user" and "wrong password" — avoids account enumeration. if (user is null || !PasswordHasher.Verify(password, user.PasswordHash)) { return Results.Json(new MessageResponse(InvalidCredentialsMessage), statusCode: StatusCodes.Status401Unauthorized); } return Results.Ok(new AuthUserResponse(user.Id, user.Name, user.Email)); } private static IResult ForgotPassword(ForgotPasswordRequest request) { var email = request.Email?.Trim() ?? ""; if (string.IsNullOrWhiteSpace(email) || !EmailPattern.IsMatch(email)) { return Results.BadRequest(new MessageResponse("Enter a valid email address.")); } // Always return the same generic success message, regardless of whether the account // exists, to avoid leaking which emails are registered (OWASP A07). return Results.Ok(new MessageResponse(ForgotPasswordSuccessMessage)); } } ``` [MapAuthEndpoints()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Endpoints/AuthEndpoints.cs?ref=azurebrasil.cloud) Cria um grupo de rotas sob [api](https://github.com/flpdefaria/poc-frontend-ghc/tree/article-v3/api?ref=azurebrasil.cloud) e registra os três handlers de **Register**, **Login** e **ForgotPassword** como **MapPost**. [Login()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Endpoints/AuthEndpoints.cs?ref=azurebrasil.cloud) Busca o usuário por e-mail e verifica a senha com [PasswordHasher.Verify()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Services/PasswordHasher.cs?ref=azurebrasil.cloud), devolvendo sempre a mesma mensagem genérica de erro tanto para usuário inexistente quanto para senha incorreta. [ForgotPassword()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Endpoints/AuthEndpoints.cs?ref=azurebrasil.cloud) Valida apenas o formato do e-mail e sempre responde `200 OK` com a mesma mensagem, independentemente de a conta existir ou não. Esses dois comentários, "avoids account enumeration" e "OWASP A07", foram digitados primeiro, como diretiva, exatamente no padrão descrito na [documentação de sugestões inline do GitHub Copilot no VS Code](https://code.visualstudio.com/docs/copilot/ai-powered-suggestions?ref=azurebrasil.cloud): um comentário fraseado como instrução direciona o autocomplete a gerar a implementação correspondente, em vez de apenas complementar o código já escrito. Declarar a intenção de segurança em uma frase antes de qualquer lógica foi suficiente para que a sugestão do GitHub Copilot para o handler de login já viesse com a mensagem genérica correta, cobrindo tanto o caso de usuário inexistente quanto o de senha incorreta com a mesma resposta, exatamente o tipo de cuidado que o [OWASP Top 10](https://owasp.org/Top10/2021/A07%5F2021-Identification%5Fand%5FAuthentication%5FFailures/index.html?ref=azurebrasil.cloud) recomenda para evitar vazamento de informação em falhas de autenticação. O mesmo padrão de comentário-como-diretiva se repete no handler de registro, que usa uma constante [EmailPattern](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Endpoints/AuthEndpoints.cs?ref=azurebrasil.cloud) compilada para validar o formato do e-mail antes de tocar no banco, e retorna **409 Conflict** quando o e-mail já existe, fazendo a checagem de duplicidade case-insensitive diretamente na query com [Email.ToLower()](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Models/User.cs?ref=azurebrasil.cloud). Nenhuma dessas decisões precisou de um arquivo de instructions dedicado ao back-end: o contexto acumulado dentro da própria conversa com o GitHub Copilot, reforçado pelos comentários deixados no código à medida que cada regra de negócio era implementada, foi suficiente para manter a consistência entre os três endpoints. Com os quatro arquivos no lugar ([Program.cs](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Program.cs?ref=azurebrasil.cloud), o modelo [User](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/api/Models/User.cs?ref=azurebrasil.cloud), os DTOs e os endpoints), o teste é direto: `dotnet build` compila sem erros, `dotnet run` sobe o Kestrel em segundos servindo `http://localhost:7071`, e uma bateria de chamadas via curl confirma os três fluxos completos, incluindo o registro com nome, e-mail e senha inválidos retornando `400`, o e-mail duplicado retornando `409`, e o login retornando `401` genérico tanto para usuário inexistente quanto para senha errada. O mais importante para o front-end é que nada em [api.ts](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/src/services/api.ts?ref=azurebrasil.cloud) ou [auth.service.ts](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v3/src/services/auth.service.ts?ref=azurebrasil.cloud) precisou mudar: como o proxy do Vite já apontava para `http://localhost:7071/api`, e os DTOs replicam exatamente o shape JSON que o front-end sempre esperou, os formulários construídos e migrados nas Partes 1 e 2 passaram a se autenticar contra uma API real sem tocar em uma única linha de código Vue. O que essa Parte 3 deixa mais claro é que a governança que o GitHub Copilot precisa para gerar código consistente muda de forma dependendo da natureza do projeto. No front-end, com dezenas de componentes Vue seguindo o mesmo padrão visual, um arquivo de instructions carregado automaticamente é o mecanismo certo. No back-end, com poucos arquivos e um contrato de API já definido, o mesmo resultado foi alcançado descrevendo a stack tecnológica diretamente na conversa e reforçando decisões de segurança pontuais com comentários que funcionam como diretivas para o autocomplete. Em ambos os casos, o ganho real não veio de "deixar a IA decidir", mas de dar ao GitHub Copilot o contexto certo, no lugar certo, no momento certo. O código completo deste projeto está disponível no meu repositório no [GitHub](https://github.com/flpdefaria/poc-frontend-ghc/tree/article-v3?ref=azurebrasil.cloud). Links e Docs: [GitHub Copilot · Your AI pair programmerGitHub Copilot works alongside you directly in your editor, suggesting whole lines or entire functions for you.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-27316f34-3315-4caf-af78-aece7af23bc3.svg)GitHub![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/github-copilot-social-img-313b273e-6aeb-4a1c-9bc4-196b35217f47.png)](https://github.com/features/copilot?ref=azurebrasil.cloud) [Minimal APIs quick referenceProvides an overview of Minimal APIs in ASP.NET Core![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-bcb60629-9cf8-4afc-8e0a-bfb51a749779.ico)Microsoft Learnwadepickett![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/dotnet-logo-b6bbeb72-09d7-4014-9a5c-20a02ba8a84b.png)](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?ref=azurebrasil.cloud) [In-memory Database Provider - EF CoreInformation on the Entity Framework Core in-memory database provider![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-e6ab1fe9-ae7c-451a-8269-57ae8bb93fa6.ico)Microsoft LearnSamMonoRT![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/open-graph-image-014272dd-11b3-47fa-84c2-41e2b706993b.png)](https://learn.microsoft.com/en-us/ef/core/providers/in-memory/?ref=azurebrasil.cloud) [Enable Cross-Origin Requests (CORS) in ASP.NET CoreLearn how CORS as a standard for allowing or rejecting cross-origin requests in an ASP.NET Core app.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-39a5a6c5-3339-4e5f-8588-f7e1fadcc191.ico)Microsoft Learntdykstra![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/dotnet-logo-21ed4d75-a415-4e8f-977e-4357b15806d8.png)](https://learn.microsoft.com/en-us/aspnet/core/security/cors?ref=azurebrasil.cloud) [Rfc2898DeriveBytes Class (System.Security.Cryptography)Implements password-based key derivation functionality, PBKDF2, by using a pseudo-random number generator based on HMACSHA1.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-37429a5d-6e2f-4471-b680-20e7d7f8a654.ico)Microsoft Learndotnet-bot![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/open-graph-image-a180a407-0f54-473d-9707-52fd64f40072.png)](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rfc2898derivebytes?ref=azurebrasil.cloud) [Inline suggestions from GitHub Copilot in VS CodeGet AI-powered inline suggestions from GitHub Copilot in VS Code, including ghost text completions and next edit suggestions.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-55b432cb-a752-4b4a-a7ed-342d12b97386.ico)MicrosoftMicrosoft![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/ai-powered-suggestions-685320db-2c25-49dd-b435-ce35146fcf8b.webp)](https://code.visualstudio.com/docs/copilot/ai-powered-suggestions?ref=azurebrasil.cloud) [A07 Identification and Authentication Failures - OWASP Top 10:2021OWASP Top 10:2021![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-ad55bcf7-635c-4a81-9398-c2efbc785ffa.png)logo![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/TOP_10_Icons_Final_Identification_and_Authentication_Failures-53157454-1ff2-4783-be9f-9f4aa87a13a5.png)](https://owasp.org/Top10/2021/A07%5F2021-Identification%5Fand%5FAuthentication%5FFailures/index.html?ref=azurebrasil.cloud) Não esqueça de me seguir no [LinkedIn](https://www.linkedin.com/in/flpfaria/?ref=azurebrasil.cloud) para mais conteúdos. Até a próxima!!! ### AzureBrasil Newsletter - 2026-07-27 URL: https://www.azurebrasil.cloud/blog/azurebrasil-newsletter-2026-07-27/ Last updated: 2026-07-27T11:41:04.000Z ### Azure Updates - [Announcing the Open-Source Release of ML Video Codec (MLVC)](https://techcommunity.microsoft.com/t5/linux-and-open-source-blog/announcing-the-open-source-release-of-ml-video-codec-mlvc/ba-p/4539875?ref=azurebrasil.cloud) - [Claude Opus 5 is available today in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/claude-opus-5-is-available-today-in-microsoft-foundry/ba-p/4535068?ref=azurebrasil.cloud) - [Beyond text: Returning images and interactive apps from MCP servers](https://techcommunity.microsoft.com/t5/microsoft-developer-community/beyond-text-returning-images-and-interactive-apps-from-mcp/ba-p/4535865?ref=azurebrasil.cloud) - [Native Agent Memory for Microsoft Agent Framework, Powered by Azure Cosmos DB](https://devblogs.microsoft.com/cosmosdb/native-agent-memory-for-microsoft-agent-framework-powered-by-azure-cosmos-db/?ref=azurebrasil.cloud) - [Your Entire Agentic AI Workflow, Now Inside VS Code: New Course Available](https://techcommunity.microsoft.com/t5/microsoft-developer-community/your-entire-agentic-ai-workflow-now-inside-vs-code-new-course/ba-p/4539009?ref=azurebrasil.cloud) - [Design, test, and ship Foundry hosted agents from a canvas in GitHub Copilot App](https://techcommunity.microsoft.com/t5/microsoft-developer-community/design-test-and-ship-foundry-hosted-agents-from-a-canvas-in/ba-p/4539921?ref=azurebrasil.cloud) - [Post-Stream Refinement is now generally available in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/post-stream-refinement-is-now-generally-available-in-microsoft/ba-p/4540174?ref=azurebrasil.cloud) - [For the first time, real-time transcription goes multilingual](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/for-the-first-time-real-time-transcription-goes-multilingual/ba-p/4539089?ref=azurebrasil.cloud) - [Introducing MAI-Image-2.5 Pro and MAI-Voice-2 Flash in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/introducing-mai-image-2-5-pro-and-mai-voice-2-flash-in-microsoft/ba-p/4539446?ref=azurebrasil.cloud) - [Changing the engine while the plane is flying: migrating 60,000 apps under live load](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/changing-the-engine-while-the-plane-is-flying-migrating-60-000/ba-p/4539443?ref=azurebrasil.cloud) - [Introducing Kubernetes-Native Policy Validation with CEL and VAP in Azure Policy](https://techcommunity.microsoft.com/t5/azure-governance-and-management/introducing-kubernetes-native-policy-validation-with-cel-and-vap/ba-p/4534585?ref=azurebrasil.cloud) - [📢 Announcing Built-In Knowledge for Azure Logic Apps](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/announcing-built-in-knowledge-for-azure-logic-apps/ba-p/4524601?ref=azurebrasil.cloud) - [The Microsoft 365 Copilot Agent’s Playbook: A Practical Livestream Series for Building Better Agents](https://devblogs.microsoft.com/blog/the-microsoft-365-copilot-agents-playbook-a-practical-livestream-series-for-building-better-agents/?ref=azurebrasil.cloud) - [Announcing public preview of Azure DDoS Protection custom policy](https://techcommunity.microsoft.com/t5/azure-networking-blog/announcing-public-preview-of-azure-ddos-protection-custom-policy/ba-p/4538963?ref=azurebrasil.cloud) - [Azure Lighthouse: Bring Your Partner In, Without Letting Their Identities In (part 2 of 3)](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/azure-lighthouse-bring-your-partner-in-without-letting-their/ba-p/4529852?ref=azurebrasil.cloud) - [Understanding Microsoft 365 Copilot Risk Surface and Mitigations](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/understanding-microsoft-365-copilot-risk-surface-and-mitigations/ba-p/4538712?ref=azurebrasil.cloud) - [Build locally, ship to Azure: meet Azure SQL Developer](https://devblogs.microsoft.com/azure-sql/azure-sql-developer-prpr/?ref=azurebrasil.cloud) - [Should You Use the New Microsoft Entra Tenant Governance or Azure Lighthouse? (part 3 of 3)](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/should-you-use-the-new-microsoft-entra-tenant-governance-or/ba-p/4532297?ref=azurebrasil.cloud) - [Azure Files, Reimagined: Top-Level Shares with Per-Share Networking, Billing, and Scale](https://techcommunity.microsoft.com/t5/itops-talk-blog/azure-files-reimagined-top-level-shares-with-per-share/ba-p/4535079?ref=azurebrasil.cloud) - [Hybrid Logic Apps on RKE2: a self-managed cluster with MetalLB](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/hybrid-logic-apps-on-rke2-a-self-managed-cluster-with-metallb/ba-p/4539846?ref=azurebrasil.cloud) - [Reminder: Path to Production for Agents Webinar Series Starts Next Week](https://techcommunity.microsoft.com/t5/azure-architecture-blog/reminder-path-to-production-for-agents-webinar-series-starts/ba-p/4539877?ref=azurebrasil.cloud) - [Azure Local expands SAN capabilities with iSCSI support](https://techcommunity.microsoft.com/t5/azure-arc-blog/azure-local-expands-san-capabilities-with-iscsi-support/ba-p/4531999?ref=azurebrasil.cloud) - [Some tools and techniques for hardening Windows Server](https://techcommunity.microsoft.com/t5/itops-talk-blog/some-tools-and-techniques-for-hardening-windows-server/ba-p/4539840?ref=azurebrasil.cloud) - [Grounding Copilot Studio Agents with Azure AI Search and Foundry IQ](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/grounding-copilot-studio-agents-with-azure-ai-search-and-foundry/ba-p/4539337?ref=azurebrasil.cloud) - [MCP in Azure: Using API Management for Authentication, Access, Logging & Governance](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/mcp-in-azure-using-api-management-for-authentication-access/ba-p/4532139?ref=azurebrasil.cloud) - [Connecting Microsoft Discovery App to Azure HPC with Azure NetApp Files and CycleCloud](https://techcommunity.microsoft.com/t5/azure-high-performance-computing/connecting-microsoft-discovery-app-to-azure-hpc-with-azure/ba-p/4539224?ref=azurebrasil.cloud) - [Design the Network Before You Deploy: Best Practices for Microsoft Foundry Standard Agents BYOVNet](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/design-the-network-before-you-deploy-best-practices-for/ba-p/4537860?ref=azurebrasil.cloud) - [Microsoft Discovery: Where HPC meets agentic AI for the next era of EDA](https://techcommunity.microsoft.com/t5/azure-high-performance-computing/microsoft-discovery-where-hpc-meets-agentic-ai-for-the-next-era/ba-p/4539212?ref=azurebrasil.cloud) - [Building Agents that Act on Your Behalf with Toolboxes in Foundry](https://devblogs.microsoft.com/foundry/building-agents-that-act-on-your-behalf-with-toolboxes-in-foundry/?ref=azurebrasil.cloud) - [Cut Your Azure Blob Storage Bill in Half: A Practical Walkthrough of Object Storage TCO](https://techcommunity.microsoft.com/t5/itops-talk-blog/cut-your-azure-blob-storage-bill-in-half-a-practical-walkthrough/ba-p/4534575?ref=azurebrasil.cloud) - [July Patches for Azure DevOps Server](https://devblogs.microsoft.com/devops/july-patches-for-azure-devops-server-3/?ref=azurebrasil.cloud) - [Choosing the Right Starting Point for Enterprise AI Agents with Copilot Studio and Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/choosing-the-right-starting-point-for-enterprise-ai-agents-with/ba-p/4535024?ref=azurebrasil.cloud) - [Take command of your Microsoft Foundry AI agents with the Azure Copilot Observability Agent](https://techcommunity.microsoft.com/t5/azure-observability-blog/take-command-of-your-microsoft-foundry-ai-agents-with-the-azure/ba-p/4538681?ref=azurebrasil.cloud) - [How to test agent experience changes without shipping them](https://devblogs.microsoft.com/blog/how-to-test-agent-experience-changes-without-shipping-them/?ref=azurebrasil.cloud) - [Feeding the GPUs: File Storage for AI and Cloud-Native Workloads on Azure](https://techcommunity.microsoft.com/t5/itops-talk-blog/feeding-the-gpus-file-storage-for-ai-and-cloud-native-workloads/ba-p/4534572?ref=azurebrasil.cloud) - [Hybrid Logic Apps Deployment on Red Hat OpenShift](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/hybrid-logic-apps-deployment-on-red-hat-openshift/ba-p/4534828?ref=azurebrasil.cloud) - [T-SQL Hygiene: Introducing the Covering Index](https://devblogs.microsoft.com/azure-sql/tsql-covering-index/?ref=azurebrasil.cloud) - [Introducing Azure Front Door edge actions - Bringing secure, programmable logic to the edge](https://techcommunity.microsoft.com/t5/azure-networking-blog/introducing-azure-front-door-edge-actions-bringing-secure/ba-p/4531928?ref=azurebrasil.cloud) - [AI agents, meet the Azure Cosmos DB vNext emulator](https://devblogs.microsoft.com/cosmosdb/use-ai-agents-with-cosmosdb-vnext-emulator/?ref=azurebrasil.cloud) - [Join us for our MCP Live! — A free livestream covering all things MCP](https://techcommunity.microsoft.com/t5/microsoft-developer-community/join-us-for-our-mcp-live-a-free-livestream-covering-all-things/ba-p/4537980?ref=azurebrasil.cloud) - [Premium SSD v2 and Instant Access Snapshots: A Better, Faster, Cheaper Disk for Your Azure VMs](https://techcommunity.microsoft.com/t5/itops-talk-blog/premium-ssd-v2-and-instant-access-snapshots-a-better-faster/ba-p/4534571?ref=azurebrasil.cloud) ### GitHub Updates - [The case for a cooldown: Why Dependabot now waits before issuing version updates](https://github.blog/security/supply-chain-security/the-case-for-a-cooldown-why-dependabot-now-waits-before-issuing-version-updates/?ref=azurebrasil.cloud) - [Copilot vs. raw API access: What are you actually paying for?](https://github.blog/ai-and-ml/github-copilot/copilot-vs-raw-api-access-what-are-you-actually-paying-for/?ref=azurebrasil.cloud) - [Next chapter: Restructuring GitHub’s bug bounty program](https://github.blog/security/next-chapter-restructuring-githubs-bug-bounty-program/?ref=azurebrasil.cloud) - [How to build interactive experiences with canvases](https://github.blog/ai-and-ml/github-copilot/how-to-build-interactive-experiences-with-canvases/?ref=azurebrasil.cloud) - [$100 million for open source: A milestone built by the community](https://github.blog/open-source/maintainers/100-million-for-open-source-a-milestone-built-by-the-community/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Como usar modelos do Microsoft Foundry Managed Compute no GitHub Copilot - parte 2](https://www.azurebrasil.cloud/blog/como-usar-modelos-do-microsoft-foundry-managed-compute-no-github-copilot-parte-2/) - [Azure Newsletter - 2026-07-20](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-07-20/) ### Como usar modelos do Microsoft Foundry Managed Compute no GitHub Copilot - parte 2 URL: https://www.azurebrasil.cloud/blog/como-usar-modelos-do-microsoft-foundry-managed-compute-no-github-copilot-parte-2/ Last updated: 2026-07-24T12:28:03.000Z O Microsoft Foundry Managed Compute permite hospedar modelos open weight em GPUs dedicadas sem precisar gerenciar máquinas virtuais, clusters Kubernetes, containers ou runtimes de inferência. Na [primeira parte desta série](https://www.azurebrasil.cloud/blog/como-usar-modelos-do-microsoft-foundry-managed-compute-no-github-copilot-parte-1/), mostrei como realizar o deployment do modelo Qwen3.6-27B-FP8 utilizando uma GPU NVIDIA H100 e integrá-lo ao GitHub Copilot no Visual Studio Code por meio do recurso Bring Your Own Key — BYOK. Nesta segunda parte, utilizamos o mesmo modelo e a mesma infraestrutura do Microsoft Foundry Managed Compute, mas agora realizamos a integração diretamente com o GitHub Copilot CLI. O conteúdo apresenta todo o processo, incluindo: - Instalação e configuração do GitHub Copilot CLI; - Reutilização do deployment existente no Microsoft Foundry Managed Compute; - Configuração do endpoint OpenAI-compatible; - Configuração do modelo por meio de variáveis de ambiente; - Autenticação utilizando a chave do endpoint; - Habilitação de streaming e tool calling; - Execução do modelo hospedado no Foundry diretamente pelo terminal; - Utilização do agente do GitHub Copilot CLI para analisar, criar e modificar código. Na demonstração, configuramos as variáveis `COPILOT_PROVIDER_BASE_URL`, `COPILOT_PROVIDER_API_KEY`, `COPILOT_PROVIDER_TYPE` e `COPILOT_MODEL` para direcionar as requisições do GitHub Copilot CLI ao modelo Qwen3.6-27B-FP8 hospedado no Microsoft Foundry. Depois da configuração, o Copilot CLI passa a utilizar o endpoint privado como provedor de inferência, mantendo recursos como execução de ferramentas, leitura de arquivos, análise do projeto, criação de código e automação de tarefas diretamente pelo terminal. Essa integração oferece uma alternativa interessante para equipes que desejam utilizar modelos abertos, controlar o endpoint e a infraestrutura de inferência e, ao mesmo tempo, manter a experiência de desenvolvimento agentic oferecida pelo GitHub Copilot CLI. Confira o tutorial completo, os comandos e todas as etapas da configuração: [https://tallesvaliatti.com/como-usar-modelos-do-microsoft-foundry-managed-compute-no-github-copilot-cli-parte-2-7b8a25556b2b](https://tallesvaliatti.com/como-usar-modelos-do-microsoft-foundry-managed-compute-no-github-copilot-cli-parte-2-7b8a25556b2b?ref=azurebrasil.cloud) ### Azure Newsletter - 2026-07-20 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-07-20/ Last updated: 2026-07-20T13:43:57.000Z ### Azure Updates - [How to test agent skills without hitting real APIs](https://devblogs.microsoft.com/blog/how-to-test-agent-skills-without-hitting-real-apis/?ref=azurebrasil.cloud) - [Azure Elastic SAN: Pooled, Cloud-Native Block Storage That Actually Acts Like a SAN](https://techcommunity.microsoft.com/t5/itops-talk-blog/azure-elastic-san-pooled-cloud-native-block-storage-that/ba-p/4534554?ref=azurebrasil.cloud) - [Azure Cobalt: Workload-Aware Power Management for More Efficient Datacenters](https://techcommunity.microsoft.com/t5/azure-infrastructure-blog/azure-cobalt-workload-aware-power-management-for-more-efficient/ba-p/4537049?ref=azurebrasil.cloud) - [Building Agents in Production with Toolbox, Skills, and Tool Search](https://techcommunity.microsoft.com/t5/microsoft-developer-community/building-agents-in-production-with-toolbox-skills-and-tool/ba-p/4537969?ref=azurebrasil.cloud) - [Meet the IQ's: How Microsoft is Creating Context-Aware AI](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/meet-the-iq-s-how-microsoft-is-creating-context-aware-ai/ba-p/4537516?ref=azurebrasil.cloud) - [T-SQL Hygiene: What’s the Big Deal with SET NOCOUNT ON?](https://devblogs.microsoft.com/azure-sql/tsql-nocount/?ref=azurebrasil.cloud) - [Announcing Public Preview of Autoscale for Azure Event Grid Namespaces](https://techcommunity.microsoft.com/t5/messaging-on-azure-blog/announcing-public-preview-of-autoscale-for-azure-event-grid/ba-p/4537851?ref=azurebrasil.cloud) - [Agents can learn with Memory in Microsoft Foundry Agent Service](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/agents-can-learn-with-memory-in-microsoft-foundry-agent-service/ba-p/4535431?ref=azurebrasil.cloud) - [How to build long-running MCP tools on Azure Functions](https://devblogs.microsoft.com/azure-sdk/long-running-mcp-tools-azure-functions/?ref=azurebrasil.cloud) - [MCP Enterprise Authorization Is Here — What Entra and App Service Can Do Today](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/mcp-enterprise-authorization-is-here-what-entra-and-app-service/ba-p/4537433?ref=azurebrasil.cloud) - [Visual Studio Administrator? Join our Private Marketplace Preview!](https://devblogs.microsoft.com/visualstudio/visual-studio-administrator-join-our-private-marketplace-preview/?ref=azurebrasil.cloud) - [Choose the right speech and voice model](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/choose-the-right-speech-and-voice-model/ba-p/4533856?ref=azurebrasil.cloud) - [Understanding billing for the Azure Copilot Observability Agent](https://techcommunity.microsoft.com/t5/azure-observability-blog/understanding-billing-for-the-azure-copilot-observability-agent/ba-p/4537780?ref=azurebrasil.cloud) - [When Compute Sits and Waits: Fixing the Hidden Storage Bottleneck in EDA and HPC with Azure NetApp Files](https://techcommunity.microsoft.com/t5/itops-talk-blog/when-compute-sits-and-waits-fixing-the-hidden-storage-bottleneck/ba-p/4534550?ref=azurebrasil.cloud) - [How Microsoft 365 built a platform engineering layer on AKS to ship faster at global scale](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/how-microsoft-365-built-a-platform-engineering-layer-on-aks-to/ba-p/4537523?ref=azurebrasil.cloud) - [Streaming and Batch Data Architectures with Microsoft Fabric to Azure Databricks](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/streaming-and-batch-data-architectures-with-microsoft-fabric-to/ba-p/4526166?ref=azurebrasil.cloud) - [Answers You Can Trust: Grounding Enterprise Agents with Foundry IQ](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/answers-you-can-trust-grounding-enterprise-agents-with-foundry/ba-p/4536594?ref=azurebrasil.cloud) - [From Policy to Proof: Governing AI to Scale Human Ambition and Machine Intelligence](https://techcommunity.microsoft.com/t5/azure-architecture-blog/from-policy-to-proof-governing-ai-to-scale-human-ambition-and/ba-p/4535137?ref=azurebrasil.cloud) - [Implementing Multi‑Agent Orchestration in Microsoft Copilot Studio](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/implementing-multi-agent-orchestration-in-microsoft-copilot/ba-p/4494717?ref=azurebrasil.cloud) - [MSSQL Extension for VS Code: Shortcuts Configuration, Enhanced Results Grid Experience, and More](https://devblogs.microsoft.com/azure-sql/vscode-mssql-july2026/?ref=azurebrasil.cloud) - [Give your AI agent two memories with Azure App Service](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/give-your-ai-agent-two-memories-with-azure-app-service/ba-p/4537400?ref=azurebrasil.cloud) - [Announcing the ASIM Parser Creation Agentic Experience](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/announcing-the-asim-parser-creation-agentic-experience/ba-p/4532266?ref=azurebrasil.cloud) - [What to Do When You Hit Capacity in Azure Databricks: Engage, Mitigate, Plan!](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/what-to-do-when-you-hit-capacity-in-azure-databricks-engage/ba-p/4526876?ref=azurebrasil.cloud) - [Public Preview: Advanced platform metrics in Azure Monitor](https://techcommunity.microsoft.com/t5/azure-observability-blog/public-preview-advanced-platform-metrics-in-azure-monitor/ba-p/4536983?ref=azurebrasil.cloud) - [Pick, manage, and get the most from your models](https://devblogs.microsoft.com/visualstudio/pick-manage-and-get-the-most-from-your-models/?ref=azurebrasil.cloud) - [Customer Offerings: Solution Optimization for GitHub Copilot](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/customer-offerings-solution-optimization-for-github-copilot/ba-p/4536886?ref=azurebrasil.cloud) - [Building AX evals that actually work](https://devblogs.microsoft.com/blog/building-ax-evals-that-actually-work/?ref=azurebrasil.cloud) - [Load testing Copilot Studio agents with Locust and Azure Load Testing](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/load-testing-copilot-studio-agents-with-locust-and-azure-load/ba-p/4535445?ref=azurebrasil.cloud) - [Beyond text: Returning images and interactive apps from MCP servers](https://techcommunity.microsoft.com/t5/microsoft-developer-community/beyond-text-returning-images-and-interactive-apps-from-mcp/ba-p/4535865?ref=azurebrasil.cloud) - [Modernize VDI with Azure Files and Entra Cloud-Native Identities](https://techcommunity.microsoft.com/t5/itops-talk-blog/modernize-vdi-with-azure-files-and-entra-cloud-native-identities/ba-p/4534545?ref=azurebrasil.cloud) - [Orchestrate Azure Container Apps Jobs with Apache Airflow](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/orchestrate-azure-container-apps-jobs-with-apache-airflow/ba-p/4534607?ref=azurebrasil.cloud) - [Introducing Azure Front Door edge actions - Bringing secure, programmable logic to the edge](https://techcommunity.microsoft.com/t5/azure-networking-blog/introducing-azure-front-door-edge-actions-bringing-secure/ba-p/4531928?ref=azurebrasil.cloud) - [Azure Front Door: Resiliency Series – Part 2: Faster recovery (RTO)](https://techcommunity.microsoft.com/t5/azure-networking-blog/azure-front-door-resiliency-series-part-2-faster-recovery-rto/ba-p/4503091?ref=azurebrasil.cloud) - [Azure landing zone (ALZ) enters its next chapter](https://techcommunity.microsoft.com/t5/azure-governance-and-management/azure-landing-zone-alz-enters-its-next-chapter/ba-p/4533520?ref=azurebrasil.cloud) - [Built-in Agent Skills Bring .NET and Azure Expertise into Visual Studio](https://devblogs.microsoft.com/visualstudio/built-in-agent-skills-in-visual-studio/?ref=azurebrasil.cloud) - [Hunting Local AI Tools on macOS with Microsoft Defender for Endpoint](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/hunting-local-ai-tools-on-macos-with-microsoft-defender-for/ba-p/4536965?ref=azurebrasil.cloud) - [Beyond the Canvas: The Azure Architecture Diagram Builder Becomes Agent-Ready](https://techcommunity.microsoft.com/t5/azure-architecture-blog/beyond-the-canvas-the-azure-architecture-diagram-builder-becomes/ba-p/4534590?ref=azurebrasil.cloud) - [From AI Adoption to AI Governance - Using APIM as the Gateway for Azure AI Foundry](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/from-ai-adoption-to-ai-governance-using-apim-as-the-gateway-for/ba-p/4536247?ref=azurebrasil.cloud) - [Building AI Agents from Zero to Production](https://techcommunity.microsoft.com/t5/microsoft-developer-community/building-ai-agents-from-zero-to-production/ba-p/4536529?ref=azurebrasil.cloud) - [Moving Petabytes Without the Panic: At-Scale Storage Assessments and Migrations to Azure](https://techcommunity.microsoft.com/t5/itops-talk-blog/moving-petabytes-without-the-panic-at-scale-storage-assessments/ba-p/4534543?ref=azurebrasil.cloud) - [From Multi-Model Chaos to a Governed AI Gateway: Cost Optimization on Azure](https://techcommunity.microsoft.com/t5/microsoft-developer-community/from-multi-model-chaos-to-a-governed-ai-gateway-cost/ba-p/4531729?ref=azurebrasil.cloud) - [The Visual Studio Dev/Test Benefit: Freedom to Build, Test, and Experiment in Azure](https://devblogs.microsoft.com/visualstudio/the-visual-studio-dev-test-benefit-freedom-to-build-test-and-experiment-in-azure/?ref=azurebrasil.cloud) - [Check This Out! (CTO!) Guide (July 2026)](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/check-this-out-cto-guide-july-2026/ba-p/4536608?ref=azurebrasil.cloud) - [Upcoming Changes to Azure Relay IP Addresses and DNS Support](https://techcommunity.microsoft.com/t5/messaging-on-azure-blog/upcoming-changes-to-azure-relay-ip-addresses-and-dns-support/ba-p/4463597?ref=azurebrasil.cloud) - [Building toward an Agentic SOC: A Portable, Autonomous Malware Investigation Agent](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/building-toward-an-agentic-soc-a-portable-autonomous-malware/ba-p/4526872?ref=azurebrasil.cloud) - [A message broker is only as reliable as the layer you stopped at](https://techcommunity.microsoft.com/t5/messaging-on-azure-blog/a-message-broker-is-only-as-reliable-as-the-layer-you-stopped-at/ba-p/4533259?ref=azurebrasil.cloud) - [Creating Autonomous Teams Agents Using OpenClaw, MCP, and Azure Container Apps](https://techcommunity.microsoft.com/t5/microsoft-developer-community/creating-autonomous-teams-agents-using-openclaw-mcp-and-azure/ba-p/4536296?ref=azurebrasil.cloud) - [Secure Native Access to Azure Kubernetes Service (AKS) Private Clusters with Azure Bastion](https://techcommunity.microsoft.com/t5/azure-network-security-blog/secure-native-access-to-azure-kubernetes-service-aks-private/ba-p/4535123?ref=azurebrasil.cloud) - [Build and Optimize a Data Lakehouse for Unified Data Intelligence](https://techcommunity.microsoft.com/t5/itops-talk-blog/build-and-optimize-a-data-lakehouse-for-unified-data/ba-p/4534535?ref=azurebrasil.cloud) - [Optimizing GitHub Copilot Cost in the Usage-Based Billing Era](https://techcommunity.microsoft.com/t5/microsoft-developer-community/optimizing-github-copilot-cost-in-the-usage-based-billing-era/ba-p/4534186?ref=azurebrasil.cloud) ### GitHub Updates - [The cost of saying yes has changed](https://github.blog/engineering/the-cost-of-saying-yes-has-changed/?ref=azurebrasil.cloud) - [GitHub for Beginners: Your roadmap to mastering the GitHub essentials](https://github.blog/developer-skills/github/github-for-beginners-your-roadmap-to-mastering-the-github-essentials/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Foundry Hosted Agents com .NET: Entenda Invocations vs Responses na Microsoft Foundry](https://www.azurebrasil.cloud/blog/foundry-hosted-agents-com-net-entenda-invocations-vs-responses-na-microsoft-foundry/) - [Build 2026: o App Service entrou de vez na era dos agentes (e eu não poderia estar mais feliz)](https://www.azurebrasil.cloud/blog/build-2026-o-app-service-entrou-de-vez-na-era-dos-agentes-e-eu-nao-poderia-estar-mais-feliz/) - [Por Que a Microsoft Apostou US$ 2,5 Bilhões em um Brasileiro pra Liderar sua Nova Frente de IA](https://www.azurebrasil.cloud/blog/por-que-a-microsoft-apostou-us-2-5-bilhoes-em-um-brasileiro-pra-liderar-sua-nova-frente-de-ia/) - [Como usar modelos do Microsoft Foundry Managed Compute no GitHub Copilot - parte 1](https://www.azurebrasil.cloud/blog/como-usar-modelos-do-microsoft-foundry-managed-compute-no-github-copilot-parte-1/) - [Azure Newsletter - 2026-07-13](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-07-13/) ### Foundry Hosted Agents com .NET: Entenda Invocations vs Responses na Microsoft Foundry URL: https://www.azurebrasil.cloud/blog/foundry-hosted-agents-com-net-entenda-invocations-vs-responses-na-microsoft-foundry/ Last updated: 2026-07-17T12:28:14.000Z Você já conseguiu fazer um agente de IA responder no terminal. Ótimo. Mas a pergunta que inevitavelmente aparece em seguida é: como transformar esse agente em um serviço que possa ser consumido por outras aplicações, com suporte a escala, observabilidade e um contrato padronizado de integração? É exatamente nesse ponto que entram os Hosted Agents da Microsoft Foundry. Em vez de criar toda a infraestrutura necessária para expor endpoints, gerenciar requisições e implementar padrões de comunicação do zero, a Microsoft oferece um modelo hospedado que define como um agente deve se comportar dentro da plataforma. Isso inclui contratos HTTP bem definidos, mecanismos de readiness, protocolos de comunicação e integração nativa com recursos avançados, como conversas multi-turn, streaming e ferramentas externas. Mas existe uma decisão importante logo no início: utilizar o protocolo **Invocations** ou adotar a **Responses API**? Embora ambos permitam publicar agentes hospedados, eles atendem necessidades diferentes. Um oferece liberdade total para controlar a experiência; o outro entrega um contrato padronizado, pronto para cenários modernos de agentes conversacionais. Neste primeiro artigo da série *Foundry Hosted Agents*, vamos explorar os fundamentos desse modelo utilizando .NET, C# e o Microsoft Agent Framework. Além da teoria, o conteúdo é acompanhado de três demonstrações práticas que mostram desde a estrutura mínima de um Hosted Agent até a publicação de agentes gerenciados diretamente pela Microsoft Foundry. Se você trabalha com IA no ecossistema Microsoft e quer entender como sair do protótipo para uma arquitetura pronta para integração, este é o ponto de partida. Assista ao vídeo abaixo e acompanhe o primeiro episódio da série. Acesse o repositório abaixo: [GitHub - carlosmachel/maf-video-27: MAF VIdeo 27MAF VIdeo 27\. Contribute to carlosmachel/maf-video-27 development by creating an account on GitHub.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-169268fd-6904-4c0c-9e31-2b8056b33103.svg)GitHubcarlosmachel![](https://opengraph.githubassets.com/b745cbe961cd2d1e3382dfe287e9ce3afb59865f67338f490ba5249088f5c380/carlosmachel/maf-video-27)](https://github.com/carlosmachel/maf-video-27?ref=azurebrasil.cloud) ### Build 2026: o App Service entrou de vez na era dos agentes (e eu não poderia estar mais feliz) URL: https://www.azurebrasil.cloud/blog/build-2026-o-app-service-entrou-de-vez-na-era-dos-agentes-e-eu-nao-poderia-estar-mais-feliz/ Last updated: 2026-07-16T12:24:09.000Z Olá pessoALL, quem me acompanha sabe: sou fã de carteirinha do **Azure App Service**. Tanto que há alguns meses escrevi um artigo inteiro explicando [por que o App Service continua sendo minha aposta #1 para .NET no Azure](https://www.azurebrasil.cloud/blog/por-que-o-app-service-continua-sendo-minha-aposta-1-para-net-no-azure/). Na época, alguns leitores me perguntaram: "Rafael, mas e IA? O App Service não vai ficar pra trás nessa onda de agentes?" Confesso que fiquei com essa pergunta na cabeça. E a resposta chegou no Build 2026. O time do App Service publicou o [rollup oficial de anúncios do Build 2026](https://azure.github.io/AppService/2026/06/08/AppService-Build2026.html?ref=azurebrasil.cloud), e eu passei os últimos dias fuçando cada link da documentação. Nesse artigo, trago minha síntese com a análise de quem usa esse serviço em produção, com clientes reais, desde a época em que ele ainda se chamava Azure Websites. O que vamos cobrir: 1. **Easy AI**: seu web app vira um MCP server sem mudar uma linha de código 2. **Isolated v4**: GA do hardware de nova geração no ASEv3 3. **Managed Instance**: o caminho pras aplicações legadas continua evoluindo 4. **Platform Release Channel**: controle sobre patches de runtime (finalmente!) 5. **Azure CLI para a era dos agentes**: erros de deploy que se explicam sozinhos 6. **Melhorias de plataforma**: deploys Python 30% mais rápidos, FastAPI sem configuração, e mais Vamos lá? ## Easy AI: o anúncio que me fez parar tudo Vou ser direto: esse é o anúncio mais importante do pacote. A Microsoft está introduzindo o **Easy AI**, um guarda-chuva de funcionalidades pra transformar web apps existentes em aplicações prontas pra agentes de IA. Tudo isso através de um novo blade **AI (preview)** no portal do Azure. E a primeira funcionalidade desse guarda-chuva é o [Built-in MCP no App Service](https://learn.microsoft.com/azure/app-service/configure-mcp-built-in?ref=azurebrasil.cloud). Antes de explicar por que fiquei tão animado, deixa eu contar uma história. Há alguns meses, um cliente aqui da AzureBrasil.cloud queria expor a API do sistema dele pra agentes de IA. A API já existia, rodava no App Service há anos, estável, documentada com OpenAPI. O caminho? Escrever um **MCP server** — Model Context Protocol, o protocolo que padroniza como agentes de IA descobrem e chamam ferramentas externas. Fizemos o de sempre: SDK do MCP, mapeamento manual de cada operação da API pra uma tool, tratamento de autenticação, deploy de um serviço novo, monitoramento de um serviço novo. Funciona? Funciona. Mas vamos ser honestos: era puro *plumbing*. Código que não entrega valor de negócio nenhum, só traduz um protocolo pro outro. **MAS (aqui entra um GRANDE MAS)** — com o Built-in MCP, todo esse trabalho simplesmente desaparece. Você fornece a especificação OpenAPI 3.x da sua API, e o App Service gera automaticamente as tools e um endpoint MCP pronto pra qualquer agente consumir. Sem SDK, sem serviço adicional e sem mexer no código da aplicação. Na prática, funciona assim: a plataforma lê o spec (por padrão em `/home/data/.ai/apispec.json`), transforma cada operação em uma MCP tool usando o `operationId` como nome, e serve o endpoint via streamable HTTP no path que você escolher. Se você usa ASP.NET Core com `Microsoft.AspNetCore.OpenApi` (padrão desde o .NET 9), ou FastAPI que já gera o spec em `/openapi.json`, você literalmente já tem tudo que precisa. Quer ver como fica a configuração via Bicep? Simples assim: ```bicep resource site 'Microsoft.Web/sites@2025-05-01' = { name: appName location: location properties: { serverFarmId: appServicePlanId aiIntegration: { Mcp: { Servers: [ { Name: 'orders' Endpoint: '/mcp/orders' } ] } } } } ``` Pronto! Seu endpoint MCP está no ar em `https://.azurewebsites.net/mcp/orders`, e qualquer cliente compatível (GitHub Copilot, Claude Desktop, Cursor) consegue descobrir e chamar suas tools. Vale ressaltar dois pontos importantes antes de você sair habilitando isso em produção: - **Autenticação não é opcional.** Depois que um cliente MCP conecta, toda operação exposta na `ToolList` é chamável. A recomendação é usar o **App Service Authentication** (Easy Auth), que aplica as mesmas verificações de identidade das outras rotas do app. Nunca exponha um MCP server público sem autenticação. - **Filtre o que você expõe.** A propriedade `ToolList` permite listar exatamente quais operações viram tools. Aquele endpoint `DELETE /admin/purge-database`? Mantenha fora da lista. O padrão é `["*"]` (tudo), então revise antes de habilitar. E tem um detalhe de engenharia que me agradou: quando você atualiza o spec, a plataforma detecta a mudança, recalcula a lista de tools e notifica os clientes conectados via `notifications/tools/list_changed`. Sem restart. Hot reload de verdade. O blade AI (preview) também traz uma aba **Agents**, que mostra métricas dos agentes hospedados no seu App Service (total de agentes, chamadas, tokens consumidos e taxa de erro), tudo extraído do Application Insights via OpenTelemetry com as convenções semânticas de Generative AI. Ou seja, você monitora o custo e o comportamento dos seus agentes com as ferramentas que já conhece. Dito isso, a preview tem limites: **1 MCP server por app**, apenas transporte streamable HTTP, e planos dedicados (Basic ou superior). Pra cenários com workflows multi-step ou tools sem endpoint HTTP correspondente, um MCP server customizado ainda é o caminho. ## Isolated v4: hardware de nova geração pra quem precisa de isolamento Agora que cobrimos a novidade de IA, vamos pro anúncio de infraestrutura. O **Isolated v4 (Iv4)** atingiu **General Availability** no App Service Environment v3 (ASEv3). Se você não trabalha com ASE, deixa eu contextualizar: o App Service Environment é a versão single-tenant do App Service. Infraestrutura dedicada, isolamento total, pra workloads com requisitos rígidos de compliance e residência de dados. Bancos, seguradoras, governo. Aquele tipo de cliente que pergunta "quem mais roda nesse servidor?" e precisa ouvir "ninguém". O Iv4 traz pro ASEv3 a mesma geração de hardware v4 que já alimenta o **Premium v4**, com desempenho bem acima do Isolated v2, sem abrir mão das garantias de isolamento. Você tem workload mission-critical num ASEv3 com Iv2 hoje? O upgrade é escalar pra um plano Iv4, sem rearquitetar nada. Porém, um aviso honesto que o próprio time da Microsoft fez questão de destacar: a demanda está alta e a capacidade pode ser limitada mesmo nas [regiões suportadas](https://aka.ms/AppService/Iv4regions?ref=azurebrasil.cloud). A disponibilidade começa num conjunto restrito de regiões e expande conforme demanda. Se você planeja migrar, verifique a região antes e, se encontrar problemas de capacidade, abra um ticket de suporte. Consulte também a [página de pricing](https://azure.microsoft.com/pricing/details/app-service/windows/?ref=azurebrasil.cloud): SKUs Isolated não são baratos, e o custo precisa estar na conta do projeto desde o início. E tem um detalhe estratégico escondido nesse anúncio: o Iv4 no ASEv3 é a fundação pro **Managed Instance em infraestrutura dedicada**. O que nos leva ao próximo tópico. ## Managed Instance: a ponte pras aplicações legadas ficou mais curta No meu artigo anterior sobre o App Service, eu disse que o **Managed Instance** tinha me surpreendido positivamente. Ele resolve aquele cenário que todo consultor conhece: a aplicação Windows legada que precisa de acesso ao registry, componentes COM, dependências instaladas no OS, e que por isso "precisava de uma VM". Quantas migrações você já viu travarem exatamente nesse ponto? Eu perdi a conta. No Build 2026, o Managed Instance (ainda em preview) ganhou melhorias que mostram maturidade a caminho do GA: - **Restarts em \~30 segundos** (antes, mudanças de configuração significavam esperas bem maiores) - **Sem restart** pra mudanças de registry e storage adapters - Tooling de diagnóstico integrado - Expansão pra novas regiões (Central e South India, com rollout mais amplo em andamento) Além disso, os [scripts PowerShell do App Service Migration Assistant](https://github.com/Azure/App-Service-Migration-Assistant/wiki/PowerShell-Scripts?ref=azurebrasil.cloud) agora suportam Managed Instance: com o switch `-UseManagedInstance`, a ferramenta gera automaticamente as configurações de migração (plano, adapters, scripts de instalação) e captura tudo num arquivo de settings. Menos setup manual pra workloads complexas. E pra quem gosta de ver o futuro chegando: a Microsoft publicou um piloto de [migração agêntica de IIS pro Managed Instance](https://techcommunity.microsoft.com/blog/AppsonAzureBlog/agentic-iis-migration-to-managed-instance-on-azure-app-service/4508969?ref=azurebrasil.cloud), usando um workflow multi-agente com MCP pra descoberta, assessment e deployment. É experimental, e o próprio time recomenda adaptar à sua realidade. Mas a direção é clara: agentes de IA participando ativamente das migrações. Lembra do Built-in MCP lá do começo? As peças se conectam. ## Platform Release Channel: o controle que faltava sobre patches Esse anúncio é menos glamouroso que IA, mas resolve uma dor real que eu já vivi na pele. Manter runtimes atualizados é uma das grandes promessas de uma plataforma gerenciada. Mas essa faca corta dos dois lados: o mesmo patch que corrige um CVE pode introduzir uma mudança de comportamento no framework ou quebrar uma premissa hardcoded em algum canto da sua aplicação. E até agora, a resposta era "confie no rollout". Pra quem não podia confiar, o plano B era migrar pra containers e assumir a gestão da imagem base. Trocando um problema por outro. Sim, aprendemos na marra. Já vi patch de runtime causar comportamento inesperado em produção numa segunda-feira de manhã, sem nenhum deploy recente pra culpar. Se você já passou por isso, sabe o desespero. O [Platform Release Channel](https://azure.github.io/AppService/2026/05/06/platform-release-channel.html?ref=azurebrasil.cloud) pro App Service on Linux resolve isso com uma configuração por app, com três canais: | Canal | Comportamento | Quando usar | | ------------ | ------------------------------------ | ----------------------------------------------------------- | | **Latest** | Recebe patches assim que disponíveis | Dev e teste, pra validação antecipada | | **Standard** | Cadência padrão de release (default) | Maioria dos apps de produção | | **Extended** | Fica um release atrás do Standard | Workloads sensíveis que precisam de mais tempo de validação | A estratégia que recomendo: aponte seus ambientes de dev/teste pro **Latest** e valide os patches antes que eles cheguem à produção no **Standard**. Você transforma o rollout da Microsoft no seu próprio pipeline de validação, de graça. Configurar é uma linha de CLI: ```bash az webapp update \ --resource-group meu-rg \ --name meu-app \ --platform-release-channel Extended ``` Mesmos runtimes gerenciados, mesmo patching automático, agora com controle sobre o ritmo. Era o que faltava. ## Azure CLI pra era dos agentes: erros que se explicam O anúncio traz um dado que me chamou atenção: agentes de IA estão usando o Azure CLI como porta de entrada principal pra gerenciar recursos no Azure. E a Microsoft está investindo pesado pra que tanto agentes quanto humanos "acertem de primeira". Duas melhorias já disponíveis merecem destaque: **Erros de deploy enriquecidos.** O novo switch `--enriched-errors true` no `az webapp deploy` (App Service on Linux) transforma aquelas falhas opacas de deployment em diagnósticos estruturados: código de erro, contexto do deployment, erro bruto, sugestões de correção e até um prompt pronto pra colar no GitHub Copilot. Quantas horas você já perdeu interpretando um erro genérico de deploy? Pois é. **`az webapp list-runtimes` repaginado.** A lista flat antiga virou uma tabela estruturada com OS, runtime, versão, status de lifecycle e datas de end-of-life, com filtros `--runtime` e `--support`. Perguntas como "quais dos meus runtimes estão chegando no EOL?" agora têm resposta em um comando. Além disso, o time queimou uma parte significativa do backlog do CLI nos últimos releases. Recomendo atualizar o CLI nos seus scripts e pipelines de CI pra pegar tudo isso. ## Melhorias de plataforma: os detalhes que somam Nenhum desses itens é manchete sozinho, mas juntos eles removem fricção real do dia a dia. E aqui os números são concretos: - **Pipeline de deploy Python \~30% mais rápido.** O time perfilou o remote build de ponta a ponta e reconstruiu as partes lentas: **Zstandard** substituiu gzip nos artefatos de build (compressão \~6x mais rápida, descompressão \~2.6x, o que também acelera cold starts), [uv](https://github.com/astral-sh/uv?ref=azurebrasil.cloud) substituiu o `pip` como instalador primário (com fallback automático), e uma cópia redundante de staging foi eliminada. O maior ganho é em apps de IA/ML com árvores de dependência gigantes. Detalhes no [post oficial](https://azure.github.io/AppService/2026/05/18/platform-improvements-for-python-ai-apps-on-azure-app-service.html?ref=azurebrasil.cloud). - **FastAPI sem startup command.** O App Service agora escaneia os entry-points comuns (`main.py`, `app.py`, `api.py`), detecta o import do FastAPI e inicia com o worker Gunicorn/Uvicorn correto automaticamente. Disponível pra Python 3.14+, com mais versões a caminho. - **[Deferred Kudu Recycle](https://azure.github.io/AppService/2026/05/07/kudu-deferred-recycle.html?ref=azurebrasil.cloud).** Atualizar um app setting não-crítico durante um deploy assíncrono não interrompe mais o deploy: o Kudu adia o recycle por até 40 minutos. Settings críticos de deployment (como `WEBSITE_RUN_FROM_PACKAGE`) continuam reciclando na hora, e você pode marcar seus próprios settings como críticos com `WEBSITE_DEPLOYMENT_CRITICAL_APPSETTINGS`. Quantos deploys quebrados por alguém mexendo em connection string na hora errada isso vai evitar? - **[Site Status](https://techcommunity.microsoft.com/blog/appsonazureblog/understand-what%E2%80%99s-happening-with-your-app-service-for-linux-website-using-site-s/4524676?ref=azurebrasil.cloud).** O portal agora mostra o estado de lifecycle da plataforma (Starting / Started / Stopping / Stopped / Updating / Blocked), o último erro conhecido e detalhes por instância, com ações de reparo direto no blade, como restart ou substituição da instância. - **[Aliases SSH pra Python](https://techcommunity.microsoft.com/blog/appsonazureblog/new-ssh-helper-aliases-for-python-apps-on-azure-app-service-for-linux/4520111?ref=azurebrasil.cloud).** Atalhos dentro do container pra ativar o virtual environment, navegar pros paths comuns e inspecionar o processo. Menos tempo lembrando caminhos, mais tempo debugando. ## Minha leitura: a aposta continua de pé Lá no começo, mencionei a pergunta que os leitores me fizeram: "o App Service não vai ficar pra trás na onda de agentes?" Depois desse Build, minha resposta é um sonoro não. E o que mais me agrada é o *como*: em vez de criar um produto novo e pedir pra você rearquitetar tudo, a Microsoft está trazendo a era dos agentes pra dentro da plataforma que você já usa. Seu web app de anos vira um MCP server com um spec OpenAPI. Sua aplicação legada Windows ganha um caminho de migração assistido por agentes. Seu CLI devolve erros que um agente (ou você) consegue agir em cima. Lição aprendida ao longo desses anos acompanhando o App Service: a plataforma que evolui sem quebrar o que já funciona é a plataforma que ganha no longo prazo. De Azure Websites a MCP servers nativos, a história se repete. E você? Já abriu o blade AI (preview) no seu App Service? Qual desses anúncios resolve uma dor real do seu dia a dia: o Built-in MCP, o Release Channel, ou os deploys Python mais rápidos? Deixe nos comentários, quero muito saber como vocês estão levando IA pras aplicações existentes. ## Links Úteis ### Anúncio principal - [App Service Build 2026 Updates](https://azure.github.io/AppService/2026/06/08/AppService-Build2026.html?ref=azurebrasil.cloud) — O rollup oficial com todos os anúncios ### Easy AI - [Configure App Service built-in MCP (Preview)](https://learn.microsoft.com/azure/app-service/configure-mcp-built-in?ref=azurebrasil.cloud) — Documentação completa do Built-in MCP - [Register and discover remote MCP servers in Azure API Center](https://learn.microsoft.com/azure/api-center/register-discover-mcp-server?ref=azurebrasil.cloud) — Governança de MCP servers ### Infraestrutura - [Isolated v4 docs](https://aka.ms/AppService/Iv4docs?ref=azurebrasil.cloud) — Documentação do Iv4 no ASEv3 - [Managed Instance on Azure App Service](https://learn.microsoft.com/azure/app-service/overview-managed-instance?ref=azurebrasil.cloud) — Visão geral do Managed Instance - [App Service Migration Assistant PowerShell Scripts](https://github.com/Azure/App-Service-Migration-Assistant/wiki/PowerShell-Scripts?ref=azurebrasil.cloud) — Scripts com suporte a `-UseManagedInstance` ### Plataforma e CLI - [Platform Release Channel](https://azure.github.io/AppService/2026/05/06/platform-release-channel.html?ref=azurebrasil.cloud) — Controle de patches de runtime - [Better Deployment Errors in az webapp deploy](https://azure.github.io/AppService/2026/06/01/azcli-enrichederrors.html?ref=azurebrasil.cloud) — Erros enriquecidos no CLI - [Platform Improvements for Python AI Apps](https://azure.github.io/AppService/2026/05/18/platform-improvements-for-python-ai-apps-on-azure-app-service.html?ref=azurebrasil.cloud) — Deploys Python 30% mais rápidos - [Simplifying FastAPI Deployments](https://azure.github.io/AppService/2026/05/14/fastapi-improvements.html?ref=azurebrasil.cloud) — FastAPI sem startup command - [Deferred Kudu Recycle](https://azure.github.io/AppService/2026/05/07/kudu-deferred-recycle.html?ref=azurebrasil.cloud) — Deploys resilientes a mudanças de config Espero que tenham curtido! \[\]s e até a próxima. ### Por Que a Microsoft Apostou US$ 2,5 Bilhões em um Brasileiro pra Liderar sua Nova Frente de IA URL: https://www.azurebrasil.cloud/blog/por-que-a-microsoft-apostou-us-2-5-bilhoes-em-um-brasileiro-pra-liderar-sua-nova-frente-de-ia/ Last updated: 2026-07-15T15:30:03.000Z > A Microsoft criou uma unidade global de US$ 2,5 bilhões pra resolver um problema específico: empresas compram IA, mas não sabem transformar isso em resultado. Quem vai comandar essa aposta é um brasileiro, **Rodrigo Kede Lima**. Isso diz bastante sobre onde a Microsoft acha que está o próximo gargalo da adoção de inteligência artificial. ## Entendendo o Cenário Toda empresa grande hoje já tem acesso a algum modelo de IA generativa. Copilot, ChatGPT corporativo, algum agente customizado. O que falta não é tecnologia. Falta gente que saiba pegar essa tecnologia e encaixar num fluxo de trabalho real, com resultado mensurável. É esse o gargalo que apareceu em praticamente todo relatório de adoção de IA dos últimos dois anos: comprar a ferramenta é fácil, operacionalizar é difícil. A Microsoft decidiu tratar isso como um problema estrutural, não como algo que se resolve com mais um treinamento ou um webinar. ## O Que É a Microsoft Frontier Company A Microsoft Frontier Company é a nova unidade de negócio da Microsoft criada especificamente para ajudar empresas a extrair valor real dos seus dados usando IA. O foco não é vender licença nem fazer consultoria técnica genérica. É automatizar fluxo de trabalho, criar aplicações de negócio e ajustar agentes generativos dentro da operação do cliente. A escala da aposta chama atenção: aporte de US$ 2,5 bilhões e uma estrutura de aproximadamente 6 mil profissionais, entre engenharia aplicada, pesquisa, segurança e arquitetura de dados. Pra efeito de comparação, isso é maior que o quadro técnico inteiro de boa parte das consultorias regionais que atuam no Brasil. O recorte de atuação prioriza três frentes: desenvolvimento de produto, atendimento ao cliente e eficiência de gestão. Não é acaso. São as três áreas onde a promessa de IA generativa mais prometeu e menos entregou resultado consistente nas empresas nos últimos anos. ## Rodrigo Kede Lima: a Liderança Brasileira Quem vai comandar essa divisão global é Rodrigo Kede Lima, executivo brasileiro que já foi presidente da IBM Brasil e América Latina e, nos últimos anos, liderou a Microsoft nas Américas e na Ásia. Um brasileiro à frente de uma aposta bilionária de IA da Microsoft não é um detalhe de rodapé. É sinal de que a empresa está tratando mercados emergentes, e não só Estados Unidos e Europa, como parte central da estratégia de adoção de IA aplicada. Faz sentido dentro do histórico de Kede. Passar por IBM e depois por Microsoft em duas regiões distintas dá a ele um raio de visão sobre como empresa de porte médio e grande lida com tecnologia fora do eixo americano, algo que consultoria genérica de Vale do Silício normalmente não capta. ## Como a Frontier Company Vai Atuar O modelo operacional é "in-house": as equipes de engenharia da Frontier trabalham diretamente dentro das empresas clientes, do planejamento estratégico até a implementação técnica, passando por acompanhamento de resultado e ajuste fino dos agentes generativos. Não é um projeto que entrega um relatório e vai embora. É presença contínua na operação. Pra escalar isso globalmente sem precisar contratar um exército próprio em cada país, a Microsoft trouxe parceiros estratégicos de peso: Accenture, Capgemini, EY, KPMG e PwC. Essas integradoras já têm relação estabelecida com grandes contas em todo o mundo, incluindo Brasil, e vão estender o alcance da Frontier Company pra além dos 6 mil profissionais próprios. Essa combinação de time interno enxuto e rede de parceiros globais é a mesma lógica que a Microsoft já usa em outras frentes de go-to-market. A diferença aqui é o tamanho do cheque e o grau de proximidade prometido com a operação do cliente. ## Hype ou Entrega Real? Um Ceticismo Saudável Toda vez que uma big tech anuncia uma unidade bilionária pra "acelerar adoção de IA", vale perguntar: isso é produto ou é holofote de marketing? A Microsoft já passou por ciclos parecidos com nuvem, com Power Platform, com Teams. Nem tudo virou entrega concreta no ritmo anunciado. O ponto de atenção real aqui é a métrica de sucesso. Automatizar um fluxo de atendimento ao cliente é fácil de anunciar e difícil de medir em impacto financeiro direto. Se a Frontier Company só vai produzir case study bonito sem indicador de ROI claro, o risco é virar mais uma camada de consultoria cara sem diferencial prático. Por outro lado, o desenho "in-house", com equipe própria dentro da operação do cliente, é diferente de um projeto tradicional de consultoria que entrega roadmap e desaparece. Se a Microsoft realmente sustentar presença contínua e ajuste fino dos agentes ao longo do tempo, isso resolve parte do problema que fez tanta iniciativa de IA travar na fase de piloto. ## O Que Isso Significa pra Pequenas Consultorias Accenture, Capgemini, EY, KPMG e PwC atendem o topo da pirâmide: contas grandes, contratos plurianuais, orçamento robusto. É exatamente o espaço que uma consultoria pequena ou um parceiro regional não disputa. Mas o efeito da Frontier Company não fica restrito a esse topo. O primeiro benefício é de metodologia. Quando uma unidade desse tamanho testa em escala como automatizar atendimento ao cliente ou ajustar agente generativo dentro de uma operação real, o aprendizado eventualmente vaza pro ecossistema todo, via documentação pública, treinamento de parceiro e conteúdo técnico da própria Microsoft. Consultoria pequena que acompanha de perto esse material sai na frente de quem só espera o cliente pedir. O segundo benefício é de posicionamento. Empresa de porte médio no Brasil não tem escala pra contratar Accenture ou PwC, mas também não quer mais resolver IA aplicada só com tentativa e erro interno. Isso abre espaço pra parceiro regional que sabe traduzir o que a Frontier Company está validando lá em cima pra realidade de operação menor, com orçamento e prazo compatíveis. O terceiro benefício é competitivo. Se o mercado inteiro está migrando de "comprar licença de IA" pra "implementar IA que gera resultado", toda consultoria que ainda vende só configuração básica de ferramenta vai perder espaço. A Frontier Company acelera esse movimento, e quem se adaptar primeiro no segmento de empresas menores tende a herdar a demanda que sobra do topo da pirâmide. ## O Que Esperar Daqui pra Frente Nos próximos meses, o indicador mais importante pra observar não é o valor do aporte, é a publicação de casos de uso com resultado mensurado: redução de tempo de atendimento, aumento de conversão, corte de custo operacional. Sem isso, o anúncio fica só no campo do investimento. Outro ponto a acompanhar é a chegada prática dessa estrutura ao Brasil. Com um brasileiro na liderança global e parceiros como Accenture, EY, KPMG e PwC já com operação robusta no país, a expectativa natural é que contas brasileiras de grande porte entrem cedo na fila de atendimento da Frontier Company. Pra empresas menores, que não vão ter acesso direto a uma unidade desse porte, o efeito indireto tende a vir por dois caminhos: parceiros locais absorvendo metodologia e ferramentas testadas pela Frontier, e pressão competitiva de concorrentes maiores que já estão automatizando fluxo de trabalho com IA aplicada. ## Fontes - [Microsoft Frontier Company | Resultados em IA em Escala Empresarial](https://www.microsoft.com/en-us/frontier-company?ref=azurebrasil.cloud) - [Microsoft Frontier Company: AI engineering that amplifies and protects your intelligence — The Official Microsoft Blog](https://blogs.microsoft.com/blog/2026/07/02/microsoft-frontier-company-ai-engineering-that-amplifies-and-protects-your-intelligence/?ref=azurebrasil.cloud) ### Como usar modelos do Microsoft Foundry Managed Compute no GitHub Copilot - parte 1 URL: https://www.azurebrasil.cloud/blog/como-usar-modelos-do-microsoft-foundry-managed-compute-no-github-copilot-parte-1/ Last updated: 2026-07-14T12:20:38.000Z O Microsoft Foundry Managed Compute permite hospedar modelos open weight em GPUs dedicadas sem precisar gerenciar máquinas virtuais, clusters Kubernetes, containers ou runtimes de inferência. Em meu novo artigo, mostro como realizar o deployment do modelo **Qwen3.6-27B-FP8** utilizando uma GPU NVIDIA H100 e integrá-lo ao GitHub Copilot no Visual Studio Code por meio do recurso **Bring Your Own Key — BYOK**. O conteúdo apresenta todo o processo, incluindo: - Configuração de quota no Microsoft Foundry; - Deployment do modelo com Managed Compute; - Configuração do endpoint OpenAI-compatible; - Integração do modelo ao GitHub Copilot no VS Code; - Habilitação de tool calling para o modo agente; - Geração de uma aplicação CRUD completa com .NET 10, ASP.NET Core MVC e Entity Framework Core. Na demonstração, o modelo hospedado no Foundry utiliza o agente do GitHub Copilot para criar modelos, controllers, Razor Views, validações, dados de exemplo e uma interface responsiva com Bootstrap 5. Essa integração oferece uma alternativa interessante para equipes que desejam utilizar modelos abertos, controlar o endpoint e a infraestrutura de inferência e, ao mesmo tempo, manter a experiência de desenvolvimento e automação oferecida pelo GitHub Copilot. Confira o tutorial completo, os códigos e todas as etapas da configuração: 👉 [**Leia o artigo completo aqui**](https://tallesvaliatti.com/como-usar-modelos-do-microsoft-foundry-managed-compute-no-github-copilot-parte-1-dc463bcac479?ref=azurebrasil.cloud) ### Azure Newsletter - 2026-07-13 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-07-13/ Last updated: 2026-07-13T12:57:59.000Z ### Azure Updates - [Secure Native Access to Azure Kubernetes Service (AKS) Private Clusters with Azure Bastion](https://techcommunity.microsoft.com/t5/azure-network-security-blog/secure-native-access-to-azure-kubernetes-service-aks-private/ba-p/4535123?ref=azurebrasil.cloud) - [Streaming and Batch Data Architectures with Microsoft Fabric to Azure Databricks](https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/streaming-and-batch-data-architectures-with-microsoft-fabric-to/ba-p/4526166?ref=azurebrasil.cloud) - [Azure Front Door: Resiliency Series – Part 3: Tenant isolation](https://techcommunity.microsoft.com/t5/azure-networking-blog/azure-front-door-resiliency-series-part-3-tenant-isolation/ba-p/4535866?ref=azurebrasil.cloud) - [Beyond the Canvas: The Azure Architecture Diagram Builder Becomes Agent-Ready](https://techcommunity.microsoft.com/t5/azure-architecture-blog/beyond-the-canvas-the-azure-architecture-diagram-builder-becomes/ba-p/4534590?ref=azurebrasil.cloud) - [Welcome Back to AZ Update](https://techcommunity.microsoft.com/t5/itops-talk-blog/welcome-back-to-az-update/ba-p/4535872?ref=azurebrasil.cloud) - [Shrinking Azure Pipeline task extensions using esbuild](https://devblogs.microsoft.com/devops/shrinking-azure-pipeline-task-extensions-using-esbuild/?ref=azurebrasil.cloud) - [When Arc Goes Silent: Turning Visibility Gaps into SOC Action](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/when-arc-goes-silent-turning-visibility-gaps-into-soc-action/ba-p/4535711?ref=azurebrasil.cloud) - [Stop Hand-Building VMs at 2 AM: Automated Image Pipelines with Azure Image Builder and Compute Gallery](https://techcommunity.microsoft.com/t5/itops-talk-blog/stop-hand-building-vms-at-2-am-automated-image-pipelines-with/ba-p/4534213?ref=azurebrasil.cloud) - [Securing message brokers takes more than turning off public access](https://techcommunity.microsoft.com/t5/messaging-on-azure-blog/securing-message-brokers-takes-more-than-turning-off-public/ba-p/4533257?ref=azurebrasil.cloud) - [Azure DDoS Protection & Azure WAF: A Layered Defense for Modern DDoS Attacks](https://techcommunity.microsoft.com/t5/azure-network-security-blog/azure-ddos-protection-azure-waf-a-layered-defense-for-modern/ba-p/4523745?ref=azurebrasil.cloud) - [Microsoft Foundry Model Deployment Pricing Update](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/microsoft-foundry-model-deployment-pricing-update/ba-p/4535385?ref=azurebrasil.cloud) - [Optimize Oracle workloads on Azure with Azure NetApp Files](https://techcommunity.microsoft.com/t5/azure-storage-blog/optimize-oracle-workloads-on-azure-with-azure-netapp-files/ba-p/4532644?ref=azurebrasil.cloud) - [Plan for Upcoming Changes to Extended Security Updates on Azure Local](https://techcommunity.microsoft.com/t5/azure-arc-blog/plan-for-upcoming-changes-to-extended-security-updates-on-azure/ba-p/4533167?ref=azurebrasil.cloud) - [Enhanced host pool management for Azure Virtual Desktop is now generally available](https://techcommunity.microsoft.com/t5/azure-virtual-desktop-blog/enhanced-host-pool-management-for-azure-virtual-desktop-is-now/ba-p/4534612?ref=azurebrasil.cloud) - [Frontier Tuning - A shift from classic fine-tuning](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/frontier-tuning-a-shift-from-classic-fine-tuning/ba-p/4526001?ref=azurebrasil.cloud) - [Designing for cloud sovereignty with Radius and Dapr](https://techcommunity.microsoft.com/t5/linux-and-open-source-blog/designing-for-cloud-sovereignty-with-radius-and-dapr/ba-p/4535067?ref=azurebrasil.cloud) - [Monitoring & Observability in Microsoft Foundry Part 2: Configuration and Operations](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/monitoring-observability-in-microsoft-foundry-part-2/ba-p/4532674?ref=azurebrasil.cloud) - [Announcing Flat File Schema Generation support in Azure Logic Apps Standard](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/announcing-flat-file-schema-generation-support-in-azure-logic/ba-p/4534695?ref=azurebrasil.cloud) - [Deployment Stacks: Treating Your Azure Deployments Like Real Resources](https://techcommunity.microsoft.com/t5/itops-talk-blog/deployment-stacks-treating-your-azure-deployments-like-real/ba-p/4534212?ref=azurebrasil.cloud) - [From Noisy Queries to Precise Frames: Query Decomposition for Media Asset Search](https://devblogs.microsoft.com/ise/from%5Fnoisy%5Fqueries%5Fto%5Fprecise%5Fframes/?ref=azurebrasil.cloud) - [A Paradigm Shift in Cloud Operations with Azure SRE Agent](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/a-paradigm-shift-in-cloud-operations-with-azure-sre-agent/ba-p/4533244?ref=azurebrasil.cloud) - [Foundry IQ is now in Copilot Studio: Bring your enterprise data to every agent conversation](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/foundry-iq-is-now-in-copilot-studio-bring-your-enterprise-data/ba-p/4534635?ref=azurebrasil.cloud) - [Before You Ship Your Agent: A Five-Step Path to Evaluations You Can Trust](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/before-you-ship-your-agent-a-five-step-path-to-evaluations-you/ba-p/4532311?ref=azurebrasil.cloud) - [Azure Monitor Observability Agent goes autonomous (preview)](https://techcommunity.microsoft.com/t5/azure-observability-blog/azure-monitor-observability-agent-goes-autonomous-preview/ba-p/4517265?ref=azurebrasil.cloud) - [Introducing ROI for agents in Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/introducing-roi-for-agents-in-foundry/ba-p/4531970?ref=azurebrasil.cloud) - [Building on Vercel’s eve + Azure Cosmos DB: An Agent That Remembers](https://devblogs.microsoft.com/cosmosdb/cosmos-db-agent-memory/?ref=azurebrasil.cloud) - [The hidden variables in your agent eval](https://devblogs.microsoft.com/blog/the-hidden-variables-in-your-agent-eval?ref=azurebrasil.cloud) - [Hybrid Logic Apps Deployment on Red Hat OpenShift](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/hybrid-logic-apps-deployment-on-red-hat-openshift/ba-p/4534828?ref=azurebrasil.cloud) - [Lock Down AKS End to End with Application Gateway for Containers and Managed Cilium L7](https://techcommunity.microsoft.com/t5/itops-talk-blog/lock-down-aks-end-to-end-with-application-gateway-for-containers/ba-p/4534205?ref=azurebrasil.cloud) - [Teamcenter on Oracle AI Database@Azure: Architecture, Validation, and Results](https://techcommunity.microsoft.com/t5/azure-high-performance-computing/teamcenter-on-oracle-ai-database-azure-architecture-validation/ba-p/4534252?ref=azurebrasil.cloud) - [Golden Paths Are a Product. Treat Them Like One.](https://techcommunity.microsoft.com/t5/azure-architecture-blog/golden-paths-are-a-product-treat-them-like-one/ba-p/4533707?ref=azurebrasil.cloud) - [Optimizing GitHub Copilot Cost in the Usage-Based Billing Era](https://techcommunity.microsoft.com/t5/azure-architecture-blog/optimizing-github-copilot-cost-in-the-usage-based-billing-era/ba-p/4534171?ref=azurebrasil.cloud) - [Announcing the Path to Production for Agents Webinar Series](https://techcommunity.microsoft.com/t5/azure-architecture-blog/announcing-the-path-to-production-for-agents-webinar-series/ba-p/4526560?ref=azurebrasil.cloud) - [Don’t rewrite your CLI for agents](https://devblogs.microsoft.com/blog/dont-rewrite-your-cli-for-agents?ref=azurebrasil.cloud) - [Azure Database Security Newsletter - July 2026](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/azure-database-security-newsletter-july-2026/ba-p/4534477?ref=azurebrasil.cloud) - [Export historical data from Log Analytics workspace with Export Job (preview)](https://techcommunity.microsoft.com/t5/azure-observability-blog/export-historical-data-from-log-analytics-workspace-with-export/ba-p/4532425?ref=azurebrasil.cloud) - [What’s New in Microsoft Foundry | June 2026](https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-june-2026/?ref=azurebrasil.cloud) - [Modern Ingress for AKS: Introducing Application Gateway for Containers (AGC)](https://techcommunity.microsoft.com/t5/itops-talk-blog/modern-ingress-for-aks-introducing-application-gateway-for/ba-p/4534200?ref=azurebrasil.cloud) - [Coding with Logic Apps Standard: Local Functions](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/coding-with-logic-apps-standard-local-functions/ba-p/4534240?ref=azurebrasil.cloud) - [Introducing Kimi K2.7 Code in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/introducing-kimi-k2-7-code-in-microsoft-foundry/ba-p/4532286?ref=azurebrasil.cloud) - [See our new Azure Cosmos DB Design Patterns](https://devblogs.microsoft.com/cosmosdb/see-our-new-azure-cosmos-db-design-patterns/?ref=azurebrasil.cloud) - [Logic Apps Aviators Newsletter - July 2026](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-july-2026/ba-p/4533851?ref=azurebrasil.cloud) - [Need a different partition key in Azure Cosmos DB? Pick the right approach](https://devblogs.microsoft.com/cosmosdb/need-a-different-partition-key-in-azure-cosmos-db-pick-the-right-approach/?ref=azurebrasil.cloud) - [Turning Azure Policy Signals into Actionable Governance Insights](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/turning-azure-policy-signals-into-actionable-governance-insights/ba-p/4534126?ref=azurebrasil.cloud) - [Not all model upgrades are upgrades](https://devblogs.microsoft.com/blog/not-all-model-upgrades-are-upgrades?ref=azurebrasil.cloud) - [Token Economics: The New FinOps for Agentic AI](https://techcommunity.microsoft.com/t5/microsoft-developer-community/token-economics-the-new-finops-for-agentic-ai/ba-p/4533743?ref=azurebrasil.cloud) - [Azure SDK Release (June 2026)](https://devblogs.microsoft.com/azure-sdk/azure-sdk-release-june-2026/?ref=azurebrasil.cloud) ### GitHub Updates - [Better tools made Copilot code review worse. Here’s how we actually improved it.](https://github.blog/ai-and-ml/github-copilot/better-tools-made-copilot-code-review-worse-heres-how-we-actually-improved-it/?ref=azurebrasil.cloud) - [How GitHub gave every repository a durable owner](https://github.blog/security/application-security/how-github-gave-every-repository-a-durable-owner/?ref=azurebrasil.cloud) - [Automating cross-repo documentation with GitHub Agentic Workflows](https://github.blog/ai-and-ml/github-copilot/automating-cross-repo-documentation-with-github-agentic-workflows/?ref=azurebrasil.cloud) - [GitHub availability report: June 2026](https://github.blog/news-insights/company-news/github-availability-report-june-2026/?ref=azurebrasil.cloud) - [How GitHub Copilot enables zero DNS configuration for GitHub Pages](https://github.blog/ai-and-ml/github-copilot/how-github-copilot-enables-zero-dns-configuration-for-github-pages/?ref=azurebrasil.cloud) - [Q1 2026 Innovation Graph update: Open source collaboration is accelerating worldwide](https://github.blog/news-insights/policy-news-and-insights/q1-2026-innovation-graph-update-open-source-collaboration-is-accelerating-worldwide/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [Azure Cache for Redis Está Sendo Aposentado: O Que Você Precisa Saber e Como Se Preparar](https://www.azurebrasil.cloud/blog/azure-cache-for-redis-esta-sendo-aposentado-o-que-voce-precisa-saber-e-como-se-preparar/) - [Loop Engineering no Microsoft Agent Framework: como fazer agentes persistirem até concluir a tarefa](https://www.azurebrasil.cloud/blog/loop-engineering-no-microsoft-agent-framework-como-fazer-agentes-persistirem-ate-concluir-a-tarefa/) - [Exchange Online: O que você já paga e não usa antes de novas licenças.](https://www.azurebrasil.cloud/blog/exchange-online-o-que-voce-ja-paga-e-nao-usa-antes-de-novas-licencas/) - [OAuth Identity Passthrough no Foundry Agent Service com MCP Server customizado em .NET - Parte 2](https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-2/) - [Azure Newsletter - 2026-07-06](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-07-06/) ### Azure Cache for Redis Está Sendo Aposentado: O Que Você Precisa Saber e Como Se Preparar URL: https://www.azurebrasil.cloud/blog/azure-cache-for-redis-esta-sendo-aposentado-o-que-voce-precisa-saber-e-como-se-preparar/ Last updated: 2026-07-10T11:43:13.000Z Recebi uma mensagem no Teams de um cliente que dizia: > "Acabei de receber uma notificação do Azure Service Health. O Azure Cache for Redis vai ser aposentado. O que isso significa pra gente?" Se você também recebeu essa notificação (ou está descobrindo agora), respire fundo. Você tem tempo para se preparar — mas **precisa começar a planejar agora**. A Microsoft anunciou oficialmente o retirement do Azure Cache for Redis em todas as suas versões: Basic, Standard, Premium, Enterprise e Enterprise Flash. O substituto? **Azure Managed Redis**, uma evolução construída sobre o Redis Enterprise com recursos mais robustos e uma experiência de primeira classe no Azure. ## O Cronograma Que Você Precisa Conhecer Vamos direto ao ponto. As datas variam dependendo do tier que você usa: ### Basic, Standard e Premium | Marco | Data | | -------------------------------------------- | ---------------------- | | Criação bloqueada para **novos** clientes | 1º de abril de 2026 | | Criação bloqueada para **todos** os clientes | 1º de outubro de 2026 | | **Retirement** (instâncias desabilitadas) | 30 de setembro de 2028 | ### Enterprise e Enterprise Flash | Marco | Data | | ------------------------------------------------ | ------------------------------- | | Criação bloqueada para **todos** os clientes | 1º de abril de 2026 | | **Migração automática** para Azure Managed Redis | A partir de 1º de abril de 2027 | > **Atenção**: Se você usa Enterprise ou Enterprise Flash, suas instâncias serão migradas automaticamente pela Microsoft a partir de abril de 2027\. Mesmo assim, recomendo fortemente que você faça a migração antes, no seu próprio ritmo. Até as datas de retirement, suas instâncias continuarão funcionando normalmente e receberão manutenção regular. ## Por Que Migrar para Azure Managed Redis? Não é apenas uma troca de nome. O Azure Managed Redis representa uma evolução significativa: ### 1\. Performance e Custo-Benefício O Azure Managed Redis é construído sobre o **Redis Enterprise**, oferecendo performance superior em todos os níveis quando comparado ao Azure Cache for Redis. Você obtém mais throughput e menor latência com recursos equivalentes. ### 2\. Recursos Enterprise em Todos os Tiers - **Active Geo-Replication**: diferente da geo-replicação passiva do Premium, aqui você tem replicação ativa entre regiões - **Redis Modules**: acesso a módulos como RediSearch, RedisJSON, RedisTimeSeries - **Até 99.999% de SLA** com geo-replicação habilitada ### 3\. Zone Redundancy por Padrão No Azure Managed Redis, a redundância de zona vem habilitada automaticamente quando você ativa High Availability em regiões com múltiplas zonas de disponibilidade. ### 4\. Opção Sem HA para Dev/Test Uma novidade bem-vinda: você pode criar instâncias **sem High Availability** para ambientes de desenvolvimento e teste. Isso **reduz o custo pela metade**, tornando muito mais econômico ter ambientes de homologação. ### 5\. Autenticação com Microsoft Entra ID Suporte nativo a Microsoft Entra ID (antigo Azure AD) para autenticação. Chega de gerenciar access keys manualmente — você pode usar identidades gerenciadas e RBAC. ### 6\. Experiência Azure Nativa Diferente do Enterprise atual (que usa componentes do Marketplace), o Azure Managed Redis é um serviço first-party. Provisionamento, gerenciamento e billing funcionam como qualquer outro serviço nativo do Azure. ## O Que Muda na Sua Aplicação Aqui está o que você precisa considerar ao migrar: ### Mudanças de Conexão | Aspecto | Azure Cache for Redis | Azure Managed Redis | | --------------- | ------------------------ | ------------------------ | | DNS Suffix | .redis.cache.windows.net | .redis.azure.net | | Porta TLS | 6380 | 10000 | | Porta não-TLS | 6379 | **Não suportada** | | Versão do Redis | 6.x | 7.4 | ### Clustering por Padrão O Azure Managed Redis usa **clustering por padrão**. A maioria das bibliotecas cliente (como StackExchange.Redis) funciona sem alterações, mas verifique a documentação da sua biblioteca para suporte a cluster. Para caches até 25GB, existe a opção de modo não-clusterizado, mas o clustering é recomendado para melhor performance e escalabilidade. ### Comandos Multi-Key Se sua aplicação usa comandos que operam em múltiplas chaves (como `MGET`, `MSET`, `RENAME`), elas precisam estar no mesmo slot de hash em modo cluster. Isso pode exigir ajustes no design das suas chaves. ## Estratégias de Migração A Microsoft está disponibilizando ferramentas para facilitar a transição. Escolha a estratégia que melhor se adapta ao seu cenário: ### 1\. Ferramenta de Migração via CLI (Recomendada) A Microsoft está lançando uma experiência de migração via linha de comando em fases: - **Fevereiro 2026**: Suporte para caches Basic (preview) - **Março 2026**: Suporte para tiers Enterprise **O grande benefício**: a ferramenta permite preservar o **mesmo hostname e access key** da instância original. Isso significa mudanças mínimas na sua aplicação. **Downtime esperado**: apenas alguns segundos durante a atualização do registro DNS — similar ao que ocorre durante manutenções regulares. ### 2\. Export/Import via Arquivo RDB Disponível para o tier Premium: 1. Exporte o RDB do seu cache atual para uma Storage Account 2. Crie uma nova instância Azure Managed Redis 3. Importe o arquivo RDB para a nova instância 4. Atualize a connection string da sua aplicação **Prós**: Preserva snapshot dos dados **Contras**: Dados escritos após o export serão perdidos ### 3\. Dual-Write Strategy Para aplicações que não podem ter perda de dados: 1. Modifique sua aplicação para escrever em **ambos** os caches 2. Continue lendo do cache antigo 3. Após período suficiente de sincronização, mude as leituras para o novo cache 4. Remova o cache antigo **Prós**: Zero downtime, transição segura **Contras**: Custo temporário de duas instâncias ### 4\. Migração com RIOT-X O **RIOT-X** (Redis Input/Output Tools) é uma ferramenta da Redis Inc. que oferece opções flexíveis de migração: #### Snapshot Migration (com downtime planejado) ```bash riotx replicate redis://source redis://target ``` #### Live Migration (sem downtime) ```bash riotx replicate --mode live redis://source redis://target ``` O modo live replica continuamente as alterações do cache de origem para o destino, permitindo migração com zero downtime. #### Importante sobre versões diferentes Como o Azure Cache for Redis usa versão 6.x e o Azure Managed Redis usa 7.4, adicione o argumento `--struct`: ```bash riotx replicate --struct redis://source redis://target ``` **Instalação do RIOT-X**: Windows (via Scoop): ```powershell scoop bucket add redis https://github.com/redis/scoop.git scoop install riotx ``` macOS: ```bash brew install redis/tap/riotx ``` ## Como Escolher o SKU Correto O Azure Managed Redis usa uma estrutura de SKUs baseada em três tiers de performance: - **Memory Optimized (M)**: Para workloads com uso intensivo de memória - **Balanced (B)**: Equilíbrio entre memória e compute — bom ponto de partida se você não tem certeza - **Compute Optimized (X)**: Para workloads com alto throughput ou baixa latência - **Flash Optimized (F)**: Para quem usa Enterprise Flash atualmente ### Mapeamento de SKUs Aqui está uma tabela de referência para migração do Basic/Standard/Premium: | SKU Atual | SKU Recomendado Azure Managed Redis | | -------------------- | ----------------------------------- | | Basic/Standard C0 | Balanced B0 | | Basic/Standard C1 | Balanced B1 | | Basic/Standard C2 | Balanced B3 | | Basic/Standard C3 | Balanced B5 | | Basic/Standard C4-C6 | Memory Optimized M10-M50 | | Premium P1 | Balanced B5 | | Premium P2-P3 | Balanced B10-B20 | | Premium P4-P5 | Balanced B50-B100 | > **Dica**: Verifique o pico de uso de memória do último mês no Azure Monitor antes de escolher. Se seu uso de memória é consistentemente baixo, você pode economizar escolhendo um tier menor. ### Para Enterprise/Enterprise Flash 1. Acesse o portal do Azure → seu cache Enterprise → **Overview** 2. Verifique o campo **Status** — ele mostra algo como "Running - Enterprise 8GB (2 x 4GB)" 3. Some a memória total e escolha um SKU do Azure Managed Redis com capacidade equivalente ou superior ## Passo a Passo: Criando Sua Primeira Instância Azure Managed Redis ### 1\. No Portal do Azure 1. Pesquise por "Azure Managed Redis" na barra de busca 2. Clique em **Create** 3. Selecione: - **Subscription** e **Resource Group** - **Cache name**: escolha um nome único - **Region**: preferencialmente a mesma do cache atual - **Performance tier**: Balanced, Memory Optimized ou Compute Optimized - **Cache size**: baseado no mapeamento acima ### 2\. Configurações de Rede Por padrão, o cache é criado com acesso público. Para ambientes de produção, considere: - **Private Endpoint**: para acesso exclusivo via VNet - **VNet Integration**: se sua aplicação já está em uma VNet ### 3\. Configurações Avançadas - **High Availability**: desabilite para dev/test (economia de 50%) - **Microsoft Entra ID**: habilite para autenticação moderna - **Clustering Policy**: OSS (padrão) ou Enterprise ### 4\. Atualize Sua Aplicação Após criar o cache, atualize sua connection string: ```csharp // Antes (Azure Cache for Redis) var connection = "myredis.redis.cache.windows.net:6380,password=xxx,ssl=True"; // Depois (Azure Managed Redis) var connection = "myredis.eastus.redis.azure.net:10000,password=xxx,ssl=True"; ``` Se estiver usando Microsoft Entra ID: ```csharp var configurationOptions = ConfigurationOptions.Parse("myredis.eastus.redis.azure.net:10000"); configurationOptions.Ssl = true; await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential()); ``` ## Features e Regiões: O Que Está Por Vir O Azure Managed Redis ainda está expandindo. Aqui estão os ETAs para features importantes: | Feature/Região | ETA | | --------------------------------- | -------------- | | Scheduling de maintenance windows | Fevereiro 2026 | | Keyspace notifications | Março 2026 | | SKUs maiores (até 500GB) | Maio 2026 | | US Gov Cloud | Julho 2026 | | China Cloud | Julho 2026 | | France Central | Disponível | | Qatar Central | Dezembro 2026 | Se você precisa de uma feature ou região que ainda não está disponível, entre em contato com o suporte ou envie email para [AzureManagedRedis@microsoft.com](mailto:AzureManagedRedis@microsoft.com). ## E as Reservations? Se você tem reserved capacity para Azure Cache for Redis, pode **cancelar ou trocar** suas reservations existentes conforme documentação do Microsoft Cost Management. Não fique preso a reservations de um serviço que será aposentado. ## Lições e Recomendações 1. **Não espere até o último momento.** As datas de retirement parecem distantes (2028 para Basic/Standard/Premium), mas migrações de infraestrutura sempre levam mais tempo que o esperado. 2. **Use a ferramenta de migração da Microsoft quando disponível.** A preservação de hostname e access key minimiza mudanças na aplicação. 3. **Comece testando em dev/test.** O modo sem HA é perfeito para isso — custa metade e permite validar sua aplicação com o novo serviço. 4. **Valide a compatibilidade do seu client.** Se você usa clustering, verifique se sua biblioteca cliente suporta o modo cluster do Azure Managed Redis. 5. **Considere Microsoft Entra ID.** Se você ainda usa access keys, esta é uma boa oportunidade para modernizar a autenticação. 6. **Revise comandos multi-key.** Em modo cluster, chaves em comandos multi-key precisam estar no mesmo slot. Pode ser necessário usar hash tags. 7. **Planeje a migração de dados.** Se seu cache contém dados que não podem ser perdidos (sessões de longa duração, por exemplo), use dual-write ou RIOT-X em modo live. --- ## Referências ### Anúncio e Timeline - [Azure Cache for Redis Retirement: What to Know and How to Prepare](https://techcommunity.microsoft.com/blog/azure-managed-redis/azure-cache-for-redis-retirement-what-to-know-and-how-to-prepare/4458721?ref=azurebrasil.cloud) — Anúncio oficial da Microsoft com todas as datas ### Migração - [Migration Overview & Guidance](https://learn.microsoft.com/azure/redis/migrate/migrate-overview?ref=azurebrasil.cloud) — Guia completo de migração com comparação de features - [Data Migration with RIOT-X for Azure Managed Redis](https://techcommunity.microsoft.com/blog/azure-managed-redis/data-migration-with-riot-x-for-azure-managed-redis/4404672?ref=azurebrasil.cloud) — Tutorial detalhado do RIOT-X ### Azure Managed Redis - [What is Azure Managed Redis?](https://learn.microsoft.com/azure/redis/overview?ref=azurebrasil.cloud) — Visão geral do serviço - [Choosing the Right Tier](https://learn.microsoft.com/azure/redis/overview?ref=azurebrasil.cloud#choosing-the-right-tier) — Como escolher entre Memory Optimized, Balanced e Compute Optimized - [Azure Managed Redis Architecture](https://learn.microsoft.com/azure/redis/architecture?ref=azurebrasil.cloud) — Detalhes de arquitetura do serviço ### Quickstarts - [Quickstart: Create an Azure Managed Redis Instance](https://learn.microsoft.com/azure/redis/quickstart-create-managed-redis?ref=azurebrasil.cloud) — Passo a passo para criar sua primeira instância --- *Você já começou a planejar sua migração? Compartilhe nos comentários quais desafios está enfrentando ou se tem dúvidas específicas sobre o processo.* ### Loop Engineering no Microsoft Agent Framework: como fazer agentes persistirem até concluir a tarefa URL: https://www.azurebrasil.cloud/blog/loop-engineering-no-microsoft-agent-framework-como-fazer-agentes-persistirem-ate-concluir-a-tarefa/ Last updated: 2026-07-09T14:46:33.000Z Nos últimos dias, muita gente começou a falar sobre *Loop Engineering* para descrever uma mudança na forma de construir agentes de IA. Em vez de focar apenas em escrever prompts melhores, a ideia é projetar sistemas que façam o agente persistir até que o objetivo seja realmente alcançado. Enquanto acompanhava essa discussão, percebi que a equipe do Microsoft Agent Framewok implementou esse padrão na biblioteca por meio do `LoopAgent`. O interessante não é apenas repetir a execução do agente. O verdadeiro desafio é definir quando ele deve parar. Afinal, existe uma diferença entre o agente dizer que terminou e realmente ter concluído a tarefa. No vídeo abaixo, mostro como o `LoopAgent` funciona na prática e apresento quatro estratégias diferentes para controlar esse ciclo de execução, desde marcadores de conclusão até validação por outro modelo de IA e aprovação automática para ações sensíveis. Se você está desenvolvendo agentes com o Microsoft Agent Framework, acredito que esses padrões podem simplificar bastante a implementação e tornar seus agentes mais confiáveis. Assista ao vídeo abaixo e veja todos os exemplos funcionando na prática. [GitHub - carlosmachel/maf-video-26: MAF Video 26MAF Video 26\. Contribute to carlosmachel/maf-video-26 development by creating an account on GitHub.![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/icon/favicon-9287f4c8-a539-428f-bcb1-721970230ad5.svg)GitHubcarlosmachel![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/thumbnail/maf-video-26-3ef6b59d-2542-43f7-a6de-bf61e883a56e)](https://github.com/carlosmachel/maf-video-26?ref=azurebrasil.cloud) ### Exchange Online: O que você já paga e não usa antes de novas licenças. URL: https://www.azurebrasil.cloud/blog/exchange-online-o-que-voce-ja-paga-e-nao-usa-antes-de-novas-licencas/ Last updated: 2026-07-08T11:55:48.000Z O chamado chega sempre igual. "A caixa do financeiro encheu", ou "preciso de mais um e-mail para o atendimento". O reflexo de muito time de suporte é abrir a cotação de um plano maior, mas na maioria dos casos o recurso que resolveria já está incluído na licença que o cliente paga hoje. O problema não é falta de produto, é falta de mapa. Este guia mostra o que cada tipo de caixa do Exchange Online resolve, o que precisa de licença, e como habilitar arquivo morto e expansão automática sem erro de N1, aproveitando três recursos subutilizados: caixa compartilhada sem licença, arquivo morto e auto-expand do arquivo. ## Os Tipos de Caixa no Exchange Online Antes de decidir qualquer licença, o analista precisa saber que "caixa de correio" não é uma coisa só. O Exchange Online tem tipos diferentes, e cada um carrega uma regra de licenciamento própria. | Tipo | Para que serve | Precisa de licença? | | ---------------------------- | ------------------------------------------------------------- | ---------------------- | | Caixa de usuário (User) | Caixa individual de uma pessoa | Sim | | Caixa compartilhada (Shared) | Endereço usado por várias pessoas (atendimento@, financeiro@) | Não, até 50 GB | | Sala (Room) | Reserva de sala de reunião | Não | | Equipamento (Equipment) | Reserva de recurso (projetor, veículo) | Não | | Grupo do Microsoft 365 | Caixa de colaboração de uma equipe | Não, acompanha o grupo | O ponto que interessa: metade dessa tabela não consome licença paga. ## Caixa Compartilhada: 50 GB Sem Licença A [caixa compartilhada](https://learn.microsoft.com/pt-br/microsoft-365/admin/email/about-shared-mailboxes?ref=azurebrasil.cloud) é o recurso mais subestimado do Exchange. Ela é um endereço que várias pessoas acessam ao mesmo tempo, com permissão de "Enviar como" ou "Enviar em nome de", sem ninguém precisar de senha compartilhada. Serve para atendimento@, financeiro@, contato@, recepção. E armazena até 50 GB de dados sem nenhuma licença atribuída. Na prática, o atendimento@ da empresa não precisa de uma licença de e-mail dedicada. Você cria a caixa, dá permissão para os três ou quatro agentes que já têm a própria licença, e pronto. Custo adicional zero. Só tem um detalhe que costuma virar chamado. Quando a caixa compartilhada chega ao limite de armazenamento, ela continua recebendo e-mail por um tempo, mas para de enviar. O usuário não vê um aviso claro, então quase ninguém liga o problema à quota cheia de primeira. Exchange Admin Center > Recipients > Mailboxes > "Add a shared mailbox" ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/data-src-image-194479b1-ddb6-43c4-b735-f807b89d022f.png) ## Licença por Tipo: Quem Paga e Quem Não Paga A regra da compartilhada não é "nunca precisa de licença". É "não precisa até certo ponto". Três gatilhos transformam uma caixa gratuita em caixa que exige licença: - Passar de 50 GB de armazenamento. - Habilitar o arquivo morto na caixa. - Colocar a caixa em [Litigation Hold](https://learn.microsoft.com/pt-br/exchange/policy-and-compliance/holds/litigation-holds?ref=azurebrasil.cloud). Em qualquer um dos três casos, a compartilhada passa a exigir uma licença Exchange Online Plan 2 (ou Plan 1 com o add-on de arquivamento). Salas e equipamentos seguem sempre sem licença. Caixas de usuário sempre exigem. | Licença | Caixa primária | Arquivo morto | | ------------------------------------- | -------------- | -------------------------- | | Frontline (F1/F3) | 2 GB | sem arquivo dedicado | | Business Basic / Standard / Premium | 50 GB | 50 GB fixo | | Exchange Online Plan 1 | 50 GB | 50 GB fixo | | Exchange Online Plan 2 / M365 E3 / E5 | 100 GB | 100 GB, expande até 1,5 TB | A leitura de economia é direta: se metade dos endereços de um cliente são de função e não de pessoa, boa parte deles pode virar caixa compartilhada gratuita em vez de mais uma licença E3. ## Arquivo Morto: Ganhe Espaço Antes de Trocar de Plano O [arquivo morto (archive mailbox)](https://learn.microsoft.com/pt-br/purview/enable-archive-mailboxes?ref=azurebrasil.cloud) é uma segunda caixa que fica ao lado da principal, aparece no Outlook como "Arquivo Morto" ou "Online Archive", e serve para tirar e-mail antigo de dentro da quota principal. Quando um usuário no Plan 1 chega perto dos 50 GB, habilitar o arquivo sai mais barato e mais rápido do que subir o plano. Habilitar é simples. No portal: 1. Abra o Exchange Admin Center. 2. Vá em Recipients > Mailboxes e selecione o usuário. 3. Na aba Others, clique em Manage mailbox archive e ative. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/data-src-image-1ccfd3ec-a818-4b85-8a7c-77ec4cbeb253.png) Ou via PowerShell, para uma caixa: ```powershell Enable-Mailbox -Identity "usuario@empresa.com.br" -Archive ``` Habilitar o arquivo não move nada sozinho. Quem transfere o e-mail antigo para o arquivo é uma política de retenção (MRM). A política padrão do Exchange move para o arquivo os itens com mais de dois anos. Se o cliente quer a caixa principal esvaziando mais rápido, alguém ajusta a política. Sem isso, o arquivo fica lá, vazio, e a caixa principal continua estourando. Teremos um artigo ensinando a criar essa política personalizada. ## Auto-Expanding Archive: Até 1,5 TB, Com Um Detalhe de Tempo Para caixas com Plan 2, E3 ou E5, o arquivo não trava nos 100 GB. Com a [expansão automática do arquivo (auto-expanding archiving)](https://learn.microsoft.com/pt-br/purview/autoexpanding-archiving?ref=azurebrasil.cloud) ligada, o armazenamento cresce sozinho, de forma incremental, até chegar a 1,5 TB. O administrador não pede espaço, não gerencia shard, não faz nada. A Microsoft provisiona conforme enche. O gatilho é objetivo. Quando o arquivo (somado à pasta de Itens Recuperáveis) chega a 90 GB, ele é convertido em arquivo de expansão automática. A partir daí, cresce até o teto. Ligar é só por PowerShell. Não dá para fazer pelo Exchange Admin Center nem pelo portal do Purview. Para a organização inteira: ```powershell Set-OrganizationConfig -AutoExpandingArchive ``` Para um usuário específico (a caixa precisa já ter o arquivo habilitado antes): ```powershell Enable-Mailbox -Identity "usuario@empresa.com.br" -AutoExpandingArchive ``` Dois avisos importantíssimos . Primeiro: depois de ligado, o auto-expand não pode ser desligado. É via de mão única. Segundo, e esse pega muita gente: o provisionamento do espaço extra pode levar até 30 dias. Ou seja, auto-expand não é solução de emergência. Se a caixa vai encher semana que vem, ligar hoje não salva o usuário a tempo. Isso se planeja com antecedência, não no dia do incêndio. ## Erros que Já Vi Os quatro que mais reabrem chamado: - Tratar arquivo morto como backup. Não é. Arquivo é gestão de espaço e retenção, não recuperação de desastre. Apagou do arquivo e o prazo de retenção passou, foi. - Ligar auto-expand achando que resolve a caixa que enche amanhã. Os até 30 dias de provisionamento derrubam esse plano. - Habilitar o arquivo e esquecer a política de retenção. Arquivo vazio, caixa principal cheia, chamado reaberto. - Deixar a compartilhada crescer sem monitorar. Passou de 50 GB, parou de enviar, e ninguém entende o motivo. ## Quando NÃO Usar Esses Atalhos Nem todo caso fecha com "usa o que já vem". Alguns cenários pedem licença de verdade: - Uma pessoa que deveria ter a própria caixa não deve trabalhar de dentro de uma compartilhada. Vira problema de segurança e de auditoria. Compartilhada é para função, não para pessoa. - Arquivo morto não substitui backup de terceiro quando o cliente tem exigência de recuperação ponto a ponto. Archive é retenção, backup é recuperação. - Auto-expand em caixa que pode virar [Inactive Mailbox](https://learn.microsoft.com/en-us/purview/inactive-mailboxes-in-office-365?ref=azurebrasil.cloud) carrega uma restrição importante: depois de ligado o auto-expand, você não consegue mais recuperar nem restaurar uma caixa inativa. Para ex-funcionário com hold, isso muda a estratégia. - Usuário que gera volume real e constante: mais vale colocar no Plan 2 e esquecer o storage do que remendar toda semana. ## Checklist e Próximo Passo Antes de cotar upgrade para um cliente sem espaço, rode este check: - O endereço é de função (atendimento@) ou de pessoa? Função pode virar compartilhada sem licença. - A compartilhada está perto de 50 GB? Se sim, arquivo ou Plan 2. - A caixa de usuário no Plan 1 está enchendo? Habilita arquivo antes de subir plano. - O arquivo já tem política de retenção movendo e-mail antigo? Sem isso, ele não esvazia nada. - Precisa de mais de 100 GB de arquivo? Plan 2/E3/E5 com auto-expand, ligado com antecedência. Mapear tipo de caixa e licença antes de comprar é a revisão que a AzureBrasil.cloud faz em tenant de cliente para cortar custo sem perder capacidade. Muita empresa paga E3 para todo mundo quando metade dos endereços poderia ser caixa compartilhada gratuita. ## Fontes Oficiais Microsoft Learn - [Sobre caixas de correio compartilhadas no Microsoft 365](https://learn.microsoft.com/pt-br/microsoft-365/admin/email/about-shared-mailboxes?ref=azurebrasil.cloud) - [Habilitar caixas de correio de arquivo morto](https://learn.microsoft.com/pt-br/purview/enable-archive-mailboxes?ref=azurebrasil.cloud) - [Saiba mais sobre o arquivamento com expansão automática](https://learn.microsoft.com/pt-br/purview/autoexpanding-archiving?ref=azurebrasil.cloud) - [Habilitar o arquivamento com expansão automática](https://learn.microsoft.com/pt-br/purview/enable-autoexpanding-archiving?ref=azurebrasil.cloud) ### OAuth Identity Passthrough no Foundry Agent Service com MCP Server customizado em .NET - Parte 2 URL: https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-2/ Last updated: 2026-07-07T11:59:17.000Z O [OAuth Identity Passthrough](https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/mcp-authentication?view=foundry&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) permite que o Foundry Agent Service chame um MCP Server em nome do usuário logado, preservando a identidade e os scopes que aquela pessoa consentiu. Na [Parte 1](https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-1/) percorremos todo esse fluxo pelo portal e pelo Agent Playground, criando os dois App Registrations, expondo a API, publicando o MCP Server no Azure App Service e consentindo como usuário para executar chamadas reais ao MCP pelo chat do agente. Nesta Parte 2 saímos do Playground e construímos uma .NET Web App de verdade, com um backend em ASP.NET Core conversando com o Foundry e um frontend em HTML, CSS e JavaScript exibindo um chatbot. A ideia é que a própria aplicação envie as mensagens ao agente, detecte quando o Foundry pede consentimento OAuth e conduza o usuário por esse consentimento sem depender do portal. Antes de escrever qualquer linha de código, vale recuperar rapidamente o que já existe desde a [Parte 1](https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-1/). O MCP Server customizado já está publicado no Azure App Service, o App Registration server é o custom-mcp-cars, o App Registration client é o custom-mcp-cars-client e a API expõe os três scopes Cars.Read, Cars.Write e Cars.Delete. O Foundry Agent já foi configurado com um Custom MCP usando OAuth Identity Passthrough, e o teste dentro do portal foi feito lá, então aqui esse teste não será repetido. O foco agora é o consumo programático desse mesmo fluxo. O primeiro passo prático da Parte 2 é remover a connection antiga que criamos no Foundry durante a Parte 1\. O motivo é começar esta parte com uma connection limpa, garantindo que o consentimento seja pedido de novo a partir da aplicação e que o comportamento observado seja fiel a um cenário recém configurado, sem estado de consentimento herdado do Playground. Para deletar uma connection de projeto no Foundry precisamos de cinco informações, que são o subscriptionId, o resourceGroupName, o accountName, o projectName e o connectionName. O accountName corresponde ao recurso do Foundry, o projectName ao projeto dentro dele e o connectionName ao nome que demos à connection MCP na Parte 1. Com esses dados em mãos, a remoção é feita chamando a Project Connections [Delete REST API](https://learn.microsoft.com/en-us/rest/api/aifoundry/accountmanagement/project-connections/delete?view=rest-aifoundry-accountmanagement-2025-06-01&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) diretamente pela Azure CLI. O comando a seguir dispara um DELETE no endpoint de management do Azure Resource Manager, apontando exatamente para a connection do projeto. Com a connection antiga removida, recriamos a Custom MCP connection no Foundry Project, agora do zero. A configuração é a mesma que descrevemos na Parte 1 ao conectar uma [MCP tool remota a um agente](https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/tools/model-context-protocol?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), apontando para o endpoint público do MCP Server publicado, algo como **https://.azurewebsites.net/mcp**, e escolhendo OAuth Identity Passthrough como método de autenticação. O Client ID e o Client Secret continuam sendo os do **custom-mcp-cars-client**, a Auth URL fica em **https://login.microsoftonline.com//oauth2/v2.0/authorize** e a Token URL junto com a Refresh URL apontam ambas para **https://login.microsoftonline.com//oauth2/v2.0/token**, que são os endpoints padrão do [Authorization Code Flow do Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). Os scopes voltam a ser configurados no formato completo com o Application ID URI, ficando **api:///Cars.Read, api:///Cars.Write, api:///Cars.Delete** e, por último, o **offline\_access,** que é o scope OIDC [responsável por habilitar o refresh token](https://learn.microsoft.com/en-us/entra/identity-platform/scopes-oidc?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). Continua valendo o cuidado de separar os scopes por espaço, e não por vírgula. Ao salvar essa nova connection, o Foundry gera um novo Redirect URI próprio, normalmente no formato **https://global.consent.azure-apim.net/redirect/**, e esse valor precisa ser copiado, porque ele muda em relação ao da Parte 1. Como o Redirect URI é novo, precisamos registrá-lo no App Registration client. Abrimos o **custom-mcp-cars-client**, vamos até Authentication e adicionamos essa URL como Redirect URI da plataforma Web, seguindo o procedimento oficial de adição de [redirect URI](https://learn.microsoft.com/en-us/entra/identity-platform/how-to-add-redirect-uri?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). Vale reforçar o ponto que mais gera confusão nesse cenário, que é o fato de o Redirect URI ser cadastrado sempre no **custom-mcp-cars-client**, o client, e nunca no **custom-mcp-cars**, o server. Aproveitamos também para conferir que as permissões delegadas **Cars.Read, Cars.Write e Cars.Delete** continuam presentes no client, já que é por meio delas que o usuário poderá consentir no momento da primeira chamada. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/1.1.png) Ainda no portal do Foundry, há um ajuste importante na configuração da MCP tool do agente antes de partir para a aplicação. Ao abrir a configuração da tool MCP, marcamos a opção Always auto-approve all tools, para que o Foundry possa usar as tools do MCP sem exigir uma aprovação manual adicional a cada chamada. Sem esse ajuste, a web app pode receber erros quando o agente tenta usar uma tool que não foi previamente habilitada, então deixar o **auto-approve** ativo evita esse tipo de tropeço durante os testes. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/2-1.png) Resolvida a parte de portal, entramos na construção da aplicação em si, que é o coração desta Parte 2\. Adicionamos à solution um novo projeto Web App chamado Chat.WebApp, que passa a ser a interface final do usuário. O backend em ASP.NET Core conversa com o Foundry usando o SDK do [Azure AI Projects](https://learn.microsoft.com/en-us/dotnet/api/overview/azure/ai.projects-readme?view=azure-dotnet&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), enquanto o frontend em HTML, CSS e JavaScript exibe o chatbot e trata a experiência de consentimento. A partir daqui o usuário não usa mais o Agent Playground, e toda a conversa acontece dentro da nossa aplicação. O projeto referencia quatro pacotes principais, visíveis no arquivo de projeto. ```xml ``` O Azure.AI.Projects traz o AIProjectClient e o acesso aos recursos do projeto Foundry, o Azure.AI.Extensions.OpenAI junto com o pacote OpenAI dão suporte ao Responses API que usamos para conversar com o agente, e o Azure.Identity fornece o DefaultAzureCredential que autentica a aplicação no Foundry. A composição da aplicação vive no Program.cs, e é nele que registramos o AIProjectClient e amarramos a autenticação da aplicação ao Foundry. ```csharp var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); builder.Services.Configure( builder.Configuration.GetSection("Foundry")); builder.Services.AddSingleton(sp => { var configuration = sp.GetRequiredService(); var projectEndpoint = configuration["Foundry:ProjectEndpoint"]; if (string.IsNullOrWhiteSpace(projectEndpoint)) throw new InvalidOperationException("Missing configuration: Foundry:ProjectEndpoint"); return new AIProjectClient( endpoint: new Uri(projectEndpoint), tokenProvider: new DefaultAzureCredential()); }); builder.Services.AddScoped(); var app = builder.Build(); ``` - **AddControllersWithViews()** habilita os controllers MVC e as Views Razor, servindo tanto a API interna do chat quanto a página que renderiza o chatbot. **Configure()** vincula a seção Foundry da configuração à classe de opções tipada FoundryOptions, seguindo o [options pattern do ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-10.0&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). - [AddSingleton()](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-10.0&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) registra o [AIProjectClient](https://learn.microsoft.com/en-us/dotnet/api/azure.ai.projects.aiprojectclient?view=azure-dotnet&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) como singleton, construído a partir do endpoint do projeto e autenticado com o DefaultAzureCredential. - **AddScoped()** registra o serviço de aplicação que concentra toda a conversa com o Foundry, injetado depois no controller. Aqui está o ponto conceitual mais importante de toda a Parte 2, então vale insistir nele. O backend usa o **DefaultAzureCredential** para autenticar a própria aplicação no plano de dados do Foundry. Em desenvolvimento local, essa credencial resolve automaticamente a identidade do desenvolvedor logado na Azure CLI ou no [Visual Studio Code](https://learn.microsoft.com/en-us/dotnet/azure/sdk/authentication/local-development-dev-accounts?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), e em produção o mesmo código passaria a usar uma Managed Identity sem alteração. Essa identidade da aplicação é o que dá acesso ao projeto Foundry para criar conversas e respostas, e ela é diferente da identidade delegada do usuário que trafega até o MCP Server via OAuth Identity Passthrough. Em outras palavras, o DefaultAzureCredential autentica o app no Foundry, enquanto o consentimento OAuth que veremos adiante autoriza o Foundry a chamar o MCP em nome do usuário. A configuração consumida por esse código fica na seção Foundry do appsettings.json e aponta para o endpoint do projeto e para o nome do agente que já existe no Foundry. ```json { "Foundry": { "ProjectEndpoint": "https://.services.ai.azure.com/api/projects/", "AgentName": "my-agent" } } ``` Essa seção é materializada em uma classe de opções simples, com as duas propriedades obrigatórias que o serviço precisa para funcionar. ```csharp public sealed class FoundryOptions { public required string ProjectEndpoint { get; init; } public required string AgentName { get; init; } } ``` **FoundryOptions** representa a configuração tipada do Foundry, expondo o ProjectEndpoint usado para construir o AIProjectClient e o AgentName usado para direcionar as respostas ao agente correto. Antes de olhar o serviço, precisamos entender o contrato de dados que ele troca com o frontend, definido em um único arquivo de records. Esses tipos descrevem o pedido de criação de conversa, o envio de mensagem, a continuação após o consentimento e a resposta unificada que o frontend interpreta. ```csharp public sealed record CreateConversationResponse(string ConversationId); public sealed record SendMessageRequest(string Message); public sealed record ContinueAfterConsentRequest(string Message, string PreviousResponseId); public static class ChatStatus { public const string Completed = "completed"; public const string OAuthConsentRequired = "oauth_consent_required"; } public sealed record SendMessageResponse( string ConversationId, string ResponseId, string Status, string? OutputText = null, string? ConsentLink = null, string? ConsentServerLabel = null); ``` - **CreateConversationResponse** devolve ao frontend o ConversationId recém criado, que passa a identificar toda a conversa. - **SendMessageRequest** e **ContinueAfterConsentRequest** carregam a mensagem do usuário, sendo que o segundo ainda transporta o PreviousResponseId necessário para retomar a chamada MCP depois do consentimento. - **ChatStatus** define as duas situações possíveis de uma resposta, Completed quando o agente já respondeu e OAuthConsentRequired quando o Foundry pede consentimento antes de continuar. - **SendMessageResponse** é a resposta unificada, que ora traz o OutputText final, ora traz o ConsentLink e o ConsentServerLabel usados para montar o card de consentimento na tela. Com o contrato definido, chegamos ao FoundryChatService, que é onde a aplicação realmente fala com o Foundry usando o [Responses API](https://learn.microsoft.com/en-us/azure/foundry/agents/quickstarts/responses-api?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). O serviço recebe o AIProjectClient e as [FoundryOptions por injeção de dependência](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-10.0&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) e guarda ambos para uso nas operações seguintes. ```csharp public sealed class FoundryChatService { private readonly AIProjectClient _projectClient; private readonly FoundryOptions _options; public FoundryChatService( AIProjectClient projectClient, IOptions options) { _projectClient = projectClient; _options = options.Value; } ``` A primeira responsabilidade do serviço é criar uma conversa no projeto, que funciona como o contêiner de estado onde as mensagens e respostas vão sendo acumuladas. ```csharp public async Task CreateConversationAsync() { var conversationsClient = _projectClient.ProjectOpenAIClient.GetProjectConversationsClient(); ProjectConversation conversation = await conversationsClient.CreateProjectConversationAsync( new ProjectConversationCreationOptions()); return new CreateConversationResponse(ConversationId: conversation.Id); } ``` **CreateConversationAsync()** obtém o client de conversas do projeto, cria uma nova ProjectConversation e devolve o identificador dela para o frontend, que passará a usar esse ConversationId em todas as mensagens seguintes. O envio de uma mensagem comum acontece no método a seguir, que direciona a solicitação ao agente configurado e trata a resposta de forma uniforme. ```csharp public async Task SendMessageAsync( string conversationId, SendMessageRequest request) { if (string.IsNullOrWhiteSpace(conversationId)) throw new ArgumentException("Conversation id is required.", nameof(conversationId)); if (string.IsNullOrWhiteSpace(request.Message)) throw new ArgumentException("Message is required.", nameof(request)); ProjectResponsesClient responsesClient = _projectClient.ProjectOpenAIClient .GetProjectResponsesClientForAgent(_options.AgentName); CreateResponseOptions responseOptions = new() { AgentConversationId = conversationId }; responseOptions.InputItems.Add( ResponseItem.CreateUserMessageItem(request.Message)); ResponseResult response = await responsesClient.CreateResponseAsync(responseOptions); return BuildResponse(conversationId, response); } ``` **SendMessageAsync()** valida a entrada, obtém um ProjectResponsesClient vinculado ao agente pelo AgentName, monta um CreateResponseOptions apontando para a conversa atual, adiciona a mensagem do usuário como input item e chama o [Responses API](https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/responses?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), delegando a interpretação do resultado ao **BuildResponse**. O ponto que torna esse fluxo especial é o que acontece quando o agente precisa usar a MCP tool pela primeira vez. Nesse instante o Foundry não devolve a resposta final, e sim um item de consentimento, sinalizando que o usuário ainda não autorizou o custom-mcp-cars-client a acessar o MCP em seu nome. O método ContinueAfterConsentAsync existe justamente para retomar a conversa depois que esse consentimento foi concedido. ```csharp public async Task ContinueAfterConsentAsync( string conversationId, ContinueAfterConsentRequest request) { if (string.IsNullOrWhiteSpace(conversationId)) throw new ArgumentException("Conversation id is required.", nameof(conversationId)); if (string.IsNullOrWhiteSpace(request.Message)) throw new ArgumentException("Message is required.", nameof(request)); if (string.IsNullOrWhiteSpace(request.PreviousResponseId)) throw new ArgumentException("Previous response id is required.", nameof(request)); ProjectResponsesClient responsesClient = _projectClient.ProjectOpenAIClient .GetProjectResponsesClientForAgent(_options.AgentName); CreateResponseOptions responseOptions = new() { PreviousResponseId = request.PreviousResponseId, ToolChoice = ResponseToolChoice.CreateRequiredChoice() }; responseOptions.InputItems.Add( ResponseItem.CreateUserMessageItem(request.Message)); ResponseResult response = await responsesClient.CreateResponseAsync(responseOptions); return BuildResponse(conversationId, response); } ``` **ContinueAfterConsentAsync()** retoma o fluxo após o consentimento usando o PreviousResponseId da resposta que pediu consentimento e forçando o uso da tool com ResponseToolChoice.CreateRequiredChoice(), de modo que o Foundry volte a executar a chamada MCP agora com a identidade do usuário já consentida, encadeando a nova resposta a partir da anterior. A leitura da resposta do Foundry fica isolada em um único método privado, que decide se o retorno é um pedido de consentimento ou a resposta final do agente. ```csharp private static SendMessageResponse BuildResponse( string conversationId, ResponseResult response) { foreach (ResponseItem item in response.OutputItems) { if (item.AsAgentResponseItem() is OAuthConsentRequestResponseItem consentRequest) { return new SendMessageResponse( ConversationId: conversationId, ResponseId: response.Id, Status: ChatStatus.OAuthConsentRequired, ConsentLink: consentRequest.ConsentLink?.ToString(), ConsentServerLabel: consentRequest.ServerLabel); } } return new SendMessageResponse( ConversationId: conversationId, ResponseId: response.Id, Status: ChatStatus.Completed, OutputText: response.GetOutputText()?.Trim()); ``` **BuildResponse()** percorre os output items da resposta e, ao encontrar um OAuthConsentRequestResponseItem, devolve o status OAuthConsentRequired junto com o ConsentLink e o ServerLabel, e quando nenhum item de consentimento aparece, devolve o status Completed com o texto final produzido pelo agente. É esse ResponseId retornado que o frontend guarda para conseguir chamar a continuação depois do consentimento. Vale registrar um detalhe do arquivo do serviço, que traz a diretiva **#pragma warning disable OPENAI001** no topo. Isso acontece porque parte dos tipos do **Responses API** ainda está marcada como experimental no SDK, e a diretiva apenas silencia esse aviso de recurso em avaliação, sem alterar o comportamento em runtime. O serviço é exposto ao frontend por um controller de API enxuto, com três endpoints que espelham exatamente os três métodos que acabamos de ver. ```csharp [ApiController] [Route("api/chat")] public sealed class ChatApiController : ControllerBase { private readonly FoundryChatService _chatService; public ChatApiController(FoundryChatService chatService) { _chatService = chatService; } [HttpPost("conversations")] public async Task CreateConversation() { CreateConversationResponse response = await _chatService.CreateConversationAsync(); return Created( $"/api/chat/conversations/{response.ConversationId}", response); } [HttpPost("conversations/{conversationId}/responses")] public async Task> SendMessage( [FromRoute] string conversationId, [FromBody] SendMessageRequest request) { SendMessageResponse response = await _chatService.SendMessageAsync(conversationId, request); return Ok(response); } [HttpPost("conversations/{conversationId}/responses/continue")] public async Task> ContinueAfterConsent( [FromRoute] string conversationId, [FromBody] ContinueAfterConsentRequest request) { SendMessageResponse response = await _chatService.ContinueAfterConsentAsync(conversationId, request); return Ok(response); } } ``` - **CreateConversation()** cria uma nova conversa e responde 201 com o ConversationId no corpo e no header de localização. - **SendMessage()** recebe o texto do usuário para uma conversa existente e devolve a resposta do agente, que pode ser o texto final ou o pedido de consentimento. - **ContinueAfterConsent()** recebe a mensagem original junto com o PreviousResponseId e retoma a chamada MCP depois que o usuário consentiu, devolvendo então o resultado real da tool. Do lado do navegador, a página do chat concentra a lógica de conversa em JavaScript, e o trecho mais relevante é o que envia a mensagem e decide o que fazer com a resposta. Quando o usuário manda um texto, o script faz um POST para o endpoint de responses e entrega o resultado para uma função que interpreta o status. ```javascript const res = await fetch(`/api/chat/conversations/${encodeURIComponent(conversationId)}/responses`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: text }) }); removeTyping(typingId); if (!res.ok) throw new Error(`Server error: ${res.status}`); const data = await res.json(); handleChatResponse(data, text); ``` Essa chamada envia a mensagem digitada para a conversa atual e passa a resposta recebida, junto com o texto original, para a função **handleChatResponse**, que precisa saber o texto para conseguir reenviá-lo caso o consentimento seja necessário. ```javascript function handleChatResponse(data, originalMessage) { if (data && data.status === 'oauth_consent_required') { appendConsentCard(data, originalMessage); } else { appendMessage('assistant', (data && data.outputText) || ''); } scrollToBottom(); } ``` **openConsentAndContinue()** abre o ConsentLink em um popup, troca os botões do card por um estado de espera com a opção de continuar manualmente e, ao detectar que o popup foi fechado, chama automaticamente a continuação da conversa. O botão **I've finished, continue** existe como caminho alternativo para os casos em que o popup é bloqueado pelo navegador. O fechamento do ciclo acontece na continuação, que chama o endpoint de continue enviando a mensagem original e o PreviousResponseId, exatamente os dados que o backend precisa para retomar a chamada MCP com a identidade já consentida. ```javascript async function continueAfterConsent(previousResponseId, message, wrapper) { if (wrapper.dataset.continuing === '1') return; wrapper.dataset.continuing = '1'; wrapper.remove(); hideError(); const typingId = appendTyping(); try { const res = await fetch(`/api/chat/conversations/${encodeURIComponent(conversationId)}/responses/continue`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message, previousResponseId }) }); removeTyping(typingId); if (!res.ok) throw new Error(`Server error: ${res.status}`); const data = await res.json(); handleChatResponse(data, message); } catch (e) { removeTyping(typingId); showError('Failed to continue after consent: ' + e.message); } finally { scrollToBottom(); } } ``` **continueAfterConsent()** evita continuações duplicadas com uma trava simples, remove o card de consentimento da tela, chama o endpoint de continue com a mensagem original e o previousResponseId e reaproveita o \`handleChatResponse\` para renderizar o resultado, que agora deve ser a resposta real vinda do MCP Server. Com backend e frontend prontos, é hora de testar tudo rodando localmente. ```bash dotnet run ``` O desenvolvedor sobe a web app na própria máquina, garantindo antes que está logado na Azure CLI para que o **DefaultAzureCredential** resolva a identidade corretamente, e abre o chat no navegador. Na caixa de mensagem, envia algo simples que dependa do MCP, como listar todos os carros, digitando liste todos os carros. Como a **connection** foi recriada e o consentimento ainda não foi concedido nesta aplicação, o Foundry devolve um **OAuthConsentRequestResponseItem**, e a web app exibe o item de consentimento na conversa em vez da resposta final. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/23-1.png) O usuário então clica em **Open consent**, e o navegador abre a tela de consentimento do Microsoft Entra ID, onde ele autoriza o client usado pelo Foundry a acessar o MCP Server em seu nome. A experiência de consentimento passa pelas telas de permissões solicitadas e pela confirmação final exigida pelo Foundry, momento em que o Microsoft Entra ID devolve o authorization code que o Foundry troca por access token e refresh token. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/34.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/45.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/56.png) Concluído o consentimento, o usuário volta para a aplicação. Se o popup foi fechado, a continuação dispara sozinha, e se preferir, o usuário pode clicar em I've finished, continue para retomar manualmente. Nesse ponto a web app chama o endpoint de continue, passando o PreviousResponseId, e o Foundry finalmente executa a tool **cars\_list** em nome do usuário. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/78.png) A resposta então retorna à conversa, e a lista de carros aparece dentro do próprio chat da aplicação, mostrando que o fluxo delegado funcionou de ponta a ponta fora do Playground. A partir dessa primeira autorização, o usuário não precisa consentir de novo, e as próximas mensagens que dependem do MCP são atendidas diretamente. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/9-1.png) Chegamos assim ao fim da Parte 2, na qual removemos a connection antiga do Foundry pela Project Connections Delete REST API, recriamos a Custom MCP connection com OAuth Identity Passthrough, atualizamos o Redirect URI no custom-mcp-cars-client, habilitamos o auto-approve das tools no agente e construímos a Chat.WebApp com backend em ASP.NET Core e frontend em HTML, CSS e JavaScript. A grande diferença em relação à Parte 1 é que o fluxo agora acontece dentro de uma aplicação real, com o Foundry Playground deixando de ser o ponto de teste e a nossa web app assumindo o controle da experiência do usuário. O chatbot consegue detectar o pedido de consentimento, conduzir o usuário pelo fluxo OAuth e continuar a conversa, enquanto o MCP Server segue sendo chamado em nome do usuário via OAuth Identity Passthrough, com cada tool rodando sob os scopes reais que aquela pessoa consentiu. Você já pode baixar o projeto por esse [link](https://github.com/TallesValiatti/McpOAuthIdentityPassthrough?ref=azurebrasil.cloud), e não esquece de me seguir no [LinkedIn](https://www.linkedin.com/in/tallesvaliatti/?ref=azurebrasil.cloud)! Até a próxima, abraços! ### Azure Newsletter - 2026-07-06 URL: https://www.azurebrasil.cloud/blog/azure-newsletter-2026-07-06/ Last updated: 2026-07-06T13:01:55.000Z ### Azure Updates - [Windows 365 Boot](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/windows-365-boot/ba-p/4533696?ref=azurebrasil.cloud) - [Azure landing zone (ALZ) enters its next chapter](https://techcommunity.microsoft.com/t5/azure-governance-and-management/azure-landing-zone-alz-enters-its-next-chapter/ba-p/4533520?ref=azurebrasil.cloud) - [Enabling MLflow OpenAI Autolog on PySpark Workers](https://devblogs.microsoft.com/ise/mlflow-autolog-pyspark-workers/?ref=azurebrasil.cloud) - [On the road to .NET 10 Support: Logic Apps Migration from In-Proc to Out-of-Proc hosting model](https://techcommunity.microsoft.com/t5/azure-integration-services-blog/on-the-road-to-net-10-support-logic-apps-migration-from-in-proc/ba-p/4522386?ref=azurebrasil.cloud) - [Microsoft Defender for Cloud Customer Newsletter](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/microsoft-defender-for-cloud-customer-newsletter/ba-p/4533200?ref=azurebrasil.cloud) - [Foundry Control Plane and Agent 365: Two Control Planes Walk Into an Enterprise](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/foundry-control-plane-and-agent-365-two-control-planes-walk-into/ba-p/4520185?ref=azurebrasil.cloud) - [Fundamentals of Azure DevOps with SQL projects](https://devblogs.microsoft.com/azure-sql/fundamentals-of-azure-devops-with-sql-projects/?ref=azurebrasil.cloud) - [Auditing and Telemetry for the Agent Governance Toolkit - Getting Started with .NET Core](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/auditing-and-telemetry-for-the-agent-governance-toolkit-getting/ba-p/4533073?ref=azurebrasil.cloud) - [Find anomalies in Prometheus and OpenTelemetry metrics with Dynamic Thresholds (Preview)](https://techcommunity.microsoft.com/t5/azure-observability-blog/find-anomalies-in-prometheus-and-opentelemetry-metrics-with/ba-p/4533069?ref=azurebrasil.cloud) - [Guest Access for Canvas and Model-Driven Apps with Microsoft Entra ID](https://techcommunity.microsoft.com/t5/microsoft-developer-community/guest-access-for-canvas-and-model-driven-apps-with-microsoft/ba-p/4529462?ref=azurebrasil.cloud) - [Building C# and C++ Apps with GitHub Copilot CLI and Visual Studio 2026](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/building-c-and-c-apps-with-github-copilot-cli-and-visual-studio/ba-p/4531648?ref=azurebrasil.cloud) - [Upcoming Change: NTLM Removal in Git (libcurl) – Impact to Azure DevOps Server Customers](https://devblogs.microsoft.com/devops/upcoming-change-ntlm-removal-in-git-libcurl-impact-to-azure-devops-server-customers/?ref=azurebrasil.cloud) - [Audit Frontier AI Agents with SQL MCP Server](https://devblogs.microsoft.com/azure-sql/sql-mcp-server-obo-auth/?ref=azurebrasil.cloud) - [Behind the Build with Gigamon: Enriching Microsoft Sentinel with Network-Derived Telemetry](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/behind-the-build-with-gigamon-enriching-microsoft-sentinel-with/ba-p/4530360?ref=azurebrasil.cloud) - [How to build long-running MCP tools on Azure Functions](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/how-to-build-long-running-mcp-tools-on-azure-functions/ba-p/4532653?ref=azurebrasil.cloud) - [Now generally available: Serverless posture coverage in Microsoft Defender CSPM](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/now-generally-available-serverless-posture-coverage-in-microsoft/ba-p/4532353?ref=azurebrasil.cloud) - [Introducing kars - an Agent Reference Stack for Kubernetes](https://techcommunity.microsoft.com/t5/linux-and-open-source-blog/introducing-kars-an-agent-reference-stack-for-kubernetes/ba-p/4529800?ref=azurebrasil.cloud) - [Smoke Test Microsoft Foundry Agents with GitHub Actions](https://techcommunity.microsoft.com/t5/microsoft-developer-community/smoke-test-microsoft-foundry-agents-with-github-actions/ba-p/4531912?ref=azurebrasil.cloud) - [Agent-to-Agent Communication: Connecting Foundry and LangGraph Agents via A2A](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/agent-to-agent-communication-connecting-foundry-and-langgraph/ba-p/4531378?ref=azurebrasil.cloud) - [What’s new across Microsoft SQL in 2026 so far (SQL Server, Azure SQL, and SQL database in Fabric)](https://devblogs.microsoft.com/azure-sql/whats-new-across-microsoft-sql-in-2026-so-far-sql-server-azure-sql-and-sql-database-in-fabric/?ref=azurebrasil.cloud) - [Shaping Software While It Runs: A Canvas Scenario, Start to Finish](https://techcommunity.microsoft.com/t5/microsoft-developer-community/shaping-software-while-it-runs-a-canvas-scenario-start-to-finish/ba-p/4531457?ref=azurebrasil.cloud) - [Azure Container Apps Express for Shipping Container Apps Fast](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/azure-container-apps-express-for-shipping-container-apps-fast/ba-p/4531371?ref=azurebrasil.cloud) - [Compose your API surface with Data API builder custom paths](https://devblogs.microsoft.com/azure-sql/data-api-builder-custom-rest-paths/?ref=azurebrasil.cloud) - [Claude Sonnet 5 Is Now Generally Available in Microsoft Foundry](https://techcommunity.microsoft.com/t5/microsoft-foundry-blog/claude-sonnet-5-is-now-generally-available-in-microsoft-foundry/ba-p/4530737?ref=azurebrasil.cloud) - [Microsoft Defender for Cloud expands multicloud coverage across AWS and Google Cloud](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/microsoft-defender-for-cloud-expands-multicloud-coverage-across/ba-p/4532200?ref=azurebrasil.cloud) - [What’s new in Microsoft Sentinel: June 2026](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/what-s-new-in-microsoft-sentinel-june-2026/ba-p/4531902?ref=azurebrasil.cloud) - [Visual Studio June Update – Track Your Usage, Trust Your Tools](https://devblogs.microsoft.com/visualstudio/visual-studio-june-update-track-your-usage-trust-your-tools/?ref=azurebrasil.cloud) - [The AI-first SOC: Copilot, UEBA, threat intelligence, and SOC optimization](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/the-ai-first-soc-copilot-ueba-threat-intelligence-and-soc/ba-p/4528609?ref=azurebrasil.cloud) - [GitHub Copilot App - Canvas Is Not a UI Builder](https://techcommunity.microsoft.com/t5/microsoft-developer-community/github-copilot-app-canvas-is-not-a-ui-builder/ba-p/4531451?ref=azurebrasil.cloud) - [Announcing General Availability of Client-Side Data Integrity Protections in Azure Blob Storage](https://techcommunity.microsoft.com/t5/azure-storage-blog/announcing-general-availability-of-client-side-data-integrity/ba-p/4531364?ref=azurebrasil.cloud) - [Your readiness playbook: adoption helper, costs, APIs, and the checklist](https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/your-readiness-playbook-adoption-helper-costs-apis-and-the/ba-p/4528608?ref=azurebrasil.cloud) - [WSL container is now available for public preview](https://devblogs.microsoft.com/commandline/wsl-container-is-now-available-for-public-preview/?ref=azurebrasil.cloud) - [Automating your Visual Studio extension builds with GitHub Actions](https://devblogs.microsoft.com/visualstudio/automating-your-visual-studio-extension-builds-with-github-actions/?ref=azurebrasil.cloud) - [My Journey with Azure SRE Agent](https://techcommunity.microsoft.com/t5/microsoft-developer-community/my-journey-with-azure-sre-agent/ba-p/4523519?ref=azurebrasil.cloud) - [Spring AI 2.0 is GA: Vector Search, Memory, and Agents on Azure Cosmos DB](https://devblogs.microsoft.com/cosmosdb/spring-ai-2-0-is-ga-vector-search-memory-and-agents-on-azure-cosmos-db/?ref=azurebrasil.cloud) - [Authenticating AWS Workloads to Azure Functions using Workload Identity Federation](https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/authenticating-aws-workloads-to-azure-functions-using-workload/ba-p/4531603?ref=azurebrasil.cloud) ### GitHub Updates - [How GitHub used secret scanning to reach inbox zero](https://github.blog/security/application-security/how-github-used-secret-scanning-to-reach-inbox-zero/?ref=azurebrasil.cloud) - [6 security settings every GitHub maintainer should enable this week](https://github.blog/security/6-security-settings-every-github-maintainer-should-enable-this-week/?ref=azurebrasil.cloud) - [How GitHub maintains compliance for open source dependencies](https://github.blog/enterprise-software/governance-and-compliance/how-github-maintains-compliance-for-open-source-dependencies/?ref=azurebrasil.cloud) - [Highlights from Git 2.55](https://github.blog/open-source/git/highlights-from-git-2-55/?ref=azurebrasil.cloud) - [Inside the Advisory Database and what happens when vulnerability volume breaks records](https://github.blog/security/supply-chain-security/inside-the-advisory-database-and-what-happens-when-vulnerability-volume-breaks-records/?ref=azurebrasil.cloud) ### Azure Brasil Updates - [OAuth Identity Passthrough no Foundry Agent Service com MCP Server customizado em .NET - Parte 1](https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-1/) - [N8N tomou conta da comunidade de IA, mas se você já vive no Azure talvez esteja pagando caro por algo que já tem](https://www.azurebrasil.cloud/blog/n8n-tomou-conta-da-comunidade-de-ia-mas-se-voce-ja-vive-no-azure-talvez-esteja-pagando-caro-por-algo-que-ja-tem/) - [Integrando Tailwind CSS v4 ao PrimeVue com GitHub Copilot: quando usar cada um e como garantir consistência - Parte 2](https://www.azurebrasil.cloud/blog/integrando-tailwind-css-v4-ao-primevue-com-github-copilot-quando-usar-cada-um-e-como-garantir-consistencia-parte-2/) - [Structured Inputs na Prática: Pare de criar um agente para cada usuário no Microsoft Foundry](https://www.azurebrasil.cloud/blog/pare-de-criar-um-agente-para-cada-usuario-no-microsoft-foundry/) - [Azure Newsletter - 2026-06-29](https://www.azurebrasil.cloud/blog/azure-newsletter-2026-06-29/) ### OAuth Identity Passthrough no Foundry Agent Service com MCP Server customizado em .NET - Parte 1 URL: https://www.azurebrasil.cloud/blog/oauth-identity-passthrough-no-foundry-agent-service-com-mcp-server-customizado-em-net-parte-1/ Last updated: 2026-07-02T13:25:00.000Z O [OAuth Identity Passthrough](https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/mcp-authentication?view=foundry&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) permite que o Foundry Agent Service chame um MCP Server em nome do usuário logado, preservando a identidade e os scopes que aquele usuário consentiu. A diferença em relação a uma integração comum é conceitualmente simples: o agente não chama o MCP Server usando uma API Key ou uma identidade genérica de aplicação. Ele chama o MCP Server usando um access token delegado do próprio usuário, emitido pelo [Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity-platform/access-tokens?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). Isso significa que cada tool do MCP roda com as permissões reais da pessoa que está conversando com o agente, e não com um crachá compartilhado. O fluxo de identidade que vamos montar percorre a seguinte cadeia, começando no usuário autenticado, passando pelo Foundry Agent Service, depois pelo App Registration client que representa o Foundry como OAuth client, seguindo para o Microsoft Entra ID que emite os tokens e terminando no MCP Server protegido, que aqui chamaremos de **custom-mcp-cars**. Essa cadeia é o coração do artigo, então vale ter ela em mente enquanto avançamos. Antes de abrir o portal, é importante entender que o cenário usa dois [**App Registrations**](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) distintos, e confundir os dois é a causa mais comum de erro nesse tipo de integração. O primeiro deles é o **custom-mcp-cars**, que representa o MCP Server como uma API protegida no **Microsoft Entra ID**. Ele é usado pela aplicação .NET Web API publicada no [**Azure App Service**](https://learn.microsoft.com/en-us/azure/app-service/overview?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) e é responsável por expor a API, definir o Application ID URI, declarar os **scopes** e determinar o audience esperado nos tokens que o MCP Server recebe. O segundo é o **custom-mcp-cars-client**, que representa o OAuth client usado pelo Foundry. Ele é usado pelo [Foundry Agent Service](https://learn.microsoft.com/pt-br/azure/foundry/agents/overview?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) e concentra o Client ID, o Client Secret, o Redirect URI, as API permissions e a solicitação de tokens em nome do usuário. Resumindo em uma linha, o **custom-mcp-cars** é o server e o **custom-mcp-cars-client** é o client. A diferença entre App Registration, application object e service principal está bem detalhada na documentação sobre [apps and service principals](https://learn.microsoft.com/en-us/entra/identity-platform/app-objects-and-service-principals?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), caso você queira aprofundar Começamos criando o App Registration do server, que vamos chamar de custom-mcp-cars. Esse registro representa o MCP Server como recurso protegido no Microsoft Entra ID, e o passo a passo oficial para criar um App Registration está no [quickstart de registro de aplicações](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/1.png) Com o registro criado, o próximo passo é ir até a seção Expose an API do custom-mcp-cars e configurar o Application ID URI no formato **api://**. Esse valor é fundamental, porque será exatamente o audience esperado nos tokens recebidos pelo MCP Server. O [guia oficial para expor uma Web API e criar scopes cobre esse ponto em detalhe](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-configure-app-expose-web-apis?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/2.png) Nessa mesma tela vamos criar apenas três scopes próprios da API, que são **Cars.Read**, **Cars.Write** e **Cars.Delete**. O Cars.Read permite consultar carros, o Cars.Write permite criar e atualizar carros e o Cars.Delete permite excluir carros. Ao criar cada scope, deixamos o campo de consentimento como Admins and users, para que o usuário comum também consiga consentir sem depender de um administrador. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/3-1.png) Depois de criar os três, a tela de scopes deve listar exatamente **Cars.Read**, **Cars.Write** e **Cars.Delete**. Vale reforçar aqui um detalhe que costuma confundir: a API **custom-mcp-cars** possui somente esses três scopes próprios, e o offline\_access que aparecerá mais adiante não é um scope da API, e sim um scope [OIDC padrão](https://learn.microsoft.com/en-us/entra/identity-platform/scopes-oidc?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) usado para habilitar refresh token. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/4-1.png) Com a API exposta e os scopes definidos no portal, faz sentido olhar para o outro lado dessa relação, que é o código do MCP Server que vai validar esses tokens. A aplicação .NET já está pronta no repositório, então a ideia não é criar nada do zero, e sim entender como esse código existente funciona como um MCP Server HTTP protegido pelo Microsoft Entra ID. Ela expõe um endpoint /mcp, valida tokens emitidos para o custom-mcp-cars, confere o audience, trabalha com os scopes Cars.Read, Cars.Write e Cars.Delete e aplica autorização específica em cada tool. As tools formam um CRUD de carros e são **cars\_list**, **cars\_get**, **cars\_create**, **cars\_update** e **cars\_delete**, mapeadas respectivamente para **Cars.Read** nas leituras, **Cars.Write** nas escritas e **Cars.Delete** na exclusão. O ponto de partida da aplicação é o **Program.cs**, onde a autenticação, a autorização e o próprio MCP Server são configurados. ```csharp var builder = WebApplication.CreateBuilder(args); builder.Services .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); builder.Services.AddAuthorization(options => options.AddCarsPolicies()); builder.Services.AddSingleton(); builder.Services .AddMcpServer() .WithHttpTransport(options => { options.Stateless = true; }) .AddAuthorizationFilters() .WithToolsFromAssembly(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.MapGet("/healthz", () => Results.Ok(new { status = "healthy", service = "cars-mcp" })) .AllowAnonymous(); app.MapMcp("/mcp") .RequireAuthorization("McpAccess"); app.Run(); ``` - **AddMicrosoftIdentityWebApi()** protege a Web API validando os tokens do Microsoft Entra ID com base na seção AzureAd da configuração, conforme a [referência oficial do método](https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.web.microsoftidentitywebapiauthenticationbuilderextensions.addmicrosoftidentitywebapi?view=msal-model-dotnet-latest&wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud); - **AddCarsPolicies()** registra as policies de autorização baseadas em scope que controlam o acesso ao MCP e a cada tool; - **AddMcpServer()** com WithHttpTransport() configura o MCP Server usando o transport HTTP do [SDK C# do MCP](https://csharp.sdk.modelcontextprotocol.io/concepts/getting-started.html?ref=azurebrasil.cloud); - **AddAuthorizationFilters()** liga os filtros de autorização do MCP para que os atributos \[Authorize\] das tools sejam respeitados, conforme documentado nos filters do SDK; - **WithToolsFromAssembly()** descobre automaticamente todas as tools anotadas no assembly; - **MapMcp("/mcp")** publica o endpoint do MCP Server exigindo a policy McpAccess, enquanto o /healthz permanece anônimo para health checks. A configuração da seção **AzureAd** usada por esse código vive no appsettings.json e é o que amarra a aplicação ao App Registration server. ```json { "AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "", "ClientId": "", "Audience": "" }, "AllowedHosts": "*" } ``` Aqui vale destacar que o TenantId, o ClientId e o Audience se referem ao [custom-mcp-cars](https://learn.microsoft.com/en-us/entra/identity-platform/scenario-protected-web-api-app-configuration?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), e não ao custom-mcp-cars-client. O MCP Server não valida tokens pelo Client ID do Foundry: ele valida tokens emitidos para o App Registration server, com audience igual ao Application ID URI do custom-mcp-cars. Essa é a essência da configuração de uma [Web API protegida em ASP.NET Core](https://learn.microsoft.com/en-us/entra/identity-platform/scenario-protected-web-api-app-configuration?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). As policies mencionadas no Program.cs ficam concentradas em um método de extensão, e é nele que a validação de scope realmente acontece. ```csharp public static void AddCarsPolicies(this AuthorizationOptions options) { options.AddPolicy("McpAccess", policy => { policy.RequireAuthenticatedUser(); policy.RequireAssertion(context => context.User.HasAnyScope( CarsScopes.Read, CarsScopes.Write, CarsScopes.Delete)); }); options.AddPolicy("CarsRead", policy => { policy.RequireAuthenticatedUser(); policy.RequireAssertion(context => context.User.HasScope(CarsScopes.Read)); }); options.AddPolicy("CarsWrite", policy => { policy.RequireAuthenticatedUser(); policy.RequireAssertion(context => context.User.HasScope(CarsScopes.Write)); }); options.AddPolicy("CarsDelete", policy => { policy.RequireAuthenticatedUser(); policy.RequireAssertion(context => context.User.HasScope(CarsScopes.Delete)); }); ``` - **McpAccess** exige um usuário autenticado que tenha ao menos um dos três scopes, servindo como porta de entrada geral do endpoint /mcp. - **CarsRead** exige especificamente o scope Cars.Read para operações de leitura. - **CarsWrite** exige o scope Cars.Write para criação e atualização. - **CarsDelete** exige o scope Cars.Delete para exclusão. Esse desenho segue a authorization baseada em **policies do ASP.NET Core** e a recomendação de validar scopes em uma [API protegida](https://learn.microsoft.com/en-us/entra/identity-platform/scenario-protected-web-api-verification-scope-app-roles?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). A leitura do scope em si é feita por um par de extensões sobre o ClaimsPrincipal, que inspecionam a claim scp presente no token. ```csharp public static bool HasScope(this ClaimsPrincipal user, string requiredScope) { var scopeClaim = user.FindFirst("scp")?.Value ?? user.FindFirst("http://schemas.microsoft.com/identity/claims/scope")?.Value; if (string.IsNullOrWhiteSpace(scopeClaim)) return false; var scopes = scopeClaim.Split(' ', StringSplitOptions.RemoveEmptyEntries); return scopes.Contains(requiredScope, StringComparer.OrdinalIgnoreCase); } public static bool HasAnyScope(this ClaimsPrincipal user, params string[] requiredScopes) { return requiredScopes.Any(user.HasScope); } ``` - **HasScope()** lê a claim scp do token, separa os scopes por espaço e verifica se o scope exigido está presente, ignorando diferença de maiúsculas e minúsculas. - **HasAnyScope()** retorna verdadeiro se qualquer um dos scopes informados estiver presente, e é usado pela policy McpAccess. Com as policies prontas, cada tool declara qual delas precisa. A tool de listagem é o exemplo mais direto, porque é somente leitura e depende apenas do Cars.Read. ```csharp [McpServerTool(Name = "cars_list", ReadOnly = true, Destructive = false)] [Authorize(Policy = "CarsRead")] [Description("Lists all cars. Requires the Cars.Read scope.")] public static IReadOnlyCollection ListCars(CarStore store) { return store.List(); } ``` **ListCars()** retorna todos os carros do CarStore e só executa se o token do usuário contiver o scope **Cars.Read**, graças ao atributo **\[Authorize(Policy = "CarsRead")\]**. O atributo **\[McpServerTool\]** marca o método como uma tool do MCP e traz metadados como ReadOnly e Destructive, descritos na referência do [McpServerTool](https://csharp.sdk.modelcontextprotocol.io/api/ModelContextProtocol.Server.McpServerTool.html?ref=azurebrasil.cloud). A tool de criação eleva o requisito para o scope Cars.Write e ainda valida os dados de entrada antes de gravar. ```csharp [McpServerTool(Name = "cars_create", ReadOnly = false, Destructive = false)] [Authorize(Policy = "CarsWrite")] [Description("Creates a new car. Requires the Cars.Write scope.")] public static object CreateCar( CarStore store, [Description("The car brand. Example: Toyota.")] string brand, [Description("The car model. Example: Corolla.")] string model, [Description("The manufacturing year.")] int year) { var validation = ValidateCarInput(brand, model, year); if (validation is not null) return validation; var car = store.Create(brand, model, year); return new { created = true, car }; } ``` **CreateCar()** valida marca, modelo e ano, cria o carro no CarStore e devolve o registro criado, exigindo o scope **Cars.Write** por meio da policy **CarsWrite**. Por fim, a tool de exclusão é a única marcada como Destructive e exige o scope mais restrito, o **Cars.Delete**. ```csharp [McpServerTool(Name = "cars_delete", ReadOnly = false, Destructive = true)] [Authorize(Policy = "CarsDelete")] [Description("Deletes a car. Requires the Cars.Delete scope.")] public static object DeleteCar( CarStore store, [Description("The car id.")] Guid id) { var deleted = store.Delete(id); return new { deleted }; } ``` **DeleteCar()** remove o carro pelo identificador e retorna se a exclusão ocorreu, exigindo o scope Cars.Delete por meio da policy CarsDelete. Os dados ficam em um CarStore em memória que já vem populado com dez carros de exemplo, o que é suficiente para demonstrar o fluxo sem precisar de banco de dados. Entendido o código, precisamos de um lugar público para hospedá-lo, já que o Foundry acessa o MCP Server por um endpoint HTTP remoto. Por isso criamos um Azure App Service que vai receber a aplicação .NET, e a configuração específica de runtime para ASP.NET Core está descrita na documentação de [configuração de apps .NET no App Service](https://learn.microsoft.com/en-us/azure/app-service/configure-language-dotnetcore?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). O endpoint final esperado do MCP será algo como **https://.azurewebsites.net/mcp.** ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/5.png) Com o App Service criado, o deploy da aplicação é feito por um script que já existe no repositório, o **deploy.sh**. Ele publica o projeto em modo Release, empacota o resultado em um zip e envia para o App Service já existente, sem tocar em nenhuma configuração de ambiente. ```bash #!/usr/bin/env bash set -euo pipefail # ─── Configuration ──────────────────────────────────────────────────────────── RESOURCE_GROUP_NAME="rg-cars-mcp" APP_SERVICE_NAME="cars-mcp-app" PROJECT_PATH="." PUBLISH_DIR="./publish" ZIP_PATH="./publish.zip" DOTNET_CONFIGURATION="Release" # ────────────────────────────────────────────────────────────────────────────── echo "==> Checking Azure CLI login..." az account show >/dev/null 2>&1 || az login echo "==> Cleaning previous publish artifacts..." rm -rf "$PUBLISH_DIR" "$ZIP_PATH" echo "==> Publishing Cars.Mcp ($DOTNET_CONFIGURATION)..." dotnet publish "$PROJECT_PATH" \ --configuration "$DOTNET_CONFIGURATION" \ --output "$PUBLISH_DIR" echo "==> Creating deployment zip..." (cd "$PUBLISH_DIR" && zip -r -q "../$(basename "$ZIP_PATH")" .) echo "==> Deploying to App Service: $APP_SERVICE_NAME" az webapp deploy \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --src-path "$ZIP_PATH" \ --type zip ``` O script primeiro garante o login no Azure, executando az login apenas se ainda não houver sessão ativa. Em seguida limpa artefatos de publicações anteriores, roda o dotnet publish em Release, gera o pacote zip e finalmente usa az webapp deploy para enviar o pacote ao App Service. Para rodar o deploy, basta abrir o terminal na pasta do projeto e executar o script. ```bash ./deploy.sh ``` Depois da publicação, dá para validar que a aplicação subiu acessando o endpoint **https://.azurewebsites.net/healthz**, que responde de forma anônima, enquanto o endpoint protegido do MCP fica em **https://.azurewebsites.net/mcp**. Antes de conectar o Foundry, a aplicação publicada precisa saber a qual App Registration ela pertence, e isso é feito por variáveis de ambiente no Azure App Service, conforme a [documentação de configuração de app settings](https://learn.microsoft.com/en-us/azure/app-service/configure-common?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). As quatro variáveis usadas são AzureAd\_\_Audience, AzureAd\_\_ClientId, AzureAd\_\_Instance e AzureAd\_\_TenantId, que correspondem exatamente à seção AzureAd do appsettings.json. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/Screenshot-2026-07-02-at-09.53.41.png) O AzureAd\_\_Audience recebe o Application ID URI do custom-mcp-cars, no formato api://. O AzureAd\_\_ClientId recebe o Client ID do custom-mcp-cars. O AzureAd\_\_Instance recebe https://login.microsoftonline.com/ e o AzureAd\_\_TenantId recebe o Tenant ID onde o App Registration foi criado. O ponto crítico aqui é o mesmo de antes: todos esses valores pertencem ao App Registration server **custom-mcp-cars**, e não ao **custom-mcp-cars-client**. Com o server pronto e publicado, entramos na segunda metade da configuração, que é o lado do client. Criamos então o segundo App Registration, o custom-mcp-cars-client, que será usado pelo Foundry como OAuth client responsável por solicitar tokens para acessar o MCP Server em nome do usuário. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/Screenshot-2026-07-02-at-09.54.54.png) Dentro do custom-mcp-cars-client, vamos até API permissions, escolhemos Add a permission, depois My APIs e selecionamos o **custom-mcp-cars**. Esse é o passo que conecta o client à API que criamos, e o procedimento está documentado no [guia de configuração de acesso a Web APIs](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-configure-app-access-web-apis?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/7-1.png) Na sequência, marcamos os três scopes que a API expõe, que são Cars.Read, Cars.Write e Cars.Delete. Essas são permissões delegadas, ou seja, permitem que o custom-mcp-cars-client solicite tokens para acessar o custom-mcp-cars em nome do usuário, e o conceito de delegated permissions e consentimento está detalhado na [visão geral de permissions and consent](https://learn.microsoft.com/en-us/entra/identity-platform/permissions-consent-overview?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/8.png) Depois de adicionar, a lista de permissões mostra os três scopes delegados, ainda sem admin consent, o que é esperado neste cenário, já que o próprio usuário poderá consentir no momento da primeira chamada. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/9.png) Como o Foundry precisa se autenticar como esse client, criamos também um Client Secret no custom-mcp-cars-client. O Foundry usará o Client ID em conjunto com esse Client Secret para executar o fluxo OAuth, e as boas práticas de criação e gestão de credenciais estão na documentação de [application credentials](https://learn.microsoft.com/en-us/entra/identity-platform/how-to-add-credentials?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/10.png) Agora que temos server publicado e client configurado, partimos para o Foundry Agent Service, partindo do princípio de que o Foundry Project, o agent e o model deployment já existem e que o MCP Server já está publicado. Adicionamos uma tool MCP no Foundry apontando para o endpoint remoto e escolhendo OAuth Identity Passthrough como autenticação, seguindo o [guia de conexão de MCP tools remotas a agentes](https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/tools/model-context-protocol?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). O nome da tool é custom-mcp-cars e o endpoint é **https://.azurewebsites.net/mcp**. O Client ID e o Client Secret são os do custom-mcp-cars-client. A Auth URL fica em **https://login.microsoftonline.com//oauth2/v2.0/authorize**, enquanto a Token URL e a Refresh URL apontam ambas para **https://login.microsoftonline.com//oauth2/v2.0/token**, que são os endpoints padrão do [protocolo OAuth 2.0 no Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). Os scopes configurados no Foundry usam o formato completo com o Application ID URI, ficando **api:///Cars.Read, api:///Cars.Write, api:///Cars.Delete** e, por último, **offline\_access**. Os três primeiros são os scopes próprios da API custom-mcp-cars e o offline\_access habilita o refresh token no fluxo OAuth. Um detalhe prático que evita dor de cabeça: os scopes devem ser separados por espaço, e não por vírgula. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/11.png) Ao salvar essa configuração, o Foundry gera um Redirect URI próprio, normalmente no formato **https://global.consent.azure-apim.net/redirect/**. Esse Redirect URI é o endereço para onde o fluxo OAuth vai devolver o authorization code que o Foundry troca por tokens, e ele precisa ser cadastrado no App Registration. Voltamos então ao **custom-mcp-cars-client**, entramos em Authentication, escolhemos Add platform, depois Web e adicionamos essa URL como Redirect URI, seguindo o procedimento oficial de [adição de redirect URI](https://learn.microsoft.com/en-us/entra/identity-platform/how-to-add-redirect-uri?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) e respeitando as boas práticas de [reply URLs](https://learn.microsoft.com/en-us/entra/identity-platform/reply-url?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). Vale reforçar que o Redirect URI é cadastrado no [custom-mcp-cars-client](https://learn.microsoft.com/en-us/entra/identity-platform/reply-url?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud), e nunca no [custom-mcp-cars.](https://learn.microsoft.com/en-us/entra/identity-platform/reply-url?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/12.1-1.png) Com tudo conectado, é hora de testar no Agent Playground do Foundry. Pedimos algo simples que dependa do MCP, como listar todos os carros, e na primeira vez o Foundry responde pedindo consentimento, exibindo um botão de consent no próprio chat. Esse botão aparece porque o usuário ainda não autorizou o custom-mcp-cars-client a acessar o custom-mcp-cars em seu nome. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/13.png) Ao clicar em Open consent, abre-se o fluxo de consentimento OAuth no navegador. Nesse momento o usuário está autorizando o client usado pelo Foundry a acessar o MCP Server em seu nome, e a experiência de consentimento no Microsoft Entra ID está descrita na [documentação de consent experience](https://learn.microsoft.com/en-us/entra/identity-platform/application-consent-experience?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/14.png) A tela seguinte mostra os scopes solicitados e, dependendo da configuração do tenant, o consentimento pode ser individual ou para toda a organização, um tema aprofundado no guia de requesting [**permissions and consent**](https://learn.microsoft.com/en-us/entra/identity-platform/consent-types-developer?wt.mc%5Fid=MVP%5F407589&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/15.png) Depois vem uma confirmação final exigida pelo Foundry. Assim que ela é aceita, o Microsoft Entra ID devolve o authorization code e o Foundry, atuando como Credential Manager, troca esse code por access token e refresh token. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/16.png) Concluído esse passo, a tela indica que a autenticação foi finalizada, e a partir daí o Foundry consegue obter access tokens para chamar o MCP Server em nome do usuário sempre que precisar. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/17.png) Voltando ao chat do Foundry, o consentimento já aparece concedido e o agente pode prosseguir com a solicitação original. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/18.png) Voltando ao chat do Foundry, o consentimento já aparece concedido e o agente pode prosseguir com a solicitação original. Na sequência, o agente executa a chamada ao MCP Server e traz de volta os dados dos carros, mostrando que o fluxo delegado funcionou de ponta a ponta. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/19.png) Para exercitar uma operação de escrita, pedimos ao agente que crie um novo carro, por exemplo um Fiat Argo Drive 1.0 (hatch) 2021\. Essa operação exige o scope Cars.Write, e o Foundry chama o MCP usando o token delegado do usuário, que por sua vez tem seu scope validado pela policy CarsWrite antes de executar a tool cars\_create. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/20-1.png) O agente coleta os dados informados e monta a chamada correspondente à tool de criação. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/21-1.png) Em seguida, o MCP Server responde com o resultado da criação, confirmando que o carro foi persistido no CarStore. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/22.png) Por fim, pedimos novamente a listagem de todos os carros, agora já com o novo registro incluído. Como o usuário já consentiu anteriormente, o Foundry não precisa pedir consentimento de novo, e a operação, que exige apenas o Cars.Read, é atendida diretamente. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/07/23.png) Vale entender o que o MCP Server efetivamente recebe nessas chamadas. O access token entregue à API carrega claims importantes, sendo o aud igual a api://, o scp contendo os scopes delegados concedidos como Cars.Read, Cars.Write e Cars.Delete, o tid identificando o tenant e o oid identificando o usuário. O aud indica para qual API o token foi emitido, o scp indica os scopes delegados presentes, o tid identifica o tenant e o oid identifica a pessoa. O MCP Server valida o audience e os scopes, e se o token não contiver o scope exigido pela tool, a chamada simplesmente não é autorizada. Olhando o cenário como um todo, cada componente tem um papel bem definido. O Microsoft Entra ID autentica o usuário e emite os tokens. O Foundry Agent Service, atuando também como Credential Manager, executa o fluxo OAuth e gerencia consentimento, access token e refresh token. O custom-mcp-cars-client representa o app usado pelo Foundry para pedir os tokens. O custom-mcp-cars representa o MCP Server como API protegida. O Azure App Service hospeda a aplicação .NET, o MCP Server valida token, audience e scopes, e o código .NET autoriza cada tool conforme o scope necessário. Chegamos assim ao fim da Parte 1, na qual criamos o Server App Registration custom-mcp-cars, expusemos a API, criamos os três scopes Cars.Read, Cars.Write e Cars.Delete, apresentamos o código existente do MCP Server, criamos o Azure App Service, fizemos o deploy via deploy.sh usando az login, configuramos as variáveis AzureAd\_\_ no App Service, criamos o Client App Registration custom-mcp-cars-client, configuramos as API permissions delegadas, geramos o client secret, configuramos o MCP no Foundry, registramos o Redirect URI no client, passamos pelo consentimento OAuth e executamos chamadas reais ao MCP pelo Foundry Agent Service. Na Parte 2, vamos sair do portal e criar aplicações que consomem esse mesmo fluxo de forma programática, integrando o Foundry Agent Service ao MCP Server com OAuth Identity Passthrough. Você já pode baixar o projeto por esse [link](https://github.com/TallesValiatti/McpOAuthIdentityPassthrough?ref=azurebrasil.cloud), e não esquece de me seguir no [LinkedIn](https://www.linkedin.com/in/tallesvaliatti/?ref=azurebrasil.cloud)! Até a próxima, abraços! ### N8N tomou conta da comunidade de IA, mas se você já vive no Azure talvez esteja pagando caro por algo que já tem URL: https://www.azurebrasil.cloud/blog/n8n-tomou-conta-da-comunidade-de-ia-mas-se-voce-ja-vive-no-azure-talvez-esteja-pagando-caro-por-algo-que-ja-tem/ Last updated: 2026-07-02T12:29:05.000Z Olá pessoALL, no artigo de hoje quero falar de um assunto que apareceu em praticamente toda conversa sobre automação e agentes de IA no último ano: o **N8N**. E quero falar dele sem torcer o nariz, porque a ferramenta é boa. Mas quero te provocar com uma pergunta que poucos param para fazer: se você (ou seu cliente) já está dentro do ecossistema Microsoft, será que vale a pena subir e manter mais uma peça de infraestrutura? Durante os últimos meses, parece que todo mundo na comunidade de IA descobriu o N8N ao mesmo tempo. Vídeo no YouTube, thread no X, post no LinkedIn, sempre o mesmo fluxo colorido conectando um webhook a um modelo de linguagem e mandando o resultado pro Slack. E olha, faz sentido o hype. O N8N é open source, tem centenas de integrações prontas e te dá aquela sensação gostosa de montar um fluxo arrastando caixinhas. Para quem está fora da nuvem das grandes ou quer self-hosting puro, é uma excelente escolha. **Mas** é exatamente aí que mora a pergunta que ninguém faz. ## O que o hype não te conta sobre self-hosting O N8N "gratuito" é o N8N que você mesmo hospeda. E self-hosting nunca é só apertar um botão. Conversando com alguns times que adotaram a ferramenta na empolgação, a história costuma ser parecida: subiram um container, funcionou lindamente na demo, e três semanas depois estavam discutindo backup do banco, certificado SSL expirando, fila de execução travando sob carga e quem ia ficar de plantão quando o fluxo de produção caísse de madrugada. Vamos colocar números nisso, porque número é o que importa na hora de assinar a fatura. Para rodar N8N self-hosted de forma minimamente séria, você precisa de: - Uma VM ou container rodando 24 horas por dia, mesmo que seus fluxos executem 5 minutos no dia inteiro. - Um banco de dados (PostgreSQL) para persistir as execuções. - Alguém cuidando de patches, atualizações de versão, escala e monitoramento. Uma VM pequena no Azure tipo **B2s** custa, dependendo da região, algo em torno de US$30 a US$40 por mês. Some o banco gerenciado, e você passa fácil de US$70/mês, pagando o tempo todo, executando ou não. Sem contar o custo invisível, que é o mais caro de todos: o tempo do seu time mantendo aquilo de pé. Funciona? Funciona. Mas vamos ser honestos: você acabou de transformar uma "ferramenta gratuita" num projeto de infraestrutura com dono, plantão e fatura mensal fixa. ## A peça que você provavelmente já está pagando: Logic Apps Se você está no Azure, existe uma engine de workflow que faz essencialmente o mesmo que o N8N (gatilhos, ações, conectores, retry, histórico de execução), só que você não gerencia nada da infraestrutura: o **Azure Logic Apps**. E aqui entra a primeira diferença que muda o jogo: o modelo de cobrança. No **Logic Apps Consumption**, você paga por execução de ação, na casa de frações de centavo. Não tem VM ligada de madrugada queimando dinheiro à toa. Fluxo não rodou? Você não pagou. Além disso, o plano Consumption ainda vem com uma cota inicial de ações gratuitas por mês, o que na prática significa que muitos fluxos de automação de PME rodam praticamente de graça. Ou seja, compare maçãs com maçãs: | | N8N self-hosted | Azure Logic Apps (Consumption) | | -------------------- | ----------------------------------- | --------------------------------------------- | | Infraestrutura | Você gerencia (VM + DB) | Totalmente gerenciada | | Custo base | VM + DB ligados 24/7 (\~US$70+/mês) | Paga por execução (frações de centavo) | | Escala | Você dimensiona e monitora | Escala automática, sem ação sua | | Patches/atualizações | Responsabilidade sua | Microsoft cuida | | Conectores prontos | Centenas | Centenas (Service Bus, SQL, SharePoint, etc.) | | Plantão quando cair | Seu time | SLA da plataforma | Quando você bota tudo na balança, o N8N self-hosted deixa de ser "grátis" e o Logic Apps deixa de ser "caro". Para quem já tem subscription Azure, o Logic Apps entrega o mesmo resultado com menos custo e, principalmente, sem mais uma peça de infraestrutura para você ficar de babá. ## Então por que tanta gente fugia do Logic Apps? Aqui preciso fazer uma confissão, porque seria desonesto vender o Logic Apps como bala de prata sem reconhecer o seu calcanhar de Aquiles histórico. Sim. Eu também já torci o nariz para o Logic Apps. E o motivo era sempre o mesmo: o **designer visual** e o **JSON** por baixo dele. Para um desenvolvedor que vive no C#, no Git e em pull requests, o fluxo de trabalho do Logic Apps clássico era um desconforto. Você montava o workflow arrastando caixinhas numa tela, e o que era salvo era um arquivo JSON gigante e ilegível. Tentar revisar uma mudança num pull request daquilo era sofrimento. Fazer merge de duas alterações no mesmo fluxo? Melhor nem tentar. Versionar lógica de negócio crítica num blob JSON que ninguém consegue ler num diff sempre foi o ponto fraco que empurrava o pessoal mais "dev" de volta para soluções como o N8N, ou para escrever a automação na unha em código. Esse, durante anos, foi o argumento mais justo a favor das alternativas: o Logic Apps tinha a engine, mas não tinha a experiência de desenvolvimento que um time de software espera. **Mas** isso acabou de mudar. ## O anúncio do Build que fecha a lacuna: Logic Apps em C# No Build deste ano, a Microsoft anunciou em preview o **Logic Apps Standard SDK**, um pacote NuGet (`Microsoft.Azure.Workflows.Sdk`) que te deixa escrever workflows do Logic Apps Standard direto em C#, com tipagem forte, IntelliSense e tudo o que você já espera do seu ambiente .NET. E vale ressaltar um ponto importante para não haver confusão: isso não é uma nova runtime. É uma nova forma de *definir* os workflows. O que você escreve em C# compila para a mesma definição e roda na mesma engine do Logic Apps Standard de sempre: mesmos conectores, mesmo histórico visual de execução, mesmo monitoramento. Você muda a experiência de autoria, não o motor. Na prática, o que isso significa? Aquele calcanhar de Aquiles do JSON ilegível simplesmente deixou de existir. Agora: - Seus workflows vivem onde o resto do seu código vive: no repositório, no controle de versão. - Eles fazem diff como código e são revisados em pull requests normais. - O compilador pega erros antes de você rodar qualquer coisa. - Você usa F5, debug e o ecossistema .NET que já conhece. Para não ficar só nas minhas palavras, veja como fica um fluxo. Em vez de arrastar caixinhas, você encadeia as operações com `.Then(...)`, e o formato do código espelha o formato do workflow. Você lê de cima para baixo e lê o caminho de execução: ```csharp trigger .Then(validateOrder) .Then(getOrders) .Then(sendResponse); ``` Controle de fluxo também faz parte do mesmo modelo. Um `if/else`, por exemplo, é só mais uma ação que você encadeia, recebendo uma factory para cada ramo: ```csharp var checkTotal = WorkflowActions.BuiltIn.Control.Condition( expression: () => order.Total > 1000, trueBranch: () => requireApproval, falseBranch: () => autoApprove ).WithName("CheckOrderValue"); ``` E quando a lógica é complexa demais para uma expressão declarativa (aquela transformação que sempre te obrigava a torturar uma expressão para fazer algo que ela não foi feita para fazer), você simplesmente cai num método C# de verdade no meio do workflow: ```csharp var enrich = WorkflowActions.BuiltIn.CustomCode(async (context) => { var trigger = await context.GetTriggerResults(); var order = await context.GetActionResults("GetOrders"); // sua lógica, suas bibliotecas, seus tipos return "enriched"; }).WithName("EnrichOrder"); ``` Esse é o "escape hatch" que mantém você em fluxo: precisou de validação, transformação ou uma chamada para a sua própria biblioteca, você escreve um método, sem sair do arquivo nem da linguagem. ## O ângulo que poucos vão comentar: isso é feito sob medida para agentes de código Tem um detalhe nesse anúncio que merece atenção, especialmente porque o N8N cresceu justamente na onda da IA. Agentes de código (como o GitHub Copilot e afins) são simplesmente melhores escrevendo código imperativo do que JSON declarativo. E o motivo é o mesmo conjunto de proteções que ajuda você: tipagem forte e um passo de compilação fazem com que o código que o agente gera já saia sintaticamente correto. O compilador e o sistema de tipos fazem a checagem por você. Coloque testes unitários por cima e você cobre boa parte do que importa. Pense na ironia: a comunidade adotou o N8N em peso por causa da IA, e agora a Microsoft entregou uma forma de escrever automação que é, por construção, muito mais amigável para a IA gerar e validar do que arrastar caixinhas ou montar JSON na mão. E não é só para integração corporativa clássica. O SDK cobre tanto os fluxos de integração (conectar sistemas e mover dados) quanto os workflows agênticos, onde um agente de IA conversacional ou autônomo conduz os passos. Os dois são cidadãos de primeira classe no mesmo SDK. ## Vamos ser equilibrados: quando o N8N ainda faz sentido Não vou cair no erro de dizer que uma ferramenta é sempre melhor que a outra. Seria desonesto, e você já deve ter percebido que esse não é o tom aqui. O N8N continua sendo uma ótima escolha se: - Você não está no Azure nem no ecossistema Microsoft e não quer entrar. - Você quer ou precisa de self-hosting total por questões de soberania de dados, e tem time para manter isso. - Seu time prefere o modelo visual puro e não tem pretensão de versionar a lógica como código. E preciso ser honesto também sobre o lado do Logic Apps: o SDK em C# está em **preview**. Isso traz limitações que você precisa conhecer antes de apostar nele para produção crítica: - Conectores **Service Provider** ainda não são suportados. - **Schemas dinâmicos** ainda não funcionam. - Custom code suporta apenas métodos de callback: nada de lambdas inline por enquanto. - Autenticação por **Managed Identity** ainda está em desenvolvimento; por ora, você usa connection keys. Ou seja, para um piloto, uma POC ou para começar a migrar fluxos novos, é a hora perfeita de colocar a mão. Para o coração do seu sistema em produção, espere o GA ou valide cada limitação com calma. ## Minha recomendação, na prática Se eu tivesse que resumir a decisão para um cliente que já está no Azure e estava de olho no N8N por causa do hype, minha sequência seria: 1. **Já tem subscription Azure?** Comece testando o Logic Apps Consumption. Você provavelmente vai rodar seus fluxos por uma fração do custo de uma VM ligada o mês inteiro. 2. **Time é de desenvolvedores que vivem no Git?** Experimente o novo Logic Apps Standard SDK em C#. O argumento que te empurrava para fora do Logic Apps, o JSON ilegível, não existe mais. 3. **Precisa de agentes de IA no fluxo?** O SDK já trata workflows agênticos como cidadãos de primeira classe, e o formato em código é muito mais amigável para a IA gerar e validar. 4. **Self-hosting é requisito inegociável?** Aí sim, o N8N continua sendo uma escolha legítima, com a consciência de que a conta da infraestrutura e do plantão vem junto. O ponto central é esse: o hype não deveria te fazer pagar duas vezes. Se você já investe no ecossistema Microsoft, subir e manter mais uma peça de infraestrutura para fazer algo que a plataforma já entrega gerenciado raramente é o melhor negócio. E agora, com a possibilidade de escrever tudo em C#, foi embora a última desculpa técnica que restava para o desenvolvedor torcer o nariz. Lição aprendida: a ferramenta mais comentada nem sempre é a mais barata, e quase nunca é a que melhor se encaixa no que você já tem. ## Links Úteis ### Anúncio e documentação - [Write Logic Apps in C#: introducing the Logic Apps Standard SDK](https://techcommunity.microsoft.com/blog/integrationsonazureblog/write-logic-apps-in-c-introducing-the-logic-apps-standard-sdk/4524277?ref=azurebrasil.cloud): o anúncio oficial do SDK no blog do Azure Integration Services - [Create Standard workflow projects with the SDK](https://learn.microsoft.com/en-us/azure/logic-apps/standard-sdk/create-workflows-with-csharp?ref=azurebrasil.cloud): guia passo a passo para criar workflows code-first - [Logic Apps Standard SDK class library](https://learn.microsoft.com/en-us/azure/logic-apps/standard-sdk/logic-apps-standard-sdk?ref=azurebrasil.cloud): referência da biblioteca de classes - [Repositório e feedback do SDK no GitHub](https://github.com/Azure/LogicAppsUX/issues?ref=azurebrasil.cloud): onde reportar issues e pedir features durante o preview ### Comparação e custos - [Azure Logic Apps pricing](https://azure.microsoft.com/pricing/details/logic-apps/?ref=azurebrasil.cloud): detalhes do modelo Consumption (por execução) e Standard - [Single-tenant Logic Apps Standard vs. Consumption](https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare?ref=azurebrasil.cloud): quando escolher cada modelo de hospedagem E você, já estava de olho no N8N por causa do hype ou já tinha migrado seus fluxos para o Logic Apps? Me conta nos comentários se a chegada do SDK em C# muda a sua decisão. Espero que tenham curtido! \[\]s e até a próxima. ### Integrando Tailwind CSS v4 ao PrimeVue com GitHub Copilot: quando usar cada um e como garantir consistência - Parte 2 URL: https://www.azurebrasil.cloud/blog/integrando-tailwind-css-v4-ao-primevue-com-github-copilot-quando-usar-cada-um-e-como-garantir-consistencia-parte-2/ Last updated: 2026-06-30T11:57:04.000Z Na primeira parte deste [artigo](https://www.azurebrasil.cloud/blog/como-refatorar-o-seu-codigo-front-end-utilizando-github-copilot-com-instructions-agents-e-skills-especializadas-parte-1/) construímos a camada de governança do [GitHub Copilot](https://github.com/features/copilot?ref=azurebrasil.cloud) para um projeto [Vue 3](https://vuejs.org/?ref=azurebrasil.cloud) com [PrimeVue 4](https://primevue.org/?ref=azurebrasil.cloud): as `.instructions.md`, o agent especializado e a skill de criação de componentes. Nesta parte, vamos integrar o [Tailwind CSS](https://tailwindcss.com/?ref=azurebrasil.cloud) ao projeto e mostrar como os mesmos arquivos de governança que criamos antes são exatamente o que permite executar essa migração de forma segura, padronizada e sem produzir os bugs que normalmente acompanham uma mudança desse tamanho. → Sign in ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/06/image-3.png) → Create account ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/06/image-4.png) → Reset password ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/06/image-5.png) O problema de migrar um projeto que já tem um sistema de design funcionando para o [Tailwind CSS](https://tailwindcss.com/?ref=azurebrasil.cloud) é mais sutil do que parece. Sem um conjunto de regras claras, o desenvolvedor começa a duplicar responsabilidades: cores que antes vinham só de tokens do [PrimeVue](https://primevue.org/?ref=azurebrasil.cloud) passam a aparecer também em classes utilitárias do Tailwind, espaçamentos ficam definidos em dois lugares ao mesmo tempo, e componentes diferentes começam a resolver o mesmo problema de formas diferentes. O resultado é um projeto com inconsistência visual crescente, classes mortas acumulando no CSS scoped e bugs de estilo que só aparecem em breakpoints específicos. O [GitHub Copilot](https://githubcopilot.com/?ref=azurebrasil.cloud) sem governança amplifica esse problema porque ele vai imitar os padrões inconsistentes que encontrar no código. Com governança, ele faz o oposto: replica o padrão correto em cada novo componente sem precisar ser corrigido. A primeira coisa que fizemos antes de instalar qualquer pacote foi atualizar o arquivo [frontend-standards.instructions.md](https://github.com/flpdefaria/poc-frontend-ghc/tree/article-v2/.github/instructions?ref=azurebrasil.cloud) com uma nova seção chamada Hybrid Governance Rule. Essa seção define, de forma explícita, qual ferramenta é responsável por cada categoria de estilo. [Tailwind CSS](https://tailwindcss.com/?ref=azurebrasil.cloud) assume layout estrutural, espaçamentos fluidos, tipografia de conteúdo e alinhamentos responsivos. O CSS scoped com tokens do [PrimeVue](https://primevue.org/?ref=azurebrasil.cloud) mantém controle exclusivo sobre glassmorphism, box shadows com `color-mix()`, backdrop filters e qualquer override interno de componente via `:deep()`. Hardcode de cor em qualquer forma, seja em classe Tailwind ou em scoped CSS, é estritamente proibido. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2026/06/image-10.png) Imagem da seção Hybrid Governance Rule no arquivo [frontend-standards.instructions.md](https://github.com/flpdefaria/poc-frontend-ghc/blob/article-v2/.github/instructions/frontend-standards.instructions.md?ref=azurebrasil.cloud) mostrando a tabela de responsabilidades entre Tailwind CSS e Scoped CSS Essa regra gravada nas instructions tem um efeito prático imediato. Quando o [GitHub Copilot](https://githubcopilot.com/?ref=azurebrasil.cloud) abre um arquivo **.vue** para editar, ele lê as instructions e sabe que espaçamento de formulário pertence ao template como classe Tailwind, não ao ` ``` #### After (Tailwind Hybrid) ```vue ``` --- ### 2. Form Fields (Inputs, FloatLabel and Password Wrapper) Always preserve `position: relative` and width on the PrimeVue input wrapper, while the outer layout uses Tailwind. #### Before (Custom CSS) ```vue ``` #### After (Tailwind Hybrid) ```vue ``` --- ### 3. "OR" Visual Separator Use Tailwind border and flex utilities instead of manual pseudo-elements in scoped CSS. #### Before (Custom CSS) ```vue ``` #### After (Tailwind Hybrid) ```vue ``` --- ### 4. Form Card + Scoped Overrides The card keeps its Glassmorphism class (`glass-card`) via scoped CSS, but all internal spacing, width, and children are controlled by Tailwind utility classes. #### Before (Custom CSS) ```vue ``` #### After (Tailwind Hybrid) ```vue ``` --- ## Migration Quality Checklist - [ ] No padding (`p-`), margin (`m-`), gap (`gap-`), flex, or grid rules remain in `

@Model.Title

 User Id  @Model.Id
 User Name  @Model.Name
 User Age  @Model.Age
 Created At  @Model.CreatedAt
``` Devemos adicionar o seguinte trecho de código ao arquivo *App.Api.csproj*: ``` PreserveNewest ``` O serviço para criação dos *templates* está pronto. É hora de implementarmos o serviço *IEmailService* e sua implementação. ``` namespace App.Api.Services.Email; public interface IEmailService { public Task SendAsync(string to, string subject, string htmlBody); } ``` ``` using System.Net; using System.Net.Mail; namespace App.Api.Services.Email; class EmailService : IEmailService { private readonly IConfiguration _configuration; public EmailService(IConfiguration configuration) { _configuration = configuration; } public async Task SendAsync(string to, string subject, string htmlBody) { var host = _configuration.GetSection("Application:StmpHost").Value; var userName = _configuration.GetSection("Application:StmpUserName").Value; var password = _configuration.GetSection("Application:StmpPassword").Value; var from = _configuration.GetSection("Application:StmpSenderAddress").Value; var port = Convert.ToInt32(_configuration.GetSection("Application:StmpPort").Value); var enableSsl = Convert.ToBoolean(_configuration.GetSection("Application:StmpEnableSsl").Value); var smtpClient = new SmtpClient(host) { Port = port, Credentials = new NetworkCredential(userName, password), EnableSsl = enableSsl, }; var mailMessage = new MailMessage { From = new MailAddress(from!), Subject = subject, Body = htmlBody, IsBodyHtml = true, }; mailMessage.To.Add(to); await smtpClient.SendMailAsync(mailMessage); } } ``` Para abstrairmos a forma com que o corpo em HTML é gerado e o e-mail é enviado, criaremos outro serviço que servirá como um *[facade](https://tallesvaliatti.com/design-pattern-facade-5cbd7439d9c4?ref=azurebrasil.cloud).* Recomendo a leitura [desse post sobre o *facade design pattern*](https://tallesvaliatti.com/design-pattern-facade-5cbd7439d9c4?ref=azurebrasil.cloud)! ``` using App.Api.Models; namespace App.Api.Services.ApplicationEmail; public interface IApplicationEmailService { public Task SendUserCreatedEmail(string to, User user); } ``` ``` using App.Api.Models; using App.Api.Services.Email; using App.Api.Services.Template; namespace App.Api.Services.ApplicationEmail; // This is a facade service public class ApplicationEmailService : IApplicationEmailService { private readonly IEmailService _emailService; private readonly ITemplateService _templateService; public ApplicationEmailService(IEmailService emailService, ITemplateService templateService) { _emailService = emailService; _templateService = templateService; } public async Task SendUserCreatedEmail(string to, User user) { var subject = this.CreateEmailSubject(user); var htmlBody = this.CreateEmailBody(user); await _emailService.SendAsync(to, subject, htmlBody); } private string CreateEmailBody(User user) { var template = Path.Combine("Services", "Template", "Templates","UserCreatedTemplate.cshtml"); return _templateService.GetTemplateAsString(template, new { Title = $"New User - {user.Name}", Id = user.Id, Name = user.Name, Age = user.Age, CreatedAt = DateTime.UtcNow.ToString("dd/MM/yyyy - hh:mm") }); } private string CreateEmailSubject(User user) { return $"New User - {user.Name}"; } } ``` Todos os serviços foram criados. É hora de criarmos o *endpoint* dentro controladora *UserController.cs.* ``` using App.Api.Models; using App.Api.Services.ApplicationEmail; using Microsoft.AspNetCore.Mvc; namespace App.Api.Controllers; [ApiController] [Route("[controller]")] public class UserController : ControllerBase { private readonly IApplicationEmailService _applicationEmailService; public UserController(IApplicationEmailService applicationEmailService) { _applicationEmailService = applicationEmailService; } [HttpPost(Name = "AddUser")] public async Task Post(User user) { // ... // Do some things // ... // Send email to admin var adminEmail = "test@tests.com"; await _applicationEmailService.SendUserCreatedEmail(adminEmail, user); return Ok(); } } ``` Observe que os serviços são injetados via [*dependency injection*](https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection?ref=azurebrasil.cloud)*,* tanto em outros serviços, quanto na controladora acima. Precisamos ir ao arquivo *Program.cs* e configurar a injeção de dependência dos serviços criados. ``` builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); ``` Além disso, vamos adicionar algumas configurações ao *appsettings.json*: ``` "Application": { "StmpHost": "localhost", "StmpPort": "1025", "StmpEnableSsl": "false", "StmpSenderAddress": "test@mailhog.local", "StmpUserName": "user", "StmpPassword": "password" }, ``` Finalizamos o desenvolvimento da *web api*! Temos a visão geral dos aquivos criados: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-00.20.50.png) Vamos testar o projeto localmente. Vamos levantar todas as dependências por meio do arquivo *docker-compose.yaml* e executar o projeto com o comando *[dotnet run](https://learn.microsoft.com/pt-br/dotnet/core/tools/dotnet-run?ref=azurebrasil.cloud).* ``` docker compose up -d ``` ``` dotnet run ``` Vamos fazer um POST através da interface do swagger. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-00.14.04.png) Após a execução da chamada, podemos acessar a interface do *mailhog* e verificar *que* o email foi enviado corretamente. ``` http://localhost:8025 ``` ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-00.14.59.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-00.15.25.png) Tudo ocorreu conforme o planejado! É hora de criarmos o projeto de testes. Iremos criar um projeto de testes ([xUnit](https://learn.microsoft.com/pt-br/dotnet/core/testing/unit-testing-with-dotnet-test?ref=azurebrasil.cloud)) chamado *App.IntegrationTests* no diretório raiz da nossa solução. ``` dotnet new xunit -n App.IntegrationTests ``` Além disso, precisamos adicionar esse novo projeto de testes à *solution* e [adicionar a referência](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-add-reference?ref=azurebrasil.cloud) de *App.Api* ao *App.IntegrationTests*: ``` dotnet sln App.Api.sln add App.IntegrationTests/App.IntegrationTests.csproj ``` ``` dotnet add App.IntegrationTests/App.IntegrationTests.csproj reference App.Api/App.Api.csproj ``` Feito isso, já podemos adicionar os seguintes pacotes NuGet ao projeto de tests: ``` dotnet add package Microsoft.AspNetCore.Mvc.Testing --version 7.0.8 dotnet add package FluentAssertions --version 6.11.0 dotnet add package Microsoft.Extensions.DependencyInjection --version 7.0.0 ``` Precisaremos ainda adicionar uma linha de código a classe *Program.cs* do projeto *App.Api.* ``` public partial class Program { } ``` ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-11.58.43.png) Para verificarmos que os e-mails foram enviados ao *mailhog* corretamente*,* vamos criar um serviço local (no projeto *App.IntegrationTests*) chamado *ILocalEmailServerService*. ``` using App.IntegrationTests.Services.Models; namespace App.IntegrationTests.Services { public interface ILocalEmailServerService { public Task GetEmailsInfos(); public Task DeletAllAsync(); } } ``` ``` using System.Text.Json; using App.IntegrationTests.Services.Models; namespace App.IntegrationTests.Services { public class LocalEmailServerService : ILocalEmailServerService { private readonly HttpClient _client; public LocalEmailServerService() { _client = new HttpClient(); _client.BaseAddress = new Uri("http://localhost:8025"); } public async Task GetEmailsInfos() { var response = await this.GetAllEmailsAsync(); return new EmailsInfo { Total = response.Total, Subjects = response.Items! .SelectMany(x => x.Content!.Headers!.Subject!) }; } public async Task DeletAllAsync() { await _client.DeleteAsync("/api/v1/messages"); } private async Task GetAllEmailsAsync() { var resultString = await _client.GetStringAsync("/api/v2/messages?limit=50"); var result = JsonSerializer.Deserialize(resultString)!; return result; } } } ``` Temos as classes auxiliares necessárias para o serviço acima funcionar corretamente: ``` using System.Text.Json.Serialization; namespace App.IntegrationTests.Services.Models { public class Response { [JsonPropertyName("total")] public int Total { get; set; } [JsonPropertyName("count")] public int Count { get; set; } [JsonPropertyName("Start")] public int start { get; set; } [JsonPropertyName("items")] public List? Items { get; set; } } public class Item { public string? ID { get; set; } public Content? Content { get; set; } } public class Headers { public List? Subject { get; set; } } public class Content { public Headers? Headers { get; set; } public string? Body { get; set; } public int Size { get; set; } public object? MIME { get; set; } } } ``` ``` namespace App.IntegrationTests.Services.Models { public class EmailsInfo { public int Total { get; set; } public IEnumerable Subjects { get; set; } = default!; } } ``` Precisamos implementar a classe *[CustomWebAppli](https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-7.0&ref=azurebrasil.cloud#customize-webapplicationfactory)[cationFactory](https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-7.0&ref=azurebrasil.cloud#customize-webapplicationfactory) que herda de [](https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-7.0&ref=azurebrasil.cloud#customize-webapplicationfactory)[WebApplicationFactory](https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-7.0&ref=azurebrasil.cloud#basic-tests-with-the-default-webapplicationfactory).* ``` using App.IntegrationTests.Services; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; namespace App.IntegrationTests { public class CustomWebApplicationFactory : WebApplicationFactory where TProgram : class { protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureServices(services => { services.AddSingleton(); }); builder.UseEnvironment("Development"); } } } ``` Vamos criar uma classe base para os testes de integração das controladoras (nesse caso, temos apenas uma controladora). ``` using System; using App.IntegrationTests.Services; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; namespace App.IntegrationTests { public abstract class BaseTestingController : IAsyncLifetime, IClassFixture> where T : class { protected readonly HttpClient _client; protected readonly CustomWebApplicationFactory _factory; private IServiceScope? _serviceScope; public BaseTestingController( CustomWebApplicationFactory factory) { _factory = factory; _client = factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); } public W GetRequiredService() where W : class { if (_serviceScope is null) { var scope = _factory.Services.CreateScope(); _serviceScope = scope; } return _serviceScope.ServiceProvider.GetRequiredService(); } public async Task ReinitializeEmailServerForTestsAsync() { var localEmailServerService = GetRequiredService(); await localEmailServerService.DeletAllAsync(); } public async Task DisposeAsync() { await ReinitializeEmailServerForTestsAsync(); _serviceScope?.Dispose(); } public async Task InitializeAsync() { await ReinitializeEmailServerForTestsAsync(); } } } ``` Observe que tanto ao inicializar quanto ao finalizar um teste específico, estamos chamando *ReinitializeEmailServerForTestsAsync(),* limpando a caixa de *e-mails* do servidor local. Garantindo assim, que todo teste será executado sem nenhum "lixo"remanescente de outros testes. Vamos criar a classe *UserControllerTests.cs* que herda de *BaseTestingController.* Essa classe possuirá apenas um teste de integração que realiza as seguintes tarefas: - Realiza um POST no *endpoint* *"/User";* - Verifica que a resposta da chamada foi *[OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200?ref=azurebrasil.cloud);* - Verifica que um, e apenas um, e-mail foi enviado e que esse e-mail possui o *Subject* esperado*.* ``` using System.Text; using System.Text.Json; using App.Api.Models; using App.IntegrationTests.Services; using FluentAssertions; namespace App.IntegrationTests; public class UserControllerTests : BaseTestingController { public UserControllerTests(CustomWebApplicationFactory factory) : base(factory) { } [Fact] public async Task Post_WithValidUser_ShouldReturnOkResultAndSendEmail() { // Arrange var localEmailServerService = GetRequiredService(); var url = "/User"; var user = new User("Talles Valiatti", 29); var content = new StringContent(JsonSerializer.Serialize(user), Encoding.UTF8, "application/json"); var expectedEmailSubject = $"New User - {user.Name}"; var expectedEmailCount = 1; // Act var response = await _client.PostAsync(url, content); // Assert var emailsInfo = await localEmailServerService.GetEmailsInfos(); response.EnsureSuccessStatusCode(); emailsInfo.Total.Should().Be(expectedEmailCount); emailsInfo.Subjects.Should().AllBe(expectedEmailSubject); } } ``` Temos a disposição final dos arquivos do projeto de testes de integração. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-12.46.07.png) Vamos executar e seguinte comando no projeto de testes e verificar que tudo está correto: ``` dotnet test ``` ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-12.41.56.png) Chegamos a parte final do nosso post! Precisaremos criar um [repositório](https://azure.microsoft.com/pt-br/products/devops/repos?ref=azurebrasil.cloud) no [Azure DevOps](https://azure.microsoft.com/pt-br/products/devops?ref=azurebrasil.cloud) e levar toda a nossa solução para lá. Recomendo a leitura da [documentação oficial](https://learn.microsoft.com/en-us/azure/devops/repos/git/pushing?view=azure-devops&tabs=visual-studio-2022&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-16.06.50.png) No diretório raiz do nosso projeto vamos criar o arquivo *azure-pipelines.yml* com o seguinte conteúdo: ``` trigger: - master pool: vmImage: 'ubuntu-latest' variables: buildConfiguration: 'Release' steps: - script: | docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog displayName: 'Start mailhog' - task: UseDotNet@2 inputs: version: '7.x' - task: DotNetCoreCLI@2 displayName: 'dotnet build' inputs: command: 'build' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'dotnet test' inputs: command: 'test' projects: 'App.IntegrationTests/App.IntegrationTests.csproj' arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura' - task: PublishCodeCoverageResults@1 displayName: 'Publish code coverage report' inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml' - task: DotNetCoreCLI@2 displayName: 'Create Artifact' - task: DotNetCoreCLI@2 inputs: command: publish publishWebProjects: True arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)' zipAfterPublish: True projects: 'App.Api' - task: PublishPipelineArtifact@1 displayName: 'Publish Artifact' inputs: targetPath: '$(Build.ArtifactStagingDirectory)' artifactName: 'App.Api' ``` Esse pipeline realiza as seguintes tarefas: - Criar um *container* do *mailhog;* - Configura o .NET 7 como sdk padrão; - Faz o *build* da solução*;* - Executa o teste de integração e salva o resultado; - Exporta o resultado dos testes de integração; - Exporta um arquivo Zip com os executáveis do projeto *App.Api*. Isso apenas é realizado caso todos os testes sejam realizados com sucesso. Com o pipeline pronto, podemos subir essa alteração. Além disso, precisamos criar um *pipeline.* Veja a [documentação oficial](https://learn.microsoft.com/en-us/azure/devops/pipelines/create-first-pipeline?view=azure-devops&tabs=java%2Ctfs-2018-2%2Cbrowser&ref=azurebrasil.cloud)! Com o *pipeline* pronto, podemos executá-lo. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-16.37.02.png) Observe que tudo ocorreu sem falhas, onde todos os testes passaram (apenas um) e ao final do processo, foram gerados os resultados dos testes e um [artefato](https://learn.microsoft.com/en-us/azure/devops/pipelines/artifacts/pipeline-artifacts?view=azure-devops&tabs=yaml&ref=azurebrasil.cloud) com o zip dos executáveis do projeto *App.Api*. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-16.37.30.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-16.38.14.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-27-at-16.39.22.png) Você já pode baixar o projeto por esse [](https://github.com/TallesValiatti/AnomalyDetectorUnivariateApi?ref=azurebrasil.cloud)[link](https://github.com/TallesValiatti/AzureDevOpsIntegrationTesting?ref=azurebrasil.cloud), e não esquece de me seguir no [LinkedIn](https://www.linkedin.com/in/tallesvaliatti/?ref=azurebrasil.cloud)! Até a próxima, abraços! ### Resumo Semanal #11 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-11/ Last updated: 2023-07-03T12:22:06.000Z ### Azure Updates - [Public preview: Using a common port for public and private listeners](https://azure.microsoft.com/pt-br/updates/public-preview-using-a-common-port-for-public-and-private-listeners/?ref=azurebrasil.cloud) - [Preview Updates: Azure Elastic SAN Public Preview improvements ](https://azure.microsoft.com/pt-br/updates/preview-updates-azure-elastic-san-public-preview-improvements/?ref=azurebrasil.cloud) - [Public Preview: Azure OpenAI Service On Your Data](https://azure.microsoft.com/pt-br/updates/azure-open-ai-service-on-your-data/?ref=azurebrasil.cloud) - [Public Preview: Default Rule Set 2.1 for Regional WAF with Application Gateway](https://azure.microsoft.com/pt-br/updates/preview-default-rule-set-21-for-regional-waf-with-application-gateway/?ref=azurebrasil.cloud) ### Community Updates - [Welsh Azure User Group June 2023 Meet Up!](https://jonnychipz.com/2023/06/26/welsh-azure-user-group-june-2023-meet-up/?ref=azurebrasil.cloud) - [Welsh Azure User Group - June 2023 Event](https://www.youtube.com/watch?v=0KjMfnG7FA0&ref=azurebrasil.cloud) - [Assess your cloud journey using the Cloud Adoption Strategy Evaluator](https://www.thomasmaurer.ch/2023/06/assess-your-cloud-journey-using-the-cloud-adoption-strategy-evaluator/?ref=azurebrasil.cloud) - [Set up a dev container for Terraform in GitHub Codespaces](https://www.techielass.com/set-up-a-dev-container-for-terraform-in-github-codespaces/?ref=azurebrasil.cloud) - [Terraform import blocks to import Azure resources into Terraform](https://thomasthornton.cloud/2023/06/27/terraform-import-blocks-to-import-azure-resources-into-terraform/?ref=azurebrasil.cloud) - [Automating Custom VM Image Creation with Azure Image Builder and Azure DevOps](https://www.blueboxes.co.uk/automating-custom-vm-image-creation-with-azure-image-builder-and-azure-devops?ref=azurebrasil.cloud) - [How to add AdditionalHeaders to Invoke-PnPGraphMethod?](https://www.koskila.net/how-to-add-additionalheaders-to-invoke-pnpgraphmethod/?ref=azurebrasil.cloud) - [The 0x800705B4 error in our stars](https://call4cloud.nl/2023/06/the-0x800705b4-error-in-our-stars/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=the-0x800705b4-error-in-our-stars) - [Using WSL and Let's Encrypt to create Azure App Service SSL Wildcard Certificates](https://www.hanselman.com/blog/using-wsl-and-lets-encrypt-to-create-azure-app-service-ssl-wildcard-certificates?ref=azurebrasil.cloud) - [Azure Container Storage solution - Change how you architect and manage durable storage](https://www.youtube.com/watch?v=mXH7FUIfoMs&ref=azurebrasil.cloud) - [Playing with Bing Chat](https://www.youtube.com/watch?v=eWK%5Fa0lGCCg&ref=azurebrasil.cloud) - [Azure Infrastructure Weekly Update - 30th June 2023](https://www.youtube.com/watch?v=O7p1Jse1W8c&ref=azurebrasil.cloud) - [Azure Chaos Studio](https://www.youtube.com/watch?v=IkEQm6m46Ow&ref=azurebrasil.cloud) - [ClickOps over GitOps](https://www.youtube.com/watch?v=3paDTrHE3pY&ref=azurebrasil.cloud) - [Dot NET Notts - June 2023](https://www.youtube.com/watch?v=6hhMtnNpt50&ref=azurebrasil.cloud) - [1st WorkplaceDudes Meetup was a success!](https://www.burgerhout.org/1st-workplacedudes-meetup-was-a-success/?ref=azurebrasil.cloud) - [What are Azure Policy Overrides?](https://www.georgeollis.com/what-are-azure-policy-overrides/?ref=azurebrasil.cloud) - [3 Methods To Fix Corrupted PST Files In Outlook](https://charbelnemnom.com/3-methods-to-fix-corrupted-pst-files-in-outlook/?ref=azurebrasil.cloud) - [Download all the Azure Icons for Free!](https://www.ciraltos.com/download-all-the-azure-icons-for-free/?ref=azurebrasil.cloud) ### Resumo Semanal #10 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-10/ Last updated: 2023-06-26T12:45:58.000Z ### Azure Updates - [Generally Available: Azure Cosmos DB to Azure Data Explorer Synapse Link](https://azure.microsoft.com/pt-br/updates/cosmos-db-adx-synapse-link-ga/?ref=azurebrasil.cloud) - [Generally available: Azure Premium SSD v2 Disk Storage in Southeast Asia, UK South, South Central US and West US 3](https://azure.microsoft.com/pt-br/updates/generally-available-azure-premium-ssd-v2-disk-storage-in-southeast-asia-uk-south-south-central-us-and-west-us-3/?ref=azurebrasil.cloud) - [General availability: Introducing DropMappedField transformation for data mappings in Azure Data Explorer](https://azure.microsoft.com/pt-br/updates/adx-data-mappings-dropmappedfield/?ref=azurebrasil.cloud) - [General Availability: Azure Sphere version 23.05](https://azure.microsoft.com/pt-br/updates/general-availability-azure-sphere-version-2305/?ref=azurebrasil.cloud) - [Public Preview: Network Observability add-on on AKS ](https://azure.microsoft.com/pt-br/updates/network-observability-add-on/?ref=azurebrasil.cloud) ### Community Updates - [Onwards and Upwards](https://clouddevdan.co.uk/onwards-and-upwards?ref=azurebrasil.cloud) - [Welsh Azure User Group June 2023 Meet Up!](https://jonnychipz.com/2023/06/26/welsh-azure-user-group-june-2023-meet-up/?ref=azurebrasil.cloud) - [Welsh Azure User Group - June 2023 Event](https://www.youtube.com/watch?v=0KjMfnG7FA0&ref=azurebrasil.cloud) - [Azure Stack HCI – The Dell APEX Cloud Platform for Microsoft Azure](https://www.thomasmaurer.ch/2023/06/azure-stack-hci-the-dell-apex-cloud-platform-for-microsoft-azure/?ref=azurebrasil.cloud) - [Ask me anything (AMA) Microsoft Azure training, certifications, and cloud computing career](https://www.thomasmaurer.ch/2023/06/ask-me-anything-ama-microsoft-azure-training-certifications-and-cloud-computing-career/?ref=azurebrasil.cloud) - [Getting started with GitHub Codespaces](https://www.techielass.com/getting-started-with-github-codespaces/?ref=azurebrasil.cloud) - [How to iterate through a collection of items in a Parallel Foreach loop in PowerShell?](https://www.koskila.net/how-to-iterate-through-a-collection-of-items-in-a-parallel-foreach-loop-in-powershell/?ref=azurebrasil.cloud) - [A Guide to Recognizing Your Post Authentication Actions](https://call4cloud.nl/2023/06/a-guide-to-recognizing-your-post-authentication-actions/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=a-guide-to-recognizing-your-post-authentication-actions) - [T-SQL Tuesday 163 – Best piece of career advice ever received](https://www.kevinrchant.com/2023/06/20/t-sql-tuesday-163-best-piece-of-career-advice-ever-received/?ref=azurebrasil.cloud) - [Posts](https://samcogan.com/post/?ref=azurebrasil.cloud) - [Upgrade to Version 2 of the Pulumi Azure Native Provider](https://samcogan.com/upgrade-to-version-2-of-the-pulumi-azure-provider/?ref=azurebrasil.cloud) - [How to Fix OOMKilled Kubernetes Error (Exit Code 137)](https://itnext.io/how-to-fix-oomkilled-kubernetes-error-exit-code-137-88352410f0d4?source=rss-f8c0d8b1b817------2) - [Create an EC2 instance on AWS with Terraform](https://itnext.io/create-an-ec2-instance-on-aws-with-terraform-173318ca1b8e?source=rss-f8c0d8b1b817------2) - [What is Kubernetes Load Balancer?](https://itnext.io/what-is-kubernetes-load-balancer-4f65a8294f5f?source=rss-f8c0d8b1b817------2) - [What is BareMetal Infrastructure on Azure?](https://www.youtube.com/watch?v=-2NXqnFH6JY&ref=azurebrasil.cloud) - [Azure Infrastructure Weekly Update - 23rd June 2023](https://www.youtube.com/watch?v=cDFWolfY%5FcY&ref=azurebrasil.cloud) - [Azure Container Storage solution - Change how you architect and manage durable storage](https://www.youtube.com/watch?v=mXH7FUIfoMs&ref=azurebrasil.cloud) - [Synapse PII Data Masking with Cognitive Services - Part 2](https://www.youtube.com/watch?v=fBEBze%5FND60&ref=azurebrasil.cloud) - [Synapse PII Data Masking with Cognitive Services](https://www.youtube.com/watch?v=qvnwcnXuqbs&ref=azurebrasil.cloud) - [Azure Management Groups not displaying in the Azure Portal](https://luke.geek.nz/azure/Management-Groups-not-displaying-AzurePortal/?ref=azurebrasil.cloud) - [Using Azure Bastion in Azure Virtual WAN](https://www.georgeollis.com/using-azure-bastion-in-azure-virtual-wan/?ref=azurebrasil.cloud) - [5 Methods To Fix 0x8004010F Error In Outlook](https://charbelnemnom.com/5-methods-to-fix-0x8004010f-error-in-outlook/?ref=azurebrasil.cloud) - [Tweet a Random Blog Post From RSS Feed Using Azure Functions](https://charbelnemnom.com/tweet-a-random-blog-post-from-rss-feed/?ref=azurebrasil.cloud) - [Export Azure AD (Entra) logs](https://azvise.com/2023/06/21/export-azure-ad-entra-logs/?ref=azurebrasil.cloud) - [Troubleshoot Network Security Groups with Azure Network Watcher NSG Diagnostics](https://www.ciraltos.com/troubleshoot-network-security-groups-with-azure-network-watcher-nsg-diagnostics/?ref=azurebrasil.cloud) ### Azure SQL + Managed Identities = Autenticação sem usuário e senha URL: https://www.azurebrasil.cloud/blog/azure-sql-managed-identities-autenticacao-sem-usuario-e-senha/ Last updated: 2023-06-27T14:40:06.000Z Olá, Já imaginou um cenário aonde pudéssemos gerenciar os acessos ao banco de dados da nossa aplicação sem precisa ficar especificando usuário e senha em strings de conexão? Ou precisar alterar a senha de algum usuário de aplicação por que alguém foi mandado embora? Esse cenário já é possível no Azure SQL utilizando Identidades Gerenciadas no Azure AD. **Um pequeno aviso antes de irmos para a parte legal!** Existem outras maneiras de garantirmos segurança nas nossas aplicações, especialmente utilizando a integração com o Azure Key Vault que nos permite guardar informações de maneira confidencial, mas meu ponto nesse post é mostrar de forma simples e prática como aumentar a segurança do nosso banco sem nos preocuparmos com gerenciamento de senhas. > EDIT: 2023-06-27: Fiz um vídeo tutorial com o mesmo tema ### Criando seu Banco de Dados Para esse post criei um novo Azure SQL do zero, mas as configurações podem ser aplicadas em um banco já existente. O primeiro passo é garantirmos que não vamos aceitar autenticação SQL tradicional (com usuário e senha), iremos aceitar apenas autenticação pelo Azure AD ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-17.png) Após selecionado o método de autenticação, selecione um usuário que seja o ADMIN do banco de dados, no meu caso estou utilizando meu próprio usuário para ser o usuário principal. Essa configuração seria o equivalente a definir qual usuário teria os mesmos privilégios da conta "sa" no Sql Server. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-20.png) Poderíamos aumentar ainda mais a segurança restringindo o acesso somente via Private Endpoint e colocando nosso banco em uma VNet, mas para mantermos a simplicidade e o objetivo do artigo iremos manter a opção de termos um endpoint público. Habilitei também o acesso via serviços do Azure (nosso App Service precisa dessa opção habilitada para acessar o Sql sem estar dentro de uma VNet) e também adicionei meu IP para poder testar via Management Studio. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-22.png) Por fim, criei o banco utilizando o exemplo de "Sales" do Azure para poder ter dados para testar na aplicação. Após o banco criado podemos testar a conexão pelo Management Studio utilizando a opção de autenticação "Azure Active Directory - Universal with MFA", ao tentar conectar, se não houver conexão prévia, o Management Studio irá solicitar autenticação e fará cache do token. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-23.png) Uma vez que nosso usuário foi autenticado podemos gerenciar todos os aspectos do nosso banco, incluir ou remover usuários, mudar configurações e executar nossas queries. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-24.png) ### Testando a aplicação Localmente Pronto! Agora que temos nosso servidor Azure SQL configurado podemos testar o fluxo de autenticação via máquina de desenvolvimento. Todo o código utilizado esta no github no link: [GitHub - rsantosdev/appservice-azuresql-nouserorpassword: Sample code to test Azure Sql authentication with Managed IdentitySample code to test Azure Sql authentication with Managed Identity - GitHub - rsantosdev/appservice-azuresql-nouserorpassword: Sample code to test Azure Sql authentication with Managed Identity![](https://github.com/fluidicon.png)GitHubrsantosdev![](https://opengraph.githubassets.com/e1fae80240b4bcf111e27bd5cce060454ba1bab37292ed4e857d66bb6ca99472/rsantosdev/appservice-azuresql-nouserorpassword)](https://github.com/rsantosdev/appservice-azuresql-nouserorpassword?ref=azurebrasil.cloud) O único ponto que muda para o fluxo de desenvolvimento normal utilizando usuário e senha é justamente a forma de autenticação na string de conexão, devemos utilizar o padrão a seguir: ``` Server=seu-servidor.database.windows.net;Authentication=Active Directory Default;Initial Catalog=seu-banco; ``` No exemplo estou utilizando Dapper, mas mesmo que você estiver usando EntityFramework Core o importante é utilizarmos o pacote **Microsoft.Data.SqlClient** para acesso ao banco, ele já possui a lógica necessária para ligar com tokens de autenticação no Azure AD. Antes de executar o código garanta que seu Visual Studio/VSCode/AZ CLI estejam autenticados com um usuário que tenha acesso ao banco, casso contrário você pode encontrar o erro **"SqlException: Login failed for user '<>'. The server is not currently configured to accept this token."** ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-25.png) Código executado com sucesso. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-26.png) Erro apresentado se o Visual Studio não estiver autenticado. ### Configurando o App Service Agora estamos quase lá, já temos nosso servidor Azure SQL configurado e garantimos que a aplicação está funcionando (ao menos na minha máquina está rodando... auhauhuah) O próximo passo é criar um App Service no Azure para hospedar nossa aplicação, nesse post não irei abordar a criação. Mas no meu caso, utilizei as configurações default, baixei o publish settings e fiz o deploy direto da minha máquina. A única configuração que precisamos fazer é criarmos uma identidade gerenciada para o nosso App Service e dar acesso para ela no Azure SQL. Uma vez criado o App Service vá à opção Identity no portal, habilite na aba System assigned e salve. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-27.png) Por padrão o nome da identidade gerada será o mesmo nome do seu app service, iremos precisar desse nome para rodarmos o script a seguir, esse script irá criar um usuário com permissões básicas no banco de dados e dessa forma conseguiremos executar nossa aplicação. ```sql CREATE USER [] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER []; ALTER ROLE db_datawriter ADD MEMBER []; ALTER ROLE db_ddladmin ADD MEMBER []; GO ``` Com tudo configurado agora podemos executar nossa aplicação no Azure sem precisar especificar nenhum usuário ou senha para conectarmos no banco de dados. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-28.png) Espero que tenham gostado. \[\]s e até o próximo post! ### Resumo Semanal #9 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-9/ Last updated: 2023-06-20T14:04:05.000Z ### Azure Updates - [General availability of Azure Front Door integration with managed identities](https://azure.microsoft.com/pt-br/updates/general-availability-of-azure-front-door-integration-with-managed-identities/?ref=azurebrasil.cloud) - [Available: Reduced pricing for Azure Video Indexer](https://azure.microsoft.com/pt-br/updates/available-reduced-pricing-for-azure-video-indexer/?ref=azurebrasil.cloud) - [General availability: 32 TB storage in Azure Database for PostgreSQL - Flexible Server](https://azure.microsoft.com/pt-br/updates/general-availability-32-tb-storage-in-azure-database-for-postgresql-flexible-server-3/?ref=azurebrasil.cloud) - [New Instance Types for Azure Red Hat OpenShift are now available](https://azure.microsoft.com/pt-br/updates/new-instance-types-for-azure-red-hat-openshift-are-now-available/?ref=azurebrasil.cloud) - [Public Preview: Redis extension for Azure Functions ](https://azure.microsoft.com/pt-br/updates/public-preview-redis-extension-for-azure-functions/?ref=azurebrasil.cloud) - [General availability: Azure Cache for Redis with Web App Marketplace offer](https://azure.microsoft.com/pt-br/updates/general-availability-azure-cache-for-redis-with-web-app-marketplace-offer/?ref=azurebrasil.cloud) - [Microsoft Azure Load Testing supports setting up quick start tests using requests per second](https://azure.microsoft.com/pt-br/updates/microsoft-azure-load-testing-supports-setting-up-quick-start-tests-using-requests-per-second/?ref=azurebrasil.cloud) - [Generally Available: Azure Monitor Alert resources now visible in the Azure portal](https://azure.microsoft.com/pt-br/updates/generally-available-azure-monitor-alert-resources-now-visible-in-the-azure-portal/?ref=azurebrasil.cloud) - [Generally available: Zone Redundant Storage for Azure Disks is now available in Japan East and Korea Central](https://azure.microsoft.com/pt-br/updates/generally-available-zone-redundant-storage-for-azure-disks-is-now-available-in-japan-east-and-korea-central/?ref=azurebrasil.cloud) - [Azure SQL—General availability updates for mid-June 2023](https://azure.microsoft.com/pt-br/updates/azure-sql-general-availability-updates-for-midjune-2023/?ref=azurebrasil.cloud) - [Public preview: Power BI integration with Azure Database for PostgreSQL – Flexible Server](https://azure.microsoft.com/pt-br/updates/public-preview-power-bi-integration-with-azure-database-for-postgresql-flexible-server/?ref=azurebrasil.cloud) - [GA: Application Insights Distributed tracing support for Java Function Apps ](https://azure.microsoft.com/pt-br/updates/ga-application-insights-distributed-tracing-support-for-java-function-apps/?ref=azurebrasil.cloud) - [Generally Available: Azure VMware Solution Stretched Clusters with Customer-Managed Keys ](https://azure.microsoft.com/pt-br/updates/generally-available-azure-vmware-solution-stretched-clusters-with-customermanaged-keys-2/?ref=azurebrasil.cloud) - [General availability: Read replica HA enabled Azure Database for MySQL - Flexible Server ](https://azure.microsoft.com/pt-br/updates/general-availability-read-replica-ha-enabled-azure-database-for-mysql-flexible-server/?ref=azurebrasil.cloud) - [Public Preview: Azure Data Explorer bindings for Azure Functions ](https://azure.microsoft.com/pt-br/updates/public-preview-azure-data-explorer-bindings-for-azure-functions-2/?ref=azurebrasil.cloud) - [Public Preview: Azure Cosmos DB Vercel integration](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cosmos-db-vercel-integration/?ref=azurebrasil.cloud) - [Public preview: Azure Cache for Redis trigger for Azure Functions](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cache-for-redis-trigger-for-azure-functions-2/?ref=azurebrasil.cloud) - [Azure HDinsight Spark 2.4 approaching EOL](https://azure.microsoft.com/pt-br/updates/azure-hdinsight-spark-24-approaching-eol/?ref=azurebrasil.cloud) - [Generally Available: Managed identity authentication in Azure Monitor container insights](https://azure.microsoft.com/pt-br/updates/generally-available-managed-identity-authentication-in-azure-monitor-container-insights/?ref=azurebrasil.cloud) - [Generally available: Pgvector extension on Azure Cosmos DB for PostgreSQL](https://azure.microsoft.com/pt-br/updates/generally-available-pgvector-extension-on-azure-cosmos-db-for-postgresql/?ref=azurebrasil.cloud) - [Microsoft Azure Load Testing - configure auto stop criteria](https://azure.microsoft.com/pt-br/updates/microsoft-azure-load-testing-configure-auto-stop-criteria/?ref=azurebrasil.cloud) - [General availability: Poland Central region added to Azure HDInsight](https://azure.microsoft.com/pt-br/updates/general-availability-poland-central-region-added-to-azure-hdinsight/?ref=azurebrasil.cloud) - [Microsoft Azure Load Testing - additional Azure components for server-side monitoring](https://azure.microsoft.com/pt-br/updates/microsoft-azure-load-testing-additional-azure-components-for-serverside-monitoring/?ref=azurebrasil.cloud) - [Azure HDInsight for Apache Spark 3.3 is now available for public preview](https://azure.microsoft.com/pt-br/updates/azure-hdinsight-for-apache-spark-33-is-now-available-for-public-preview/?ref=azurebrasil.cloud) - [ Enhanced autoscale capabilities added to HDInsight clusters](https://azure.microsoft.com/pt-br/updates/enhanced-autoscale-capabilities-added-to-hdinsight-clusters/?ref=azurebrasil.cloud) - [Public preview: Custom Image Templates for Azure Virtual Desktop](https://azure.microsoft.com/pt-br/updates/public-preview-custom-image-templates-for-azure-virtual-desktop/?ref=azurebrasil.cloud) - [Public Preview: Azure Cache for Redis now supports up to 30 shards](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cache-for-redis-now-supports-up-to-30-shards/?ref=azurebrasil.cloud) - [Public preview: Add-on and node image in AKS release tracker ](https://azure.microsoft.com/pt-br/updates/public-preview-addon-and-node-image-in-aks-release-tracker-2/?ref=azurebrasil.cloud) - [General availability: Troubleshooting guides for Azure Database for PostgreSQL - Flexible Server ](https://azure.microsoft.com/pt-br/updates/general-availability-troubleshooting-guides-for-azure-database-for-postgresql-flexible-server/?ref=azurebrasil.cloud) - [Public Preview: App Service support for .NET 8](https://azure.microsoft.com/pt-br/updates/public-preview-app-service-support-for-net-8/?ref=azurebrasil.cloud) - [Public preview: Confidential Virtual Machines (VM) support in Azure Virtual Desktop](https://azure.microsoft.com/pt-br/updates/public-preview-confidential-virtual-machines-vm-support-in-azure-virtual-desktop/?ref=azurebrasil.cloud) - [Generally available: Azure Monitor container insights for AKS cluster with ARM64 nodes](https://azure.microsoft.com/pt-br/updates/generally-available-azure-monitor-container-insights-for-aks-cluster-with-arm64-nodes/?ref=azurebrasil.cloud) - [General Availability: Online migrations for Azure Database for MySQL instances](https://azure.microsoft.com/pt-br/updates/general-availability-online-migrations-for-azure-database-for-mysql-instances/?ref=azurebrasil.cloud) - [General availability: MySQL extension for Azure Data Studio](https://azure.microsoft.com/pt-br/updates/general-availability-mysql-extension-for-azure-data-studio/?ref=azurebrasil.cloud) - [General availability: Query performance insights for Azure Database for PostgreSQL – Flexible Server](https://azure.microsoft.com/pt-br/updates/general-availability-query-performance-insights-for-azure-database-for-postgresql-flexible-server/?ref=azurebrasil.cloud) - [Public preview: Introducing NGads V620 Series VMs optimized for cloud gaming ](https://azure.microsoft.com/pt-br/updates/public-preview-introducing-ngads-v620-series-vms-optimized-for-cloud-gaming/?ref=azurebrasil.cloud) - [Azure Virtual Desktop Insights Powered by the Azure Monitor Agent](https://azure.microsoft.com/pt-br/updates/public-preview-azure-virtual-desktop-insights-powered-by-the-azure-monitor-agent/?ref=azurebrasil.cloud) - [Public Preview: GraphQL resolvers for Azure Cosmos DB, Azure SQL in Azure API Management ](https://azure.microsoft.com/pt-br/updates/public-preview-graphql-resolvers-for-azure-cosmos-db-azure-sql-in-azure-api-management/?ref=azurebrasil.cloud) - [Azure VMware Solution now available in North Switzerland](https://azure.microsoft.com/pt-br/updates/azure-vmware-solution-now-available-in-north-switzerland/?ref=azurebrasil.cloud) - [Public preview: Assess impact of service retirements using new workbook template in Azure Advisor](https://azure.microsoft.com/pt-br/updates/public-preview-assess-impact-of-service-retirements-workbook-template-in-azure-advisor/?ref=azurebrasil.cloud) - [General availability: Azure HBv4 Virtual Machines for HPC ](https://azure.microsoft.com/pt-br/updates/general-availability-azure-hbv4-virtual-machines-for-hpc/?ref=azurebrasil.cloud) - [General availability: Azure HX Virtual Machines for HPC ](https://azure.microsoft.com/pt-br/updates/general-availability-azure-hx-virtual-machines-for-hpc/?ref=azurebrasil.cloud) - [Public Preview: Azure NetApp Files Availability zone volume placement enhancement – Populate existing volume](https://azure.microsoft.com/pt-br/updates/public-preview-azure-netapp-files-availability-zone-volume-placement-enhancement-populate-existing-volume/?ref=azurebrasil.cloud) - [General availability: Azure Event Hubs SDK for Go](https://azure.microsoft.com/pt-br/updates/general-availability-azure-event-hubs-sdk-for-go/?ref=azurebrasil.cloud) - [General availability: Azure Blob Storage SDK for Go](https://azure.microsoft.com/pt-br/updates/general-availability-azure-blob-storage-sdk-for-go/?ref=azurebrasil.cloud) - [General availability: Azure Queue Storage SDK for Go](https://azure.microsoft.com/pt-br/updates/general-availability-azure-queue-storage-sdk-for-go/?ref=azurebrasil.cloud) - [Public Preview: IT Service Management Connector (ITSMC) is now certified with ServiceNow Utah version](https://azure.microsoft.com/pt-br/updates/public-preview-it-service-management-connector-itsmc-is-now-certified-with-servicenow-utah-version/?ref=azurebrasil.cloud) - [Generally Available: Azure Cosmos DB to Azure Data Explorer Synapse Link](https://azure.microsoft.com/pt-br/updates/cosmos-db-adx-synapse-link-ga/?ref=azurebrasil.cloud) ### Community Updates - [Outstanding Contribution to Microsoft Coummunity – Global Winner](https://gregorsuttie.com/2023/06/15/outstanding-contribution-to-microsoft-coummunity-global-winner/?ref=azurebrasil.cloud) - [Azure Cloud management in the Cloud Adoption Framework](https://www.thomasmaurer.ch/2023/06/azure-cloud-management-in-the-cloud-adoption-framework/?ref=azurebrasil.cloud) - [Windows Server Summit 2022: Modernize your Apps with Windows Containers and AKS](https://www.thomasmaurer.ch/2023/06/windows-server-summit-2022-modernize-your-apps-with-windows-containers-and-aks/?ref=azurebrasil.cloud) - [Azure Stack HCI – The Dell APEX Cloud Platform for Microsoft Azure](https://www.thomasmaurer.ch/2023/06/azure-stack-hci-the-dell-apex-cloud-platform-for-microsoft-azure/?ref=azurebrasil.cloud) - [Using Azure Export for Terraform to import existing Azure resources into Terraform](https://www.techielass.com/using-azure-export-for-terraform-to-import-existing-azure-resources-into-terraform/?ref=azurebrasil.cloud) - [Getting started with GitHub Codespaces](https://www.techielass.com/getting-started-with-github-codespaces/?ref=azurebrasil.cloud) - [Terraform error Insufficient features blocks](https://thomasthornton.cloud/2023/06/16/terraform-error-insufficient-features-blocks/?ref=azurebrasil.cloud) - [How to fix “yo : The term ‘yo’ is not recognized as the name of a cmdlet, function, script file, or operable program.” error?](https://www.koskila.net/how-to-fix-yo-the-term-yo-is-not-recognized-as-the-name-of-a-cmdlet-function-script-file-or-operable-program-error/?ref=azurebrasil.cloud) - [How to iterate through a collection of items in a Parallel Foreach loop in PowerShell?](https://www.koskila.net/how-to-iterate-through-a-collection-of-items-in-a-parallel-foreach-loop-in-powershell/?ref=azurebrasil.cloud) - [The Infernal MMP-C Discovery](https://call4cloud.nl/2023/06/the-infernal-mmp-c-discovery/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=the-infernal-mmp-c-discovery) - [Why is Microsoft Fabric complaining about my Azure AD tenant location?](https://jussiroine.com/2023/06/why-is-microsoft-fabric-complaining-about-my-azure-ad-tenant-location/?ref=azurebrasil.cloud) - [Testing Terraform Import in v.1.5.0+ with Azure Resources](https://jakewalsh.co.uk/testing-terraform-import-in-v-1-5-0-with-azure-resources/?ref=azurebrasil.cloud) - [Create your own Microsoft Fabric environment](https://www.kevinrchant.com/2023/06/13/create-your-own-microsoft-fabric-environment/?ref=azurebrasil.cloud) - [T-SQL Tuesday 163 – Best piece of career advice ever received](https://www.kevinrchant.com/2023/06/20/t-sql-tuesday-163-best-piece-of-career-advice-ever-received/?ref=azurebrasil.cloud) - [Avoid Terraform and Azure Function Application Settings Drift](https://jeffbrown.tech/terraform-function-application-settings/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=terraform-function-application-settings) - [How to Fix OOMKilled Kubernetes Error (Exit Code 137)](https://itnext.io/how-to-fix-oomkilled-kubernetes-error-exit-code-137-88352410f0d4?source=rss-f8c0d8b1b817------2) - [Trusting Your Co-Pilot](https://www.youtube.com/watch?v=7zT%5FT5TtZqs&ref=azurebrasil.cloud) - [Azure Infrastructure Weekly Update - 16th June 2023](https://www.youtube.com/watch?v=xtO%5Fo6Al8TY&ref=azurebrasil.cloud) - [What is BareMetal Infrastructure on Azure?](https://www.youtube.com/watch?v=-2NXqnFH6JY&ref=azurebrasil.cloud) - [Synapse PII Data Masking with Cognitive Services](https://www.youtube.com/watch?v=qvnwcnXuqbs&ref=azurebrasil.cloud) - [The BitLocker HAADJ Nightmare](https://www.burgerhout.org/the-bitlocker-haadj-nightmare/?ref=azurebrasil.cloud) - [Looking at Azure Policy resource selectors](https://www.georgeollis.com/azure-policy-resource-selectors/?ref=azurebrasil.cloud) - [CloudOps: An Engineer’s Guide](https://charbelnemnom.com/cloudops-an-engineers-guide/?ref=azurebrasil.cloud) - [5 Methods To Fix 0x8004010F Error In Outlook](https://charbelnemnom.com/5-methods-to-fix-0x8004010f-error-in-outlook/?ref=azurebrasil.cloud) - [Network Packet Capture in Azure with Network Watcher and Wireshark](https://www.ciraltos.com/network-packet-capture-in-azure-with-network-watcher-and-wireshark/?ref=azurebrasil.cloud) - [Azure Bicep Native Parameter Files](https://www.youtube.com/watch?v=AMOj5-puoGI&ref=azurebrasil.cloud) ### Como utilizar o Azure Resource Graph REST API URL: https://www.azurebrasil.cloud/blog/como-utilizar-o-azure-resource-graph-api/ Last updated: 2023-06-16T18:47:53.000Z Neste post, iremos consumir a [API do Azure Resource Graph](https://learn.microsoft.com/en-us/rest/api/azure-resourcegraph/?ref=azurebrasil.cloud) por meio de uma aplicação [Blazor](https://learn.microsoft.com/en-my/aspnet/core/blazor/?WT.mc%5Fid=dotnet-35129-website&view=aspnetcore-7.0&ref=azurebrasil.cloud). A chamada a API irá retornar as [regiões do Azure](https://azure.microsoft.com/en-us/explore/global-infrastructure/geographies/?ref=azurebrasil.cloud#overview) em que a [*subscription*](https://techcommunity.microsoft.com/t5/azure/understanding-azure-account-subscription-and-directory/td-p/34800?ref=azurebrasil.cloud#:~:text=An%20Azure%20subscription%20is%20a,the%20subscription%20it%20belongs%20to.) selecionada possui recursos de nuvem, junto com suas respectivas quantidades. Para que isso seja possível, iremos implementar a autenticação do aplicativo web com a ajuda do Azure AD. Nosso web app possuirá duas partes: *server* e *client.* Sobre o Azure AD, eu já escrevi [alguns artigos](https://tallesvaliatti.com/como-proteger-suas-aplica%C3%A7%C3%B5es-com-o-microsoft-identity-platform-parte-1-6375adb44995?ref=azurebrasil.cloud) sobre essa ferramenta. Recomendo a leitura! Vamos criar o [registro de aplicativo para a parte do *server*](https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-protected-web-api-overview?ref=azurebrasil.cloud) no nosso Azure AD. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1024.png) Para que o *server* faça a chamada ao Azure Resource Graph em nome do usuário logado (no *client*), precisaremos criar um [*secret*](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app?ref=azurebrasil.cloud#add-a-client-secret)para esse registro de aplicativo. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1025-1.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-05-31-at-09.21.png) Como mencionado anteriormente, o *server* irá fazer a chamada a uma API protegida do Azure, por isso será necessário adicionar o *[user\_impersonation scope](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-access-web-apis?ref=azurebrasil.cloud#add-permissions-to-access-your-web-api)* por meio do menu "*API permissions*". ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1026.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1027.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1028.png) Além disso, vamos [consentir](https://learn.microsoft.com/en-us/azure/active-directory/develop/application-consent-experience?ref=azurebrasil.cloud) (*[admin consent](https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/grant-admin-consent?pivots=portal&ref=azurebrasil.cloud)*) essa permissão para os todos os usuários da nossa *tenant.* Para finalizar, devemos [criar um *scope*](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-expose-web-apis?ref=azurebrasil.cloud)para que outros registros de aplicativos possam pedir [autorização para consumir](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-access-web-apis?ref=azurebrasil.cloud) a nossa aplicação "*app-server-api*"*.* ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1030.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1031-1.png) Vamos agora criar o registro de aplicativo para o *client.* Como iremos utilizar o blazor como *client,* devemos prover uma *[redirect URI](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app?ref=azurebrasil.cloud#add-a-redirect-uri).* ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1032.png) Com o registro criado, podemos ir ao menu "*API permissions*" e adicionar a permissão (*scope*) criada na etapa anterior, a "*Access.Server".* ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1034--1-.png) Dessa forma, quando o usuário acessar o *client* pela primeira vez, a página de *login* do Azure AD irá perguntar se o usuário permite que o *client* acesse o *Access.Server scope* em seu nome. Com os dados prontos, já podemos criar o projeto blazor. Vale a pena dar uma lida na documentação oficial para entender melhor sobre os parâmetros do comando abaixo. ``` dotnet new blazorwasm -au SingleOrg \ --api-client-id "{SERVER API APP CLIENT ID}" \ --app-id-uri "{SERVER API APP ID URI GUID}" \ --client-id "{CLIENT APP CLIENT ID}" \ --default-scope "{DEFAULT SCOPE}" \ --domain "{TENANT DOMAIN}" \ -ho -o {PROJECT NAME} \ --tenant-id "{TENANT ID}" ``` Toda a parte de configuração da autenticação foi finalizada, vamos preparar agora a chamada à API do Azure Resource Graph. Iremos inicialmente criar os modelos retornados pela API dentro do projeto *Shared*. ``` using System.Text.Json.Serialization; namespace ResourceGraphApp.Shared; public class Content { [JsonPropertyName("location")] public string Location { get; set; } = default!; [JsonPropertyName("qtd")] public int Qtd { get; set; } } public class CloudRegion { [JsonPropertyName("totalRecords")] public int TotalRecords { get; set; } [JsonPropertyName("count")] public int Count { get; set; } [JsonPropertyName("data")] public List Data { get; set; } = default!; [JsonPropertyName("facets ")] public List Facets { get; set; } = default!; [JsonPropertyName("resultTruncated")] public string ResultTruncated { get; set; } = default!; } ``` ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-12-at-17.15.35.png) No projeto *server*, vamos criar a controladora *CloudResourcesController* com o seguinte conteúdo: ``` using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Identity.Web; using Microsoft.Identity.Web.Resource; using ResourceGraphApp.Shared; namespace ResourceGraphApp.Server.Controllers; [Authorize] [ApiController] [Route("[controller]")] [RequiredScope(RequiredScopesConfigurationKey = "AzureAd:Scopes")] public class CloudResourcesController : ControllerBase { private readonly IDownstreamWebApi _downstreamWebApi; public CloudResourcesController(IDownstreamWebApi downstreamWebApi) { _downstreamWebApi = downstreamWebApi; } [HttpGet] [AuthorizeForScopes(ScopeKeySection = "ResourceGraphAPI:Scopes")] public async Task GetAsync() { var value = await _downstreamWebApi.PostForUserAsync( "ResourceGraphAPI", "/providers/Microsoft.ResourceGraph/resources?api-version=2021-03-01", new { subscriptions = new List { "3a1cf685-3342-4c07-a8f7-07bb6008e146" }, query = "Resources | summarize qtd=count() by location" }); return Ok(value); } } ``` Alguns pontos sobre essa controladora: - Possui o atributo [Authorize](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/simple?view=aspnetcore-7.0&ref=azurebrasil.cloud) que apenas permite requisições autenticadas à nossa controladora; - Possui o atributo *[RequiredScope](https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.web.resource.requiredscopeattribute?view=msal-model-dotnet-latest&ref=azurebrasil.cloud)* que permite que apenas requisições com o *Access.Server scope* ([via *appsettings.json*](https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-protected-web-api-verification-scope-app-roles?tabs=aspnetcore&ref=azurebrasil.cloud#verify-scopes-in-apis-called-on-behalf-of-users)) consentido pelo usuário; - Utiliza a interface *[IDownstreamWebApi](https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-web-api-call-api-call-api?tabs=aspnetcore&ref=azurebrasil.cloud#option-2-call-a-downstream-web-api-with-the-helper-class)* para fazer um *POST* a API do azure Resource Graph em nome do usuário logado. Toda a parte de obtenção de um novo token de acesso é feita de forma automática! Veja a [documentação oficial](https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-web-api-call-api-acquire-token?tabs=aspnetcore&ref=azurebrasil.cloud); - Fazemos a chamada a API, passando como parâmetro, a *query* em [KUSTO](https://learn.microsoft.com/pt-br/azure/data-explorer/kusto/query/?ref=azurebrasil.cloud): *"Resources | summarize qtd=count() by location".* Para configurar as requisições as *downstream* APIs em nome do usuário, precisaremos incluir no *program.cs* as extensões mostradas abaixo*:* - *EnableTokenAcquisitionToCallDownstreamApi;* - *AddDownstreamWebApi;* - AddInMemoryTokenCaches: ``` builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddDownstreamWebApi("ResourceGraphAPI", builder.Configuration.GetSection("ResourceGraphAPI")) .AddInMemoryTokenCaches(); ``` Para finalizar a parte do *server*, vamos apenas incluir uma nova seção de configuração ao *appsettings.json*, a *ResourceGraphAPI.* Basicamente estamos dizendo a URL da APIe qual os *scopes* que serão requeridos para os *access tokens* que serão gerados dentro da nossa API*.* ``` { "AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "", "TenantId": "", "ClientId": "", "Scopes": "Access.Server", "CallbackPath": "/signin-oidc", "ClientSecret": """" }, "ResourceGraphAPI": { "BaseUrl": "https://management.azure.com/", "Scopes": "https://management.azure.com/user_impersonation" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" } ``` Com isso fechamos o desenvolvimento do *server.* ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-12-at-17.19.56.png) Já na parte do *client,* vamos inicialmente criar a página *CloudRegions.razor* com o seguinte conteúdo: ``` @page "/cloudregions" @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @using ResourceGraphApp.Shared @attribute [Authorize] @inject HttpClient Http Cloud Regions

Cloud Regions

This component demonstrates fetching data from the server.

@if (_cloudRegion == null) {

Loading...

} else { @foreach (var cloudRegion in _cloudRegion.Data) { }
Region Qtd of Resources
@cloudRegion.Location @cloudRegion.Qtd
} @code { private CloudRegion? _cloudRegion; protected override async Task OnInitializedAsync() { _cloudRegion = await Http.GetFromJsonAsync("CloudResources"); } } ``` Alguns detalhes sobre essa página: - Ela é protegida pelo atributo *Authorize*; - Ela é exibida quando chamamos a [rota](https://learn.microsoft.com/en-us/aspnet/core/blazor/fundamentals/routing?view=aspnetcore-7.0&ref=azurebrasil.cloud) "*/cloudregions*"; - Faz uma requisição à controladora criada anteriormente; - Exibe os dados retornados pela chamada HTTP em uma tabela; Vamos modificar o *[MainLayout.razor](https://learn.microsoft.com/pt-br/aspnet/core/blazor/components/layouts?view=aspnetcore-7.0&ref=azurebrasil.cloud)* para que essa nova rota fique disponível no menu do web app. ``` @code { private bool collapseNavMenu = true; private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; private void ToggleNavMenu() { collapseNavMenu = !collapseNavMenu; } } ``` Feito essas modificações, podemos executar o projeto *server* com o comando *[donet run](https://learn.microsoft.com/pt-br/dotnet/core/tools/dotnet-run?ref=azurebrasil.cloud)*: ``` dotnet run ``` Com o *browser* aberto, vamos clicar em "*Log in"* e fazer o login no registro de aplicativo *(client)* criado anteriormente. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-01-at-10.22.png) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-01-at-10.22--1-.png) Caso você possua o [MFA](https://tallesvaliatti.com/habilitando-o-azure-ad-mfa-d65dffef34e3?ref=azurebrasil.cloud) configurado para sua *tenant*, ou para usuários específicos, é aqui que você utilizará essa ferramenta*.* ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Screen-Shot-2023-06-01-at-10.23.png) Como estamos acessando o web app pela primeira vez, vamos consentir que a aplicação *client* acesse a aplicação *server* em nosso nome. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1036.png) Navegando à rota "*/cloudregions",* temos o seguinte resultado! ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/Group-1035.png) Você já pode baixar o projeto por esse [](https://github.com/TallesValiatti/AnomalyDetectorUnivariateApi?ref=azurebrasil.cloud)[](https://github.com/TallesValiatti/AzureResourceGraph?ref=azurebrasil.cloud)[link](https://github.com/TallesValiatti/AzureResourceGraph/tree/main?ref=azurebrasil.cloud), e não esquece de me seguir no [LinkedIn](https://www.linkedin.com/in/tallesvaliatti/?ref=azurebrasil.cloud)! Até a próxima, abraços! ### Azure Container Instance - Hospedando um servidor SMTP para testes URL: https://www.azurebrasil.cloud/blog/azure-container-instance-hospedando-um-servidor-smtp-para-testes/ Last updated: 2023-06-16T17:25:22.000Z Ola, Você já precisou hospedar um contêiner na nuvem, mas não queria usar uma máquina virtual e não podia usar App Service, pois precisa de múltiplas portas expostas? Nesse artigo quero te mostrar como podemos usar o Azure Container Instance (ou ACI) para rodar contêineres de forma simples e prática. Um caso muito comum no dia-a-dia de desenvolvedores é enviar notificações via e-mail dos mais variados assuntos que ocorrem em uma aplicação. Geralmente usamos controles de condição e variáveis de ambiente para forçar e-mails pessoais quando estamos em ambientes de teste ou de homologação. Recentemente em um projeto acabei conhecendo o [MailHog](https://github.com/mailhog/MailHog?ref=azurebrasil.cloud) um projeto simples, mas que fornece um servidor de SMTP para testes que podemos enviar e-mails e validar os usos sem arriscar mandar e-mails para endereços verdadeiros. Edit 2023-06-16: Para quem preferir, também fiz um video na prática. ### Criando o Container Instance A criação de um Azure Container Instance é bem simples e irei descrever no passo a passo a seguir: 1. Selecione a opção Criar na lista de Container Instance do Azure ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-9.png) 2\. Preencha as informações de Assinatura e grupo de recurso, as informações mais importantes aqui são o Image Source e o Size. Para o Image Source selecione a opção "Other Registry" e defina a imagem como "mailhog/mailhog". Para a opção size como é um contêiner bem leve iremos manter no minimo, com 1 vCpu e 1.5GB de memória. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-10.png) 3\. Aqui é a parte mais importante, precisamos definir a rede como pública e expor as portas do nosso contêiner: ⁣ 1025 - para envio dos e-mails via serviço SMTP 8025 - para acesso a interface web. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-11.png) 4\. Não é necessário definir nenhuma variável de ambiente. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-12.png) 5\. Após a validação dos parâmetros conclua a criação do contêiner. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-13.png) ### Testando nosso servidor SMTP Após a criação do container, podemos acessar tanto pelo IP publico quando pelo endereço DNS. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-15.png) Para enviar o email podemos utilizar qualquer código que envie um email via SMTP, no exemplo a seguir estou utilizando c# ``` using System.Net.Mail; namespace MailhogSmtp; internal class Program { static async Task Main(string[] args) { var smtpHost = "azbrmailhog.ehgfbye4d5gseeck.eastus2.azurecontainer.io"; var smtpPort = 1025; using var smtpClient = new SmtpClient(smtpHost, smtpPort); var mailMessage = new MailMessage { From = new MailAddress("notificao@azurebrasil.cloud"), Subject = "Existem novos alertas de redução de custos", Body = "Foram encontradas oportunidades de redução de custos na sua assinatura. Clique aqui para saber mais.", To = { new MailAddress("meucliente@meudominio.com.br") } }; await smtpClient.SendMailAsync(mailMessage); } } ``` Acessando nosso servidor pelo endereço criado pelo azure na porta 8025 podemos confirmar que o e-mail foi enviado. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-16.png) ### Conclusão O Azure Container Instance é uma forma simples e prática de rodarmos contêineres no Azure e como a maioria dos serviços pagamos por hora utilizada. Considerando o uso apenas durante o horário comercial o nosso exemplo custaria \~$10/mês. Espero que tenham gostado \[\]s e até a próxima. ### Azure OpenAI - Quanto custa? URL: https://www.azurebrasil.cloud/blog/azure-openai-quanto-custa/ Last updated: 2023-06-13T13:05:38.000Z Ola, No artigo de hoje vamos dissecar os valores e quando custa termos nossa própria versão do OpenAI rodando no Azure. Muito tem se falado e comentado nas redes e alguns clientes têm mostrado interesse em utilizar os modelos do OpenAI em seus sistemas e/ou desenvolver ideias novas. Nós mesmo aqui na PowerTuning estamos testando alguns recursos para dar mais agilidade nos atendimentos do dia a dia. Mas apesar de todo o buzz que temos em cima dos termos relacionados a Inteligência Artificial, **uma pergunta é sempre comum: Quanto Custa?** Minha ideia no artigo de hoje é explicar o que é cada componente disponível e como a cobrança é feita. > Vale ressaltar um ponto muito importante: enquanto escrevo esse artigo a implementação do OpenAI no Azure ainda esta em preview fechado e até o lançamento oficial muita coisa pode e deve mudar. ### Azure OpenAI O OpenAI é um laboratório de pesquisa que produziu vários modelos de inteligência artificial, incluindo GPT-3, Dall-E e ChatGPT, entre outros. Usando os modelos da OpenAI, os desenvolvedores podem gerar previsões de texto e imagem a partir de um prompt, como “Escreva um post para blog sobre OpenAi e Azure” ou “Como mover arquivos entre storage accounts no Azure?”. Você já deve ter usado ou ao menos escutado falar sobre ChatGPT. ChatGPT é uma variação do modelo GPT-3.5 **Agora a primeira pergunta que temos é: Por que OpenAI no Azure quando OpenAI já existe como um serviço separado?** Podemos citar alguns pontos. Em primeiro lugar, o OpenAI no Azure permite que você execute seus modelos na mesma região que seus serviços. Isso permite que você melhore o desempenho e elimine a necessidade de seus dados saírem dessa região do Azure se a segurança for fundamental para você (e regras de compliance também). Em segundo lugar, o Azure já possui uma quantidade poderosa de infraestrutura e serviços por trás dele e usar esses mesmos serviços para proteger, controlar e gerenciar suas despesas para OpenAI será popular para muitas organizações. Quando falamos de nuvem, escalabilidade é um fator-chave e o Azure pode fornecer toda a escalabilidade que você precisa. Em terceiro lugar, a longo prazo, provavelmente será mais conveniente para desenvolvedores familiarizados com o trabalho com o Azure trabalhar com os recursos do OpenAI no Azure do que descobrir o que eles precisam fazer para se integrar ao OpenAI fora do Azure. E, finalmente, ter esses modelos no Azure nos permite aproveitar a escalabilidade e resiliência da Microsoft com suas datas centers existentes em todo o mundo. ### Preços Assim como muitas outras ofertas no Azure, incluindo ofertas de IA como, Serviços Cognitivos do Azure, os serviços OpenAI são cobrados em um modelo por uso, o que significa que você é cobrado principalmente pelas chamadas de API feitas. Essas chamadas de API se enquadram em um dos seguintes tipos: - **Modelos de Linguagem** (incluindo Texto, Código e ChatGPT) - **Modelos com Ajuste Fino** - **Modelos Incorporados** #### Modelos de Linguagem Os modelos de linguagem são modelos baseados em transformadores treinados em grande massa de dados e, em seguida, disponibilizados ao público para consumo. Esses modelos levam algum tempo para treinar e validar e, portanto, novos modelos são lançados periodicamente após serem examinados. Como a OpenAI está constantemente procurando maneiras de expandir seus modelos e melhorar seu desempenho, isso significa que os modelos mais antigos tendem a ter um desempenho pior do que os mais novos. Além disso, o tamanho desses modelos cresceu significativamente ao longo do tempo, o que significa que os modelos mais novos são mais caros para hospedar e também podem levar mais tempo para gerar uma resposta. Devido a esses fatores, o preço dos modelos depende do modelo que você deseja, com os modelos mais antigos, como Ada e Babbage, sendo extremamente acessíveis e os modelos mais recentes, como Davinci, custando mais, mas sendo significativamente mais capazes e semelhantes aos humanos em suas respostas. #### Tokens Os modelos de texto são precificados com base em tokens. Tokens de uma maneira simplificada são trechos, palavras e símbolos individuais (como sinais de pontuação) nos prompts enviados ao modelo e nas respostas geradas a partir do modelo. Uma definição mais completa extraida do proprio site da OpenAi. > A família de modelos GPT processa texto usando tokens, que são sequências comuns de caracteres encontrados em texto. Os modelos entendem as relações estatísticas entre esses tokens e se destacam na produção do próximo token em uma sequência de tokens. Por exemplo a pergunta **qual a melhor época para viajar para Banff no Canadá?** Poderia ser traduzida nos seguintes tokens: \["qual", "a", "melhor", "época", "para", "viajar", "para", "Banff", "no", "Canadá", "?"\], mas utilizando a [ferramenta de geração de tokens](https://platform.openai.com/tokenizer?ref=azurebrasil.cloud) da própria OpenAI temos uma **transformação em 17 tokens.** ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-8.png) Normalmente, quando você chama os serviços OpenAI, especifica o prompt, bem como o máximo de tokens a serem gerados. O modelo gerará até a contagem máxima de tokens e os retornará para você. **Você será cobrado com base no consumo do modelo.** Enquanto escrevo o artigo, esses são os preços para uso de tokens [![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image.png)](https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/?ref=azurebrasil.cloud) https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/ O ideal é prototipar seus aplicativos usando modelos mais baratos como o Text-Ada e validar periodicamente se eles funcionam bem com os outros modelos. À medida que se aproxime do lançamento, sua organização deve realizar uma análise de custo/benefício para determinar se o custo ou a qualidade é o fator determinante e escolher o modelo apropriado com base nesses fatores. Também recomendo que você mantenha seu limite de token razoável para evitar que as respostas do seu modelo sejam desnecessariamente longas e acumulem custos rapidamente. #### Modelos de Código Os modelos de código são muito semelhantes aos modelos de texto, exceto que são criados para o código-fonte. Como esses modelos são mais novos e muito mais especializados do que os modelos de texto genéricos, seu preço é significativamente mais caro por token. Atualmente, existem dois modelos de código dedicados disponíveis: Cushman e Davinci que custam respectivamente 2,4 e 10 centavos de dólar por 1.000 tokens. Como o código é muito denso em símbolos e os símbolos são tokens, esse custo pode aumentar rapidamente, então eu recomendaria começar no Cushman e ter uma noção da quantidade de tokens que você está gerando em suas primeiras chamadas e, em seguida, aumentar as coisas conforme necessário. Este é outro cenário em que você precisa avaliar a qualidade da produção que está obtendo e determinar qual preço faz sentido, de acordo com suas necessidades de qualidade e demandas de volume. #### ChatGPT Fechando nossos modelos de texto está o ChatGPT conforme o comunicado de imprensa da Microsoft, o ChatGPT custa $ 0,002 USD por 1.000 tokens. Isso torna o serviço ChatGPT tão acessível quanto o modelo de texto Curie e mais acessível por token do que qualquer modelo de código atual disponível. No entanto, o ChatGPT pode ser bastante detalhado e, portanto, você pode descobrir que sua contagem de tokens está acumulando mais rápido do que o esperado, portanto, faça alguns testes de validação simples antes de aumentar seu uso. #### Modelos de Imagem Como os modelos de imagem geram imagens de saída em vez de uma série de tokens, sua precificação é muito mais simples: as imagens são precificadas no nível por imagem, independentemente de qual prompt você deu ao modelo. No momento em que escrevo, as imagens Dall-E custam US$ 2 por 100 imagens geradas ou 2 centavos por imagem. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-1.png) ### Modelos com Ajuste Fino Você pode também customizar/criar seu próprio modelo utilizando como base um dos modelos pré-existentes A primeira decisão que você toma é provavelmente a mais crítica: você precisa determinar em qual modelo base seu modelo ajustado será construído. Isso afeta a qualidade geral do modelo treinado e também afeta significativamente o preço durante o treinamento, a hospedagem e as requisições. #### Treinamento ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-2.png) Sua primeira despesa neste processo será pagar pelo tempo gasto treinando ativamente seu modelo. Este é o processo de ajuste fino do modelo para se adaptar aos dados personalizados que você fornece. O tempo gasto dependerá dos dados de treinamento que você enviar ao Azure. Quanto mais dados você fornecer, mais o seu modelo poderá se adaptar aos seus casos, mas também levará mais tempo para o treinamento. No momento, o tempo de treinamento é cobrado por hora de computação para treinamento e os preços variam de US$ 20 a US$ 84 por hora, dependendo do modelo básico selecionado. Semelhante à geração de token acima, os modelos mais simples são mais baratos por hora em comparação com os modelos básicos mais avançados. Como o treinamento pode ser um grande compromisso, recomendo que você determine qual modelo básico deseja antes de experimentar o ajuste fino de um modelo, pois toda vez que avaliar um modelo diferente, precisará treinar um modelo ajustado com base nesse modelo básico. #### Deploy ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-3.png) Depois que seu modelo for treinado, você precisará implantá-lo. Neste ponto, você paga pela hospedagem ativa por hora, assim como faria se implantasse um modelo treinado do Azure Machine Learning. Como antes, os custos de hospedagem dependerão do modelo básico que você selecionou. Atualmente, a hospedagem é uma despesa por hora que varia de 5 centavos a 3 dólares a hora, dependendo do seu modelo básico. #### Consumindo o Modelo ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-4.png) Por fim, depois que um modelo é implantado, os custos de uso padrão ainda se aplicam na forma de custos por mil tokens. Atualmente, esses custos são idênticos aos custos dos modelos básicos. Isso significa que, se você ajustar um modelo, seus custos adicionais para essa personalização do processo de treinamento e implantação, mas você ainda pagará custos de uso para gerar tokens desses modelos. Devido a essa estrutura de taxas, eu só consideraria o ajuste fino de um modelo se tivesse um caso crítico para o qual os modelos básicos fossem insuficientes. Dito isso, o ajuste fino de um modelo oferece controle adicional e a capacidade de implantar algo exclusivo para sua organização e seus usuários, e pode haver muito valor nisso. ### Conclusão Antes de escrever minhas considerações finais, se voce leu até aqui deve estar curioso para saber o quanto custaria de fato para implementarmos OpenAI em nossos projetos, vou deixar aqui duas simulações. #### Utilizando Modelos Existentes ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-5.png) Nos modelos pré-treinados temos apenas o custo de uso por tokens, nesse ponto seria extremamente dificil estimar quantos tokens seriam usados em um mes, mas para termos uma média, fiz um calculo considerando **1 milhão de tokens**. #### Utilizando modelos com ajuste fino Como a idéia seria personalizar um modelo com casos de uso do dia a dia para podermos oferecer alem da base de conhecimento geral respostas baseada em nossa expertise temos dois custos: **O custo de treinamento, pago uma única vez (ou quando fossemos aprimorar o modelo)** ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-6.png) **E o custo para hospedar e gerar os tokens** ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/06/image-7.png) **Sendo bem otimista estamos falando de um custo mensal de +/- $500 dólares no minimo.** O tema subjacente com OpenAI no Azure é que você deve tomar uma decisão sobre onde você se enquadra entre otimizar para custos reduzidos e otimizar para maior qualidade do conteúdo gerado. Enquanto alguns serviços são pagos por chamada ou por hora, a maioria das coisas com OpenAI são cobradas em nível de token. Isso significa que, se você precisar enviar muito texto ao OpenAI ou precisar gerar respostas detalhadas, estará pagando significativamente mais ao longo do tempo do que um sistema que precisa apenas de perguntas e respostas simples. Eu o encorajaria a fazer algumas experiências direcionadas e testes internos para ver qual nível de qualidade sua organização considera aceitável e quão justificável é o preço desse nível de serviço para sua empresa. Por último e não menos importante, se precisar de ajuda com testes e implementação nos chame para um bate papo, nossas ferramentas de FinOps serão uma aliada na hora de monitorar e prever seus custos com OpenAI. ### Resumo Semanal #8 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-8/ Last updated: 2023-06-12T16:27:47.000Z ### Azure Updates - [Public Preview: Azure Chaos Studio is now available in West US 2 region](https://azure.microsoft.com/pt-br/updates/public-preview-azure-chaos-studio-is-now-available-in-west-us-2-region/?ref=azurebrasil.cloud) - [Generally available: Azure Data Explorer Kusto Emulator on Linux](https://azure.microsoft.com/pt-br/updates/kusto-emulator-linux/?ref=azurebrasil.cloud) - [General availability: New KQL function to enrich your data analysis with geographic context](https://azure.microsoft.com/pt-br/updates/geo-ip/?ref=azurebrasil.cloud) - [Generally available: Multiple backups per day for Azure Virtual Machines](https://azure.microsoft.com/pt-br/updates/multiple-backups-per-day/?ref=azurebrasil.cloud) - [Generally available: Private Link support for Application Gateway](https://azure.microsoft.com/pt-br/updates/generally-available-application-gateway-private-link/?ref=azurebrasil.cloud) - [Public Preview: Azure AD Support for Azure Files SMB shares REST API](https://azure.microsoft.com/pt-br/updates/azure-files-rest-oauth/?ref=azurebrasil.cloud) - [Public preview: Azure Container Instances(ACI) Spot containers](https://azure.microsoft.com/pt-br/updates/public-preview-azure-container-instancesaci-spot-containers/?ref=azurebrasil.cloud) - [Announcing the new Azure Container Registry libraries](https://azure.microsoft.com/pt-br/updates/announcing-the-new-azure-container-registry-libraries/?ref=azurebrasil.cloud) - [Public preview: Azure Front Door Standard/Premium in Azure Government](https://azure.microsoft.com/pt-br/updates/public-preview-azure-front-door-standardpremium-in-azure-government/?ref=azurebrasil.cloud) - [General availability: Inbound ICMPv6 pings and traceroute are now supported on Azure Load Balancer](https://azure.microsoft.com/pt-br/updates/general-availability-inbound-icmpv6-pings-and-traceroute-are-now-supported-on-azure-load-balancer/?ref=azurebrasil.cloud) ### Community Updates - [Azure VM Extensions: Part 2 CustomScriptExtension](https://gregorsuttie.com/2023/06/05/azure-vm-extensions-part-2-customscriptextension/?ref=azurebrasil.cloud) - [AZURE VM EXTENSIONS: PART 3 Refactoring our code](https://gregorsuttie.com/2023/06/11/azure-vm-extensions-part-3-refactoring-our-code/?ref=azurebrasil.cloud) - [How to Move Files with PowerShell](https://www.thomasmaurer.ch/2023/06/how-to-move-files-with-powershell/?ref=azurebrasil.cloud) - [SSH to a Linux server from Windows 11](https://www.techielass.com/ssh-to-a-linux-server-from-windows-11/?ref=azurebrasil.cloud) - [How to re-enable Bluetooth on your Windows device](https://www.koskila.net/how-to-re-enable-bluetooth-on-your-windows-device/?ref=azurebrasil.cloud) - [The Password Rotation: The Ballad of Windows LAPS and Threadpools](https://call4cloud.nl/2023/06/the-password-rotation-the-ballad-of-windows-laps-and-threadpools/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=the-password-rotation-the-ballad-of-windows-laps-and-threadpools) - [Configuring compliance for Microsoft Fabric](https://www.kevinrchant.com/2023/06/06/configuring-compliance-for-microsoft-fabric/?ref=azurebrasil.cloud) - [Application Custom Attribute Driven Conditional Access](https://www.youtube.com/watch?v=VJRj4X5Ypfs&ref=azurebrasil.cloud) - [What happens when multiple conditional access policies apply?](https://www.youtube.com/watch?v=OTvzzopaEBY&ref=azurebrasil.cloud) - [Azure Infrastructure Weekly Update - 9th June 2023](https://www.youtube.com/watch?v=bKR2XCWRDWk&ref=azurebrasil.cloud) - [Defender for OTHER Clouds (AWS and GCP)](https://www.youtube.com/watch?v=PT3dQ6lCOyY&ref=azurebrasil.cloud) - [Azure Bicep: Mastering Infrastructure as Code with Bicep](https://www.youtube.com/watch?v=o1MlkjckUXE&ref=azurebrasil.cloud) - [Cleanup your unwanted Azure resources on a schedule](https://luke.geek.nz/azure/Cleanup-your-unwanted-Azure-resources-on-a-schedule/?ref=azurebrasil.cloud) - [My Microsoft MVP Award](https://www.keithatherton.com/posts/2023-06-09-mvp-award/?ref=azurebrasil.cloud) - [Step-by-Step – Windows LAPS With Microsoft Entra and Intune](https://charbelnemnom.com/windows-laps-with-microsoft-entra-and-intune/?ref=azurebrasil.cloud) - [5 Disciplines of Cloud Governance](https://charbelnemnom.com/5-disciplines-of-cloud-governance/?ref=azurebrasil.cloud) - [Verify Azure IP Flow with Azure Network Watcher](https://www.ciraltos.com/verify-azure-ip-flow-with-azure-network-watcher/?ref=azurebrasil.cloud) - [Newsletter Launch](https://www.mattallford.com/2023/Newsletter-Launch/?ref=azurebrasil.cloud) ### Azure App Service: Restart via código URL: https://www.azurebrasil.cloud/blog/azure-app-service-restart-via-codigo/ Last updated: 2023-06-09T16:54:05.000Z Esse foi um caso real de um cliente atendido por nós da azurebrasil.cloud, a aplicação do cliente tem uma biblioteca que transforma que gera PDFs que às vezes apresenta erros relacionados a GDI. Sem ter como investigar mais a fundo ou uma maneira de reproduzir o erro, ele pediu uma maneira simples e prática para reiniciar o App Service sem precisar conectar no portal do Azure, aparentemente após o restart os erros param de acontecer. A primeira indicação foi as APIs/Pacotes do Azure SDK, mas como o cliente em questão não conhecia os mecanismos de Autenticação/Autorização de recursos no Azure e estava precisando de uma solução bem rápida optamos pelo uso do Logic Apps, uma solução No Code que permite criação de workflows. Para o nosso caso temos apenas duas ações, exatamente como a foto que ilustra o post: 1. Um gatilho http 2. A ação nativa de gerenciar um serviço de aplicativo para fazer o restart. Pronto, solução implementada! Simples assim! Esse post serve especialmente para me lembrar que as soluções mais simples às vezes são as melhores! ### App Service Auto-healing Como mencionado os erros são intermitentes e sem uma causa específica, nesse caso que descrevi o cliente queria ter um controle sobre quando o restart aconteceria e para poder ter tempo de investigar o erro. Mas existe outra solução para cenários como esse, o App Service fornece um mecanismo chamado Auto-Healing que causa o restart automático baseado em algumas condições, tais como: - Duração de requisições - Limite de uso de memória - Quantidade de Requisições - Códigos de Status HTTP Para saber mais sobre essa função e como habilitá-la [cheque na documentação clicando aqui](https://learn.microsoft.com/en-us/azure/app-service/overview-diagnostics?ref=azurebrasil.cloud#auto-healing). ### Resumo Semanal #7 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-7/ Last updated: 2023-06-05T12:59:46.000Z ### Azure Updates - [General availability: Azure CNI powered by Cilium](https://azure.microsoft.com/pt-br/updates/azure-cni-powered-by-cilium/?ref=azurebrasil.cloud) - [Setting Up a CI/CD Pipeline with GitHub Actions for Stream Analytics Jobs](https://azure.microsoft.com/pt-br/updates/setting-up-a-cicd-pipeline-with-github-actions-for-stream-analytics-jobs/?ref=azurebrasil.cloud) - [Public Preview: Azure Data Explorer bindings for Azure Functions](https://azure.microsoft.com/pt-br/updates/public-preview-azure-data-explorer-bindings-for-azure-functions/?ref=azurebrasil.cloud) - [General availability: NLog Sink for Azure Data Explorer](https://azure.microsoft.com/pt-br/updates/general-availability-nlog-sink-for-azure-data-explorer-2/?ref=azurebrasil.cloud) - [General availability: Azure Sphere version 23.05 is delayed, new OS will be issued to Retail Eval](https://azure.microsoft.com/pt-br/updates/general-availability-azure-sphere-version-2305-is-delayed-new-os-will-be-issued-to-retail-eval/?ref=azurebrasil.cloud) - [Generally available: Zone Redundant Storage for Azure Disks is now available in more regions.](https://azure.microsoft.com/pt-br/updates/generally-available-zone-redundant-storage-for-azure-disks-is-now-available-in-more-regions/?ref=azurebrasil.cloud) - [Now Available: Resource-centric log queries in the Azure Monitor Query libraries](https://azure.microsoft.com/pt-br/updates/resource-centric-log-queries/?ref=azurebrasil.cloud) - [Generally available: Azure Files scalability improvement for Azure Virtual Desktop and other workloads that open root directory handles](https://azure.microsoft.com/pt-br/updates/generally-available-azure-files-scalability-improvement-for-azure-virtual-desktop-and-other-workloads/?ref=azurebrasil.cloud) - [Azure Support Plan Offer extended to December 31, 2023](https://azure.microsoft.com/pt-br/updates/azure-support-plan-offer-extended-to-december-31-2023/?ref=azurebrasil.cloud) - [General availability: Azure Load Balancer per VM limit removal](https://azure.microsoft.com/pt-br/updates/general-availability-azure-load-balancer-per-vm-limit-removal/?ref=azurebrasil.cloud) - [Generally available: Jobs API to support bulk import in Azure Digital Twins](https://azure.microsoft.com/pt-br/updates/generally-available-jobs-api-to-support-bulk-import-in-azure-digital-twins/?ref=azurebrasil.cloud) - [Generally available: 8TB memory Mv2 Virtual Machine](https://azure.microsoft.com/pt-br/updates/generally-available-8tb-memory-mv2-virtual-machine/?ref=azurebrasil.cloud) - [General Availability: Isovalent Cilium Enterprise through Azure Marketplace](https://azure.microsoft.com/pt-br/updates/general-availability-isovalent-cilium-enterprise-through-azure-marketplace/?ref=azurebrasil.cloud) - [Public preview: Introducing NGads V620-series VMs optimized for cloud gaming ](https://azure.microsoft.com/pt-br/updates/public-preview-introducing-ngads-v620series-vms-optimized-for-cloud-gaming/?ref=azurebrasil.cloud) ### Community Updates - [Azure VM Extensions: Part 1 DSC Extensions](https://gregorsuttie.com/2023/05/30/azure-vm-extensions-part-1-dsc-extensions/?ref=azurebrasil.cloud) - [Ensuring High Priority for Azure Kubernetes Service (AKS) Daemon Sets: A Guide to Smooth Cluster Startup](https://pixelrobots.co.uk/2023/06/ensuring-high-priority-for-azure-kubernetes-service-aks-daemon-sets-a-guide-to-smooth-cluster-startup/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=ensuring-high-priority-for-azure-kubernetes-service-aks-daemon-sets-a-guide-to-smooth-cluster-startup) - [Register and Manage Linux Servers with Azure Arc Tutorial](https://www.techielass.com/register-and-manage-linux-servers-with-azure-arc-tutorial/?ref=azurebrasil.cloud) - [Azure DevOps Engineer Expert Renewal - Study Guide](https://www.petecodes.co.uk/azure-devops-engineer-expert-renewal-study-guide/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=azure-devops-engineer-expert-renewal-study-guide) - [Azure Developer Associate Renewal - Study Guide](https://www.petecodes.co.uk/azure-developer-associate-renewal-study-guide/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=azure-developer-associate-renewal-study-guide) - ["Something happened on our end" on Microsoft Store](https://www.koskila.net/something-happened-on-our-end-on-microsoft-store/?ref=azurebrasil.cloud) - [The Virtual Account that rocks the EPM!](https://call4cloud.nl/2023/05/the-virtual-account-that-rocks-the-epm/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=the-virtual-account-that-rocks-the-epm) - [My experience using a MacBook Pro for 100 days](https://jussiroine.com/2023/06/my-experience-using-a-macbook-pro-for-100-days/?ref=azurebrasil.cloud) - [Experts Live Netherlands 2023 - Exploring the benefits of Azure Virtual WAN](https://jakewalsh.co.uk/experts-live-netherlands-2023-exploring-the-benefits-of-azure-virtual-wan/?ref=azurebrasil.cloud) - [Getting Rid of Passwords for Deployment with Pulumi OIDC Support](https://samcogan.com/getting-rid-of-passwords-for-deployment-with-pulumi-oidc-support/?ref=azurebrasil.cloud) - [Posts](https://samcogan.com/post/?ref=azurebrasil.cloud) - [Find Full FSLogix Profiles](https://www.cloudsma.com/2023/05/find-full-fslogix-profiles/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=find-full-fslogix-profiles) - [Migrating Classic Application Insights](https://www.cloudsma.com/2023/06/migrating-classic-application-insights/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=migrating-classic-application-insights) - [Azure Friday: Exploring Automated Deployments for AKS with Steve Buchanan and Scott Hanselman](https://www.buchatech.com/2023/06/azure-friday-exploring-automated-deployments-for-aks-with-steve-buchanan-and-scott-hanselman/?ref=azurebrasil.cloud) - [PowerShell ForEach: Everything You Need to Know](https://jeffbrown.tech/powershell-foreach/?utm%5Fsource=rss&utm%5Fmedium=rss&utm%5Fcampaign=powershell-foreach) - [CKA Exam Tips](https://medium.com/codex/cka-exam-tips-eaade4724b58?source=rss-f8c0d8b1b817------2) - [Maximize Azure Reliability](https://www.youtube.com/watch?v=-aOeUed54kg&ref=azurebrasil.cloud) - [Azure Infrastructure Weekly Update - 2nd June 2023](https://www.youtube.com/watch?v=SbK9YBwsNzc&ref=azurebrasil.cloud) - [Application Custom Attribute Driven Conditional Access](https://www.youtube.com/watch?v=VJRj4X5Ypfs&ref=azurebrasil.cloud) - [Infrastructure as Code (IaC) Blueprints on Azure](https://www.youtube.com/watch?v=BEEHo5M5de0&ref=azurebrasil.cloud) - [CMC Podcast - MVP Journey with Jon Jarvis](https://www.youtube.com/watch?v=NMGKPdt39ts&ref=azurebrasil.cloud) - [Looking back at Experts Live NL](https://www.burgerhout.org/looking-back-at-experts-live-nl/?ref=azurebrasil.cloud) ### Reservas do Azure - Otimize suas compras com alertas de Utilização URL: https://www.azurebrasil.cloud/blog/reservas-do-azure-otimize-suas-compras-com-alertas-de-utilizacao/ Last updated: 2023-06-02T14:27:56.000Z Recentemente saiu uma novidade interessante relacionada as reservas do Azure, a possibilidade de termos alerta de uso das reservas. Até então a única possibilidade de monitorarmos o uso de reservas era olhando direto no portal do Azure ou consumindo os dados da [Api de Reservas](https://learn.microsoft.com/en-us/rest/api/consumption/reservations-details?ref=azurebrasil.cloud) [Reservations Details - REST API (Azure Consumption)Learn more about \[Consumption Reservations Details Operations\]. How to \[List,List By Reservation Order,List By Reservation Order And Reservation\].![](https://learn.microsoft.com/favicon.ico)Microsoft Learnmarkjulmar![](https://learn.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://learn.microsoft.com/en-us/rest/api/consumption/reservations-details?ref=azurebrasil.cloud) Agora podemos criar alertas dentro do cost management baseado na utilização ou não das reservas, **a regra de bolso aqui é reavaliar reservas que apresentem menos de 95% de uso nos últimos 7 dias**. Para mais detalhes e um passo-a-passo de como criar seus primeiros alertas, confira a documentação oficial. [Reservation utilization alerts - Preview - Microsoft Cost ManagementThis article helps you set up and use reservation utilization alerts.![](https://learn.microsoft.com/favicon.ico)Microsoft Learnbandersmsft![](https://learn.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://learn.microsoft.com/en-us/azure/cost-management-billing/costs/reservation-utilization-alerts?ref=azurebrasil.cloud) ### Adicionando o Entity Framework Core a uma Azure Function URL: https://www.azurebrasil.cloud/blog/adicionar-ef-a-uma-azure-function/ Last updated: 2023-05-31T13:29:31.000Z Esses dias me deparei com a tarefa de implementar o [Entity Framework Core](https://learn.microsoft.com/en-us/ef/core/?ref=azurebrasil.cloud) em uma [Azure Function](https://learn.microsoft.com/en-us/azure/azure-functions/functions-overview?pivots=programming-language-csharp&ref=azurebrasil.cloud). Me deparei com uma situação na qual vale a pena ser compartilhada. Sobre a *function* e o ambiente de desenvolvimento*,* temos a seguintes características: - A *function* é do tipo [*isolated worker process*](https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide?ref=azurebrasil.cloud#why-net-functions-isolated-worker-process)*;* - Utilizei o [.NET 7](https://dotnet.microsoft.com/pt-br/download/dotnet/7.0?ref=azurebrasil.cloud); - Utilizei o *[Visual Studio 2022 for Mac.](https://visualstudio.microsoft.com/pt-br/vs/mac/?ref=azurebrasil.cloud)* Antes de seguir, caso seja a sua primeira vez lendo sobre Azure Functions, recomendo a leitura da [documentação oficial](https://learn.microsoft.com/en-us/azure/azure-functions/functions-overview?pivots=programming-language-csharp&ref=azurebrasil.cloud). Além disso, eu já escrevi alguns posts sobre esse recurso de nuvem, você pode conferir [aqui](https://tallesvaliatti.com/enviando-mensagens-para-as-filas-do-storage-account-atrav%C3%A9s-das-azure-functions-de3a178b9aa9?source=collection%5Fhome---------3----------------------------) e [aqui](https://tallesvaliatti.com/avaliando-a-escalabilidade-das-azure-functions-1f5fec737167?ref=azurebrasil.cloud). Inicialmente vamos criar o projeto de *functions* diretamente pela IDE*.* ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Screen-Shot-2023-05-24-at-10.55.13.png) A *function* criada será do tipo [Timer trigger](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?pivots=programming-language-csharp&tabs=python-v2%2Cin-process%2Cfunctionsv2&ref=azurebrasil.cloud). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Screen-Shot-2023-05-24-at-10.56.17.png) Para implementar o [Entity Framework Core](https://learn.microsoft.com/en-us/ef/core/?ref=azurebrasil.cloud), iremos adicionar os seguintes pacotes ao nosso projeto. Vale mencionar que estamos criando um banco de dados do zero (SQL Server), por isso utilizaremos a abordagem *[code-first](https://learn.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro?view=aspnetcore-7.0&ref=azurebrasil.cloud#initialize-db-with-test-data).* ``` Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Design ``` No arquivo *local.settings.json*, vamos adicionar a *connectionString* do nosso banco de dados. Nesse caso, eu levantei um[SQL Servervia *docker*](https://learn.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&pivots=cs1-bash&ref=azurebrasil.cloud)no meu ambiente local*.* ``` { "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "ConnectionString": "YOUR-CONNECTION-STRING" } } ``` É hora de criar um modelo simples de dados. Vamos declarar a classe *Book* com apenas duas propriedades. ``` using System; namespace AzureFunctionEF.Models { public class Book { public Guid Id { get; set; } public string Name { get; set; } = default!; } } ``` Devemos também implementar a classe [*Context*](https://learn.microsoft.com/en-us/ef/core/dbcontext-configuration/?ref=azurebrasil.cloud)*.* Observe que fizemos o[mapeamento](https://learn.microsoft.com/en-us/ef/core/modeling/?ref=azurebrasil.cloud) de como a classe *Book* será utilizada como base da tabela *Books* ``` using System; using AzureFunctionEF.Models; using Microsoft.EntityFrameworkCore; namespace AzureFunctionEF.Data { public class Context : DbContext { public Context(DbContextOptions options) : base(options) { } public DbSet Books { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .ToTable("Books"); } } } ``` Com a classe *Context* implementada, já podemos fazer a configuração do *Entity Framework Core* na classe *Program.cs.* ``` using AzureFunctionEF.Data; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var builder = new HostBuilder() .ConfigureFunctionsWorkerDefaults(); builder.ConfigureServices((hostContext, services) => { string connectionString = hostContext.Configuration.GetSection("ConnectionString").Value!; services.AddDbContext( options => SqlServerDbContextOptionsExtensions.UseSqlServer(options, connectionString)); }); builder.Build().Run(); ``` Para finalizar, basta fazermos a [injeção de dependência](https://learn.microsoft.com/pt-br/dotnet/core/extensions/dependency-injection?ref=azurebrasil.cloud) do *Context* na *function* criada por *default* no nosso projeto. Essa *function* irá basicamente criar um novo registro de *Book* a cada período determinado pelo[*trigger* da *function*](https://www.google.com/search?q=trigger+fuctions&oq=trigger+fuctions&aqs=chrome..69i57j0i433i512j0i512j0i433i512j0i131i433i512j0i67i650j0i512l4.2358j0j7&sourceid=chrome&ie=UTF-8&ref=azurebrasil.cloud)*.* ``` using System; using AzureFunctionEF.Data; using AzureFunctionEF.Models; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace AzureFunctionEF { public class DefaultFunction { private readonly ILogger _logger; private readonly Context _context; public DefaultFunction(ILoggerFactory loggerFactory, Context context) { _logger = loggerFactory.CreateLogger(); _context = context; } [Function("DefaultFunction")] public async Task RunAsync([TimerTrigger("0 */1 * * * *")] MyInfo myTimer) { _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); var id = Guid.NewGuid(); await _context.Books.AddAsync(new Book { Id = id, Name = $"Book_{id}" }); await _context.SaveChangesAsync(); _logger.LogInformation($"Next timer schedule at: {myTimer.ScheduleStatus.Next}"); } } public class MyInfo { public MyScheduleStatus ScheduleStatus { get; set; } public bool IsPastDue { get; set; } } public class MyScheduleStatus { public DateTime Last { get; set; } public DateTime Next { get; set; } public DateTime LastUpdated { get; set; } } } ``` Dito isso, já podemos gerar a primeira *[migration](https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli&ref=azurebrasil.cloud)* e fazer o [*update* do banco de dados](https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/applying?tabs=dotnet-core-cli&ref=azurebrasil.cloud#command-line-tools). ``` dotnet ef migrations add InitialMigration --verbose ``` ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Screen-Shot-2023-05-24-at-11.15.19.png) Observe que recebemos um erro, dizendo que a classe *Context* não pode ser criada. ``` Microsoft.EntityFrameworkCore.Design.OperationException: Unable to create an object of type 'Context' ``` Para resolver esse problema, devemos criar a classe *ContextFactory* que implementa *[IDesignTimeDbContextFactory](https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.design.idesigntimedbcontextfactory-1?view=efcore-7.0&ref=azurebrasil.cloud).* Com isso podemos construir classes que herdam de [*DbContext*](https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontext?view=efcore-7.0&ref=azurebrasil.cloud) em *[design-time](https://learn.microsoft.com/en-us/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli&ref=azurebrasil.cloud).* Recomendo a leitura deste conceito! ``` using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; namespace AzureFunctionEF.Data { public class ContextFactory : IDesignTimeDbContextFactory { public Context CreateDbContext(string[] args) { var index = Array.IndexOf(args, "--connection-string"); if (index == -1) throw new Exception("Parameter --connection-string did not provide"); string connectionString = args[index + 1]; Console.WriteLine(connectionString); var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseSqlServer(connectionString); return new Context(optionsBuilder.Options); } } } ``` Dessa forma, já podemos criar a *migration.* Precisaremos desta vez passar a *connection string* via parâmetro. ``` dotnet ef migrations add InitialMigration --verbose -- --connection-string '' ``` É hora de [aplicarmos essa *migration* ao banco de dados](https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/applying?tabs=dotnet-core-cli&ref=azurebrasil.cloud). ``` dotnet ef database update --verbose -- --connection-string '' ``` Podemos observar que tudo foi criado corretamente. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Screen-Shot-2023-05-24-at-11.19.37.png) Ao executarmos a *function,* depois de alguns ciclos*,* percebemos ela está salvando novos registros de forma correta*. O Entity Framework Core* foi implementado corretamente! ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Screen-Shot-2023-05-24-at-11.24.03.png) Você já pode baixar o projeto por esse [](https://github.com/TallesValiatti/AzureCostManagementRestApi?ref=azurebrasil.cloud)[link](https://github.com/TallesValiatti/AzureFunctionEF?ref=azurebrasil.cloud), e não esquece de me seguir no [LinkedIn](https://www.linkedin.com/in/tallesvaliatti/?ref=azurebrasil.cloud)! Até a próxima, abraços! ### Azure SQL: Microsoft Sql Server Native Client 11.0 error - Invalid connection string attribute URL: https://www.azurebrasil.cloud/blog/azure-sql-microsoft-sql-server-native-client-11-0-error-invalid-connection-string-attribute/ Last updated: 2023-08-09T18:35:56.000Z Ola, Continuando com a migração do Azure Sql Managed Instance para o Azure SQL Hyperscale (contei mais no último post) após resolvido os problemas da replicação e sincronização do esquema, me deparei com um novo erro: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image-6.png) #### Problema Eis que aí começa o problema maior, como podem ver o erro não é nem um pouco amigável e pode ser relacionado ha uma infinidade de coisas. Junte a isso o fato de estarmos falando de um código escrito em **vbscript ha +/- 20 anos**. A mensagem em si nos leva a crer que o problema está na string de conexão, mas aí que as coisas ficaram interessantes, temos duas máquinas na mesma rede com o mesmo código apontando para o mesmo servidor, em uma máquina tudo funciona 100% sem erros e em outra temos o erro. #### Dica 1 Sempre que estiver trabalhando com erros relacionados a string de conexão tente deixar a string de conexão o mais simples possível. String de conexão padrão: ``` Set DB_CONN = Server.CreateObject("ADODB.Connection") DB_CONN.CursorLocation = 3 DB_CONN.ConnectionTimeout = 300 DB_CONN.CommandTimeout = 300 DB_CONN.Open "Provider=SQLNCLI11;Server=" & SERVER_DB_ADDRESS & ";Application Name='" & APPLICATION_NAME & "';Database=" & SERVER_DB_CATALOG_NAME & ";Uid=" & SERVER_DB_USER_NAME & "; Pwd=" & SERVER_DB_PASSWORD & ";DataTypeCompatibility=80;CommandTimeout=300" ``` Temos dois parâmetros a mais ali **DataTypeCompatibility** e **CommandTimeout**, apos removê-los temos o erro real. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image-7.png) #### Solução Agora, sim, as coisas começam a fazer um pouco mais de sentido, nosso servidor está configurado para aceitar ao menos TLS 1.2. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image-8.png) E comparando a versão dos drivers em ambos os servidores, o servidor que apresentava o erro estava com uma versão desatualizada do driver. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image-9.png) Aqui temos duas opções: - Solução 1 - Fazer o downgrade do Minimum TLS version para 1.1, o que não seria recomendado, mas ainda, sim, ok para um servidor de testes. - Solução 2 - Atualizar o driver para a versão mais recente e manter o mesmo ambiente nas duas VMs. Optamos pela solução 2 e tudo foi resolvido. Nota pessoal: Link correto para download [https://www.microsoft.com/en-us/download/confirmation.aspx?id=50402](https://www.microsoft.com/en-us/download/confirmation.aspx?id=50402&ref=azurebrasil.cloud) Nos siga para mais dicas e erros do dia a dia. ### Resumo Semanal #6 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-6/ Last updated: 2023-05-29T13:54:53.000Z ### Azure Updates - [Announcing the public preview of custom Text Analytics for health](https://azure.microsoft.com/pt-br/updates/custom-ta4h-release/?ref=azurebrasil.cloud) - [Azure Machine Learning - General Availability for Build ](https://azure.microsoft.com/pt-br/updates/azure-machine-learning-general-availability-for-build/?ref=azurebrasil.cloud) - [Azure Machine Learning - Public Preview for Build](https://azure.microsoft.com/pt-br/updates/azure-machine-learning/?ref=azurebrasil.cloud) - [Generally Available: Azure Cosmos DB burst capacity](https://azure.microsoft.com/pt-br/updates/generally-available-azure-cosmos-db-burst-capacity/?ref=azurebrasil.cloud) - [Public Preview: Azure Cosmos DB computed properties](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cosmos-db-computed-properties/?ref=azurebrasil.cloud) - [Public Preview: In-Account restore for continuous backup accounts](https://azure.microsoft.com/pt-br/updates/public-preview-inaccount-restore-for-continuous-backup-accounts/?ref=azurebrasil.cloud) - [Generally Available: Enhanced document expiration with Time to Live (TTL) on any field.](https://azure.microsoft.com/pt-br/updates/generally-available-enhanced-document-expiration-with-time-to-live-ttl-on-any-field/?ref=azurebrasil.cloud) - [Public preview: Azure SQL Database Hyperscale elastic pools](https://azure.microsoft.com/pt-br/updates/public-preview-azure-sql-database-hyperscale-elastic-pools/?ref=azurebrasil.cloud) - [Public preview: New features in Azure Container Storage ](https://azure.microsoft.com/pt-br/updates/public-preview-new-features-in-azure-container-storage/?ref=azurebrasil.cloud) - [Generally Available: Azure Linux support in AKS ](https://azure.microsoft.com/pt-br/updates/generally-available-azure-linux-support-in-aks/?ref=azurebrasil.cloud) - [Generally Available: Generation 2 VM for Windows ](https://azure.microsoft.com/pt-br/updates/generally-available-generation-2-vm-for-windows/?ref=azurebrasil.cloud) - [Generally Available: Kubernetes marketplace ](https://azure.microsoft.com/pt-br/updates/generally-available-kubernetes-marketplace/?ref=azurebrasil.cloud) - [Public preview: Custom node config for Windows ](https://azure.microsoft.com/pt-br/updates/public-preview-custom-node-config-for-windows/?ref=azurebrasil.cloud) - [Public preview: Multi-cluster update support in Azure Kubernetes Fleet Manager ](https://azure.microsoft.com/pt-br/updates/public-preview-multicluster-update-support-in-azure-kubernetes-fleet-manager/?ref=azurebrasil.cloud) - [ AKS DevX Extension Updates for Visual Studio Code ](https://azure.microsoft.com/pt-br/updates/aks-devx-extension-updates-for-visual-studio-code/?ref=azurebrasil.cloud) - [Public preview: Serverlessly run on-demand, scheduled, and event-driven jobs on Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/public-preview-serverlessly-run-ondemand-scheduled-and-eventdriven-jobs-on-azure-container-apps/?ref=azurebrasil.cloud) - [Public preview: Free managed TLS certificates for Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/public-preview-free-managed-tls-certificates-for-azure-container-apps/?ref=azurebrasil.cloud) - [Public preview: Secrets volume mounts for Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/public-preview-secrets-volume-mounts-for-azure-container-apps/?ref=azurebrasil.cloud) - [Public Preview: GitHub Advanced Security for Azure DevOps](https://azure.microsoft.com/pt-br/updates/public-preview-github-advanced-security-for-azure-devops/?ref=azurebrasil.cloud) - [New capabilities available in Microsoft Dev Box](https://azure.microsoft.com/pt-br/updates/new-capabilities-available-in-microsoft-dev-box/?ref=azurebrasil.cloud) - [Public Preview: Azure Event Grid now includes MQTT protocol support and HTTP pull-style message delivery.](https://azure.microsoft.com/pt-br/updates/public-preview-azure-event-grid-now-includes-mqtt-protocol-support-and-http-pullstyle-message-delivery/?ref=azurebrasil.cloud) - [Generally Available: SQL Bindings for Azure Functions ](https://azure.microsoft.com/pt-br/updates/generally-available-sql-bindings-for-azure-functions/?ref=azurebrasil.cloud) - [Public preview: ASP.NET Core integration in Azure Functions .NET isolated model ](https://azure.microsoft.com/pt-br/updates/public-preview-aspnet-core-integration-in-azure-functions-net-isolated-model/?ref=azurebrasil.cloud) - [Generally Available: Linked backends for Azure Static Web Apps ](https://azure.microsoft.com/pt-br/updates/generally-available-linked-backends-for-azure-static-web-apps/?ref=azurebrasil.cloud) - [Public preview: Azure Functions for cloud-native microservices](https://azure.microsoft.com/pt-br/updates/public-preview-azure-functions-can-now-run-on-azure-container-apps/?ref=azurebrasil.cloud) - [Generally Available: Azure Monitor announces managed services for Prometheus](https://azure.microsoft.com/pt-br/updates/generally-available-azure-monitor-announces-managed-services-for-prometheus/?ref=azurebrasil.cloud) - [Public Preview: Azure Log Alerts support for Azure Data Explorer ](https://azure.microsoft.com/pt-br/updates/public-preview-azure-log-alerts-support-for-azure-data-explorer/?ref=azurebrasil.cloud) - [Public Preview: Azure Monitor Container insights introduces "Cluster Optimization" workbook](https://azure.microsoft.com/pt-br/updates/public-preview-azure-monitor-container-insights-introduces-cluster-optimization-workbook/?ref=azurebrasil.cloud) - [Public preview: Azure Monitor managed service for Prometheus for Azure Arc-enabled Kubernetes](https://azure.microsoft.com/pt-br/updates/public-preview-azure-monitor-managed-service-for-prometheus-for-azure-arcenabled-kubernetes/?ref=azurebrasil.cloud) - [Public Preview: Materialized views for Cosmos DB NoSQL API](https://azure.microsoft.com/pt-br/updates/public-preview-materialized-views-for-cosmos-db-nosql-api/?ref=azurebrasil.cloud) - [Generally Available: Azure Cosmos DB hierarchical partition keys](https://azure.microsoft.com/pt-br/updates/generally-available-azure-cosmos-db-hierarchical-partition-keys/?ref=azurebrasil.cloud) - [Public Preview: Azure Cosmos DB all versions and deletes change feed mode](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cosmos-db-all-versions-and-deletes-change-feed-mode/?ref=azurebrasil.cloud) - [Public Preview – Data Migration for Oracle ](https://azure.microsoft.com/pt-br/updates/public-preview-data-migration-for-oracle/?ref=azurebrasil.cloud) - [Generally Available: Azure Cosmos DB serverless container with 1 TB storage](https://azure.microsoft.com/pt-br/updates/generally-available-azure-cosmos-db-serverless-container-with-1-tb-storage-2/?ref=azurebrasil.cloud) - [Public Preview: Vector search in Azure Cosmos DB for MongoDB vCore](https://azure.microsoft.com/pt-br/updates/public-preview-vector-search-in-azure-cosmos-db-for-mongodb-vcore/?ref=azurebrasil.cloud) - [General Availability – Database Schema Conversion Toolkit for Oracle](https://azure.microsoft.com/pt-br/updates/general-availability-database-schema-conversion-toolkit-for-oracle/?ref=azurebrasil.cloud) - [Microsoft Azure Deployment Environments is now generally available.](https://azure.microsoft.com/pt-br/updates/microsoft-azure-deployment-environments-is-now-generally-available/?ref=azurebrasil.cloud) - [Public preview: Automated deployments in AKS now supports Draft ](https://azure.microsoft.com/pt-br/updates/public-preview-automated-deployments-in-aks-now-supports-draft/?ref=azurebrasil.cloud) - [Database Migration Service Pack for Oracle - Preview](https://azure.microsoft.com/pt-br/updates/database-migration-service-pack-for-oracle-preview/?ref=azurebrasil.cloud) - [Generally Available: Cost-optimizations with transformations on Log Analytics for troubleshooting Cosmos DB](https://azure.microsoft.com/pt-br/updates/generally-available-costoptimizations-with-transformations-on-log-analytics-for-troubleshooting-cosmos-db/?ref=azurebrasil.cloud) - [Azure SQL Managed Instance —Public preview updates for late-May 2023](https://azure.microsoft.com/pt-br/updates/azure-sql-managed-instance-public-preview-updates-for-latemay-2023/?ref=azurebrasil.cloud) - [General availability: Confidential containers on Azure Container Instances (ACI) ](https://azure.microsoft.com/pt-br/updates/general-availability-confidential-containers-on-azure-container-instances-aci/?ref=azurebrasil.cloud) - [Public Preview: Time-travel for Azure Synapse Link for Cosmos DB](https://azure.microsoft.com/pt-br/updates/public-preview-timetravel-for-azure-synapse-link-for-cosmos-db/?ref=azurebrasil.cloud) - [Available: Azure Database for MySQL connector for Power Platform and Azure Logic Apps](https://azure.microsoft.com/pt-br/updates/available-azure-database-for-mysql-connector-for-power-platform-and-azure-logic-apps/?ref=azurebrasil.cloud) - [General availability: Azure HBv4 Virtual Machines for HPC ](https://azure.microsoft.com/pt-br/updates/general-availability-azure-hbv4-virtual-machines-for-hpc/?ref=azurebrasil.cloud) - [Database Migration Assessment for Oracle - GA](https://azure.microsoft.com/pt-br/updates/database-migration-assessment-for-oracle-ga/?ref=azurebrasil.cloud) - [General availability: Azure HX Virtual Machines for HPC ](https://azure.microsoft.com/pt-br/updates/general-availability-azure-hx-virtual-machines-for-hpc/?ref=azurebrasil.cloud) - [Azure Key Vault Access Configuration Update](https://azure.microsoft.com/pt-br/updates/key-vault-rbac-access-configuration/?ref=azurebrasil.cloud) - [Generally Available: V2 programming model for Azure Functions using Python ](https://azure.microsoft.com/pt-br/updates/generally-available-v2-programming-model-for-azure-functions-using-python/?ref=azurebrasil.cloud) - [Public Preview: AMD confidential VM option for Azure Data Explorer (ADX) ](https://azure.microsoft.com/pt-br/updates/public-preview-amd-confidential-vm-option-for-azure-data-explorer-adx/?ref=azurebrasil.cloud) - [Build 2023: New Azure App Service plans fuel greater choice and savings](https://azure.microsoft.com/pt-br/updates/build-2023-new-azure-app-service-plans-fuel-greater-choice-and-savings/?ref=azurebrasil.cloud) - [Preview: Red Hat Enterprise Linux (RHEL) 9.2 support for AMD confidential VMs](https://azure.microsoft.com/pt-br/updates/preview-red-hat-enterprise-linux-rhel-92-support-for-amd-confidential-vms/?ref=azurebrasil.cloud) - [AMD Confidential VM option for Azure Databricks](https://azure.microsoft.com/pt-br/updates/amd-confidential-vm-option-for-azure-databricks/?ref=azurebrasil.cloud) - [Optimize your reservation purchases with reservation utilization alerts. ](https://azure.microsoft.com/pt-br/updates/rualerts/?ref=azurebrasil.cloud) - [Public Preview: App Service automatic scaling support in portal UX](https://azure.microsoft.com/pt-br/updates/public-preview-app-service-automatic-scaling-support-in-portal-ux/?ref=azurebrasil.cloud) - [Public Preview: Azure Stream Analytics Schema Registry Integration](https://azure.microsoft.com/pt-br/updates/asaschemaregistry/?ref=azurebrasil.cloud) - [Public Preview: Dynamic Blob container name](https://azure.microsoft.com/pt-br/updates/public-preview-dynamic-blob-container-name/?ref=azurebrasil.cloud) - [General Availability: Azure Monitor managed service for Prometheus](https://azure.microsoft.com/pt-br/updates/general-availability-azure-monitor-managed-service-for-prometheus/?ref=azurebrasil.cloud) - [Optimize your reservation purchases with reservation utilization alerts. ](https://azure.microsoft.com/pt-br/updates/rualerts-3/?ref=azurebrasil.cloud) - [Optimize your reservation purchases with reservation utilization alerts. ](https://azure.microsoft.com/pt-br/updates/rualerts-2/?ref=azurebrasil.cloud) - [Public Preview: Azure Cosmos DB SDKs OpenTelemetry and Application Insights integration](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cosmos-db-sdks-opentelemetry-and-application-insights-integration/?ref=azurebrasil.cloud) - [Generally Available: Exactly Once Delivery to Event Hub Output](https://azure.microsoft.com/pt-br/updates/asa-exactly-once-eh/?ref=azurebrasil.cloud) - [Public preview: Soft delete of Recovery Points for Azure Backup](https://azure.microsoft.com/pt-br/updates/azure-backup-soft-delete-of-recovery-points/?ref=azurebrasil.cloud) - [Azure Stream Analytics is Launching a New Competitive Pricing Model!](https://azure.microsoft.com/pt-br/updates/azure-stream-analytics-is-launching-a-new-competitive-pricing-model/?ref=azurebrasil.cloud) - [Private Preview: Kafka Input and Output with Azure Stream Analytics](https://azure.microsoft.com/pt-br/updates/asa-kafka-privatepreview/?ref=azurebrasil.cloud) - [Virtual Network Integration Support (Public Preview) for Azure Stream Analytics](https://azure.microsoft.com/pt-br/updates/virtual-network-integration-support-public-preview-for-azure-stream-analytics/?ref=azurebrasil.cloud) - [Public Preview: Azure AI Content Safety ](https://azure.microsoft.com/pt-br/updates/announcing-azure-ai-content-safety/?ref=azurebrasil.cloud) - [Generally Available: Exactly Once Delivery to ADLS Gen2 Output](https://azure.microsoft.com/pt-br/updates/generally-available-exactly-once-delivery-to-adls-gen2-output/?ref=azurebrasil.cloud) - [Public Preview: Azure Files geo-redundancy for standard large file shares](https://azure.microsoft.com/pt-br/updates/public-preview-azure-files-georedundancy-for-standard-large-file-shares/?ref=azurebrasil.cloud) - [Generally available: Kafka compaction support in Azure Event Hubs](https://azure.microsoft.com/pt-br/updates/generally-available-kafka-compaction-support-in-azure-event-hubs/?ref=azurebrasil.cloud) - [Generally available: Managed Identities support for Capture in Event Hubs ](https://azure.microsoft.com/pt-br/updates/generally-available-managed-identities-support-for-capture-in-event-hubs/?ref=azurebrasil.cloud) - [GA Azure API Management Self-hosted gateway authentication using Azure Active Directory ](https://azure.microsoft.com/pt-br/updates/ga-azure-api-management-selfhosted-gateway-authentication-using-azure-active-directory/?ref=azurebrasil.cloud) - [Generally Available – Custom domain support for self-hosted gateway configuration endpoint v2 ](https://azure.microsoft.com/pt-br/updates/generally-available-custom-domain-support-for-selfhosted-gateway-configuration-endpoint-v2/?ref=azurebrasil.cloud) - [Generally available: Kafka Connect support in Azure Event Hubs ](https://azure.microsoft.com/pt-br/updates/generally-available-kafka-connect-support-in-azure-event-hubs/?ref=azurebrasil.cloud) - [Generally Available – New Azure Event Grid events for Azure API Management Self-hosted gateway ](https://azure.microsoft.com/pt-br/updates/generally-available-new-azure-event-grid-events-for-azure-api-management-selfhosted-gateway/?ref=azurebrasil.cloud) - [Public Preview: JSON Schema support in Azure Event Hubs Schema Registry for Kafka applications ](https://azure.microsoft.com/pt-br/updates/public-preview-json-schema-support-in-azure-event-hubs-schema-registry-for-kafka-applications/?ref=azurebrasil.cloud) - [Generally available: Apache MirrorMaker 2 support in Azure Event Hubs ](https://azure.microsoft.com/pt-br/updates/generally-available-apache-mirrormaker-2-support-in-azure-event-hubs/?ref=azurebrasil.cloud) - [GA: Logic Apps (Standard) adds support for .NET Framework extensibility in XSLT data. ](https://azure.microsoft.com/pt-br/updates/ga-logic-apps-standard-adds-support-for-net-framework-extensibility-in-xslt-data/?ref=azurebrasil.cloud) - [PublicPreview: Azure API Management: API Center](https://azure.microsoft.com/pt-br/updates/publicpreview-azure-api-management-api-center/?ref=azurebrasil.cloud) - [Public Preview: Data mapping designer in Azure Logic Apps (Standard) ](https://azure.microsoft.com/pt-br/updates/public-preview-data-mapping-designer-in-azure-logic-apps-standard/?ref=azurebrasil.cloud) - [Public Preview – Support for WebSocket APIs in Azure API Management Self-hosted Gateway ](https://azure.microsoft.com/pt-br/updates/public-preview-support-for-websocket-apis-in-azure-api-management-selfhosted-gateway/?ref=azurebrasil.cloud) ### Como utilizar o Azure Cost Management REST API URL: https://www.azurebrasil.cloud/blog/azure-cost-management/ Last updated: 2023-05-24T14:37:01.000Z Muitas vezes temos a necessidade de integrar as APIs da Azure em nossas aplicações e fluxos de trabalho. A Azure nos oferece uma [série de APIs especializadas](https://learn.microsoft.com/en-us/rest/api/azure/?ref=azurebrasil.cloud)! Hoje vamos fazer algumas chamadas a API de *cost management*, com objetivo de obter os gastos diários de qualquer [*subscription* pertencente a sua *tenant*](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/organize-subscriptions?ref=azurebrasil.cloud)*.* Inicialmente vamos registrar uma nova [*application* em nosso Azure AD.](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app?ref=azurebrasil.cloud) ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Screen-Shot-2023-05-12-at-14.40-1.png) Nossa aplicação ira interagir com o Azure por conta própria, não necessitando que nenhum usuário esteja autenticado. Por isso, será preciso [gerar um ](https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal?ref=azurebrasil.cloud#option-3-create-a-new-application-secret)[certificado ou segredo para essa aplicação](https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal?ref=azurebrasil.cloud#option-3-create-a-new-application-secret). ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Group-1011.png) Copie o valor do segredo. Além disso, devemos também salvar outros valores referentes a nossa *tenant Id*, *subscription Id e client Id.* ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Group-1013.png) Para que nossa aplicação possa ler os valores dos gastos diários*,* devemos conceder a permissão de *Reader* da nossa *subscription* para nossa aplicação. Vamos utilizar o [Azure RBAC](https://learn.microsoft.com/en-us/azure/role-based-access-control/overview?ref=azurebrasil.cloud)! Dentro da *subscription,* devemos ir menu *"Access control (IAM)"* e clicar em *"Add role assignment".* ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Screen-Shot-2023-05-12-at-15.10.png) Basta selecionarmos a permissão de *Reader* e a nossa aplicação como alvo da atribuição. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Group-1012.png) Com isso pronto, já podemos criar nosso aplicação. Vamos criar um novo diretório, [uma ](https://learn.microsoft.com/en-us/visualstudio/ide/solutions-and-projects-in-visual-studio?view=vs-2022&ref=azurebrasil.cloud)*[solution](https://learn.microsoft.com/en-us/visualstudio/ide/solutions-and-projects-in-visual-studio?view=vs-2022&ref=azurebrasil.cloud)*[ do .NET](https://learn.microsoft.com/en-us/visualstudio/ide/solutions-and-projects-in-visual-studio?view=vs-2022&ref=azurebrasil.cloud) e um [projeto web básico](https://learn.microsoft.com/en-us/aspnet/core/tutorials/min-web-api?view=aspnetcore-7.0&tabs=visual-studio&ref=azurebrasil.cloud). ``` mkdir AzureCostManagement ``` ``` dotnet new sln ``` ``` dotnet new web -o AzureCostManagement.Api ``` Devemos [adicionar o projeto a *solution*](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-sln?ref=azurebrasil.cloud#add)recém criada*.* ``` dotnet sln add AzureCostManagement.Api/AzureCostManagement.Api.csproj ``` Podemos adicionar algumas configurações ao *appsettings.json* do nosso projeto. ``` "Application": { "AzureAdLoginUrlResource" : "https://login.microsoftonline.com", "AzureAdLoginUrlPath" : "/{0}/oauth2/v2.0/token", "AzureCostManagementUrlResource": "https://management.azure.com", "AzureCostManagementUrlPath": "/subscriptions/{0}/providers/Microsoft.CostManagement/forecast?api-version=2022-10-01", "ClientId" : "", "ClientSecret" : "", "TenantId" : "" } ``` Teremos dois serviços implementados em nosso projeto: - *IEnterpriseIdentityService*: responsável por autenticar a aplicação, e consequentemente obter o *[access token](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens?ref=azurebrasil.cloud)*; - *ICostManagementService:* serviço responsável em fazer a chamada à API[https://management.azure.com](https://management.azure.com/?ref=azurebrasil.cloud). Vamos as interfaces e implementações: ### IEnterpriseIdentityService ``` using AzureCostManagement.Api.Models; namespace AzureCostManagement.Api { public interface IEnterpriseIdentityService { Task GetAccessToken(string scope); } } ``` ``` using System.Text.Json; using AzureCostManagement.Api.Models; namespace AzureCostManagement.Api { public class AzureAdService : IEnterpriseIdentityService { private readonly IConfiguration _configuration; private readonly HttpClient _httpClient; public AzureAdService( IConfiguration configuration, IHttpClientFactory httpclientFactory) { _configuration = configuration; _httpClient = httpclientFactory.CreateClient(); } public async Task GetAccessToken(string scope) { var url = _configuration.GetSection("Application:AzureAdLoginUrlResource").Value!; var path = _configuration.GetSection("Application:AzureAdLoginUrlPath").Value!; var dict = new Dictionary { { "grant_type", "client_credentials" }, { "client_id", _configuration.GetSection("Application:ClientId").Value! }, { "client_secret", _configuration.GetSection("Application:ClientSecret").Value! }, { "scope", $"{scope}/.default" } }; var fullUrl = string.Format( $"{url}{path}", _configuration.GetSection("Application:TenantId").Value!); var requestBody = new FormUrlEncodedContent(dict); var response = await _httpClient.PostAsync(fullUrl, requestBody); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(result)!; } } } ``` ``` using System.Text.Json.Serialization; namespace AzureCostManagement.Api.Models { public record AccessToken { [JsonPropertyName("token_type")] public string TokenType { get; set; } = default!; [JsonPropertyName("expires_in")] public long ExpiresIn { get; set; } [JsonPropertyName("access_token")] public string Token { get; set; } = default!; } } ``` ### ICostManagementService ``` namespace AzureCostManagement.Api.Models { public interface ICostManagementService { Task GetUsageCostsAync(Guid subscriptionId, DateTime endDate, DateTime startDate); } } ``` ``` using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; namespace AzureCostManagement.Api.Models { public record CostManagementResult { [JsonPropertyName("id")] public string Id { get; init; } = default!; [JsonPropertyName("name")] public string Name { get; init; } = default!; [JsonPropertyName("type")] public string Type { get; init; } = default!; [JsonPropertyName("properties")] public CostManagementProperties Properties { get; init; } = default!; } public record CostManagementProperties { [JsonPropertyName("nextLink")] public string? NextLink { get; init; } [JsonPropertyName("columns")] public IEnumerable Columns { get; init; } = default!; [JsonPropertyName("rows")] public IEnumerable> Rows { get; init; } = default!; public IEnumerable RowsFormated { get { var dateFormat = "yyyyMMdd"; return Rows.Select(x => new CostManagementRow { // Amount Amount = ((JsonElement)x.ToArray()[0]).GetDouble(), // Date Date = DateTime.ParseExact( ((JsonElement)x.ToArray()[1]).GetInt64().ToString(), dateFormat, CultureInfo.InvariantCulture), // CostStatus CostStatus = ((JsonElement)x.ToArray()[2]).GetString()!, // Currency Currency = ((JsonElement)x.ToArray()[3]).GetString()!, }); } } } public record CostManagementRow { public double Amount { get; init; } public DateTime Date { get; init; } public string CostStatus { get; init; } = default!; public string Currency { get; init; } = default!; } public record CostManagementColumn { [JsonPropertyName("name")] public string Name { get; set; } = null!; [JsonPropertyName("type")] public string Type { get; set; } = null!; } } ``` ``` using System.Net.Http.Headers; using System.Text; using System.Text.Json; using AzureCostManagement.Api.Models; namespace AzureCostManagement.Api { public class AzureCostManagementService : ICostManagementService { private readonly IEnterpriseIdentityService _enterpriseIdentityService; private readonly IConfiguration _configuration; private readonly HttpClient _httpClient; public AzureCostManagementService( IEnterpriseIdentityService enterpriseIdentityService, IConfiguration configuration, IHttpClientFactory httpClientFactory) { _enterpriseIdentityService = enterpriseIdentityService; _configuration = configuration; _httpClient = httpClientFactory.CreateClient(); } public async Task GetUsageCostsAync(Guid subscriptionId, DateTime endDate, DateTime startDate) { var url = _configuration.GetSection("Application:AzureCostManagementUrlResource").Value!; var path = _configuration.GetSection("Application:AzureCostManagementUrlpath").Value!; var acessToken = await _enterpriseIdentityService.GetAccessToken(url); var request = new CostManagementRequestBuilder() .WithStartDate(startDate) .WithEndDate(endDate) .Build(); var json = JsonSerializer.Serialize(request); var data = new StringContent(json, Encoding.UTF8, "application/json"); var fullUrl = string.Format( $"{url}{path}", subscriptionId); _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", acessToken.Token); var response = await _httpClient.PostAsync(fullUrl, data); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(result)!; } } } ``` Observe que injetamos via [DI](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-7.0&ref=azurebrasil.cloud) o serviço *IEnterpriseIdentityService* dentro da implementação *AzureCostManagementService.* Com os serviços prontos, podemos implementar a classe principal da nossa aplicação! ### Program.cs Como estamos utilizando uma miniaml API, todas as configurações e métodos HTTP irão estar no mesmo arquivo. Iremos injetar via *depedency injection* o serviço de *cost management* no método *GET* e retornar aos usuários os valores de gastos da *subscription* formatados*.* ``` using AzureCostManagement.Api; using Microsoft.AspNetCore.Mvc; var builder = WebApplication.CreateBuilder(args); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddHttpClient(); var app = builder.Build(); app.MapGet("/cost-management", async ( [FromQuery] Guid subscritionId, ICostManagementService costManagementService) => { var today = DateTime.Today; var firstDayOfCurrentMonth = new DateTime(today.Year, today.Month, 1); var lastDayOfCurrentMonth = firstDayOfCurrentMonth.AddMonths(1).AddDays(-1); var data = await costManagementService.GetUsageCostsAync( subscritionId, lastDayOfCurrentMonth, firstDayOfCurrentMonth); return Results.Ok(new { Values = data.Properties.RowsFormated }); }); app.Run(); ``` Podemos executar nosso projeto e fazer a chamada HTTP, passando como *query string* o valor da *subscriptionId.* ``` dotnet run ``` ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Group-1010.png) Temos o resultado: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/Screen-Shot-2023-05-17-at-09.22.png) Isso é tudo pessoal! Você já pode baixar o projeto por esse [](https://github.com/TallesValiatti/AzureSqlReadOnlyReplica?ref=azurebrasil.cloud)[link](https://github.com/TallesValiatti/AzureCostManagementRestApi?ref=azurebrasil.cloud), e não esquece de me seguir no [LinkedIn](https://www.linkedin.com/in/tallesvaliatti/?ref=azurebrasil.cloud)! Até a próxima, abraços! ### Azure Sql: The database 'tempdb' has reached its size quota. URL: https://www.azurebrasil.cloud/blog/azure-sql-the-database-tempdb-has-reached-its-size-quota/ Last updated: 2023-05-22T14:31:02.000Z Ola, Estamos trabalhando em uma migração do Azure Managed Instance para o Azure SQL Hyperscale e durante os testes de ensaio nos deparamos com o seguinte erro: The database 'tempdb' has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. A primeira reação é o erro não fazer sentido uma vez que o próprio Azure deveria tomar conta disso. Conversando com os [magos da PowerTunning](https://powertuning.com.br/?ref=azurebrasil.cloud) eles pontuaram que os limites do tempdb estão especificados na documentação. [![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image-4.png)](https://learn.microsoft.com/en-us/azure/azure-sql/database/resource-limits-vcore-single-databases?view=azuresql&ref=azurebrasil.cloud#hyperscale---serverless-compute---gen-5) https://learn.microsoft.com/en-us/azure/azure-sql/database/resource-limits-vcore-single-databases?view=azuresql#hyperscale---serverless-compute---gen-5 O que condiz perfeitamente com o erro, durante o primeiro teste para acelerar a criação dos índices eu aumentei o banco de testes para 16 gigas, mas no segundo teste eu queria saber quanto tempo demoraria com as configurações mínimas então deixei um máximo de 4 cores. A solução nesse caso é aumentar o número de processadores do banco e diminuir assim que o script terminar de rodar. Nos siga para mais dicas e erros do dia a dia. ### Resumo Semanal #5 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-5/ Last updated: 2023-05-22T12:55:06.000Z ### Azure Updates - [General Availability: Azure Center for SAP solutions](https://azure.microsoft.com/pt-br/updates/azure-center-for-sap-solutions-is-now-generally-available/?ref=azurebrasil.cloud) - [Generally available: Policy analytics for Azure Firewall ](https://azure.microsoft.com/pt-br/updates/generally-available-policy-analytics-for-azure-firewall/?ref=azurebrasil.cloud) - [Private preview: Azure Backup support for confidential VMs using Customer Managed Keys](https://azure.microsoft.com/pt-br/updates/private-preview-azure-backup-support-for-confidential-vms-using-customer-managed-keys/?ref=azurebrasil.cloud) - [General Availability : Azure Monitor for SAP solutions](https://azure.microsoft.com/pt-br/updates/general-availability-azure-monitor-for-sap-solutions/?ref=azurebrasil.cloud) - [Public preview: Azure Container Storage](https://azure.microsoft.com/pt-br/updates/public-preview-azure-container-storage/?ref=azurebrasil.cloud) - [Microsoft Azure Payment HSM Service now supports two host IP network interfaces](https://azure.microsoft.com/pt-br/updates/microsoft-azure-payment-hsm-service-now-supports-two-host-ip-network-interfaces/?ref=azurebrasil.cloud) - [Switch to Azure AD authentication for application insights by 30 September 2025](https://azure.microsoft.com/pt-br/updates/switch-to-azure-ad-authentication-for-application-insights-by-30-september-2025/?ref=azurebrasil.cloud) - [Transition to Azure AD to query data from Azure Monitor application insights by 31 March 2026](https://azure.microsoft.com/pt-br/updates/transition-to-azure-ad-to-query-data-from-azure-monitor-application-insights-by-31-march-2026/?ref=azurebrasil.cloud) - [App Service now supports Custom Error pages in public preview](https://azure.microsoft.com/pt-br/updates/customerrorpages/?ref=azurebrasil.cloud) - [General availability: Seamlessly upgrade your Application Gateway V2 WAF configuration to a policy](https://azure.microsoft.com/pt-br/updates/general-availability-application-gateway-v2-config-to-policy-upgrade-experience/?ref=azurebrasil.cloud) - [Public preview: Optimize your workloads for reliability using new workbook template in Azure Advisor](https://azure.microsoft.com/pt-br/updates/public-preview-optimize-your-workloads-for-reliability-using-new-workbook-template-in-azure-advisor/?ref=azurebrasil.cloud) - [Azure Backup Reports now includes support for more workloads](https://azure.microsoft.com/pt-br/updates/azure-backup-reports-now-includes-support-for-more-workloads/?ref=azurebrasil.cloud) - [General Availability: Routing Intent and Virtual WAN Integrated Firewall NVAs](https://azure.microsoft.com/pt-br/updates/general-availability-routing-intent-and-virtual-wan-integrated-firewall-nvas/?ref=azurebrasil.cloud) - [General availability: Azure Data Explorer adds new geospatial capabilities](https://azure.microsoft.com/pt-br/updates/azure-data-explorer-adds-new-geospatial-capabilities-buffer/?ref=azurebrasil.cloud) - [Generally available: Azure Site Recovery update rollup 67 - May 2023](https://azure.microsoft.com/pt-br/updates/generally-available-azure-site-recovery-update-rollup-67-may-2023/?ref=azurebrasil.cloud) - [Public preview: Rolling Upgrades with MaxSurge for Virtual Machine Scale Sets](https://azure.microsoft.com/pt-br/updates/rollingupgradeswithmaxsurge/?ref=azurebrasil.cloud) - [Public Preview: Azure NetApp Files Standard Network Features - Edit Volumes](https://azure.microsoft.com/pt-br/updates/public-preview-azure-netapp-files-edit-network-features/?ref=azurebrasil.cloud) ### Azure Functions: Erro Could not create BlobContainerClient for ScheduleMonitor URL: https://www.azurebrasil.cloud/blog/azure-functions-erro-could-not-create-blobcontainerclient-for-schedulemonitor/ Last updated: 2023-05-18T15:32:52.000Z Estou iniciando um novo projeto para os clientes da AzureBrasil.cloud e durante o setup do projeto de functions me deparei com o seguinte erro: ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image-3.png) Microsoft.Azure.WebJobs.Extensions.Timers.Storage: Could not create BlobContainerClient for ScheduleMonitor Perdi um bom tempo tentando entender qual seria o problema, uma vez que tinha apenas uma função time trigger e algumas configurações de ambiente e serviços como mudança no template básico. Pesquisando pelo erro a maioria dos artigos falava que o problema estava relacionado a falta do emulador (ou docker contêiner) rodando local, mas eu já tinha checado isso e até reiniciei o computador pensando que poderia ser alguma coisa com o docker. Por um acaso me deparei com essa [resposta no SO](https://stackoverflow.com/questions/74227377/could-not-create-blobcontainerclient-for-schedulemonitor-for-az-funcitons-isolat?ref=azurebrasil.cloud) que aponta para o problema de usar configurações em formato de objetos no arquivo JSON. E realmente esse é o problema quando usamos o modelo isolated, ele não faz o parse correto. **Configuração errada:** ``` { "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "ConnectionStrings": { "DefaultConnection": "Data Source=.;Initial Catalog=AzureBrasil;Integrated Security=True;TrustServerCertificate=true", "CacheConnection": "localhost:32768" } } } ``` **Configuração correta:** ``` { "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "ConnectionStrings__DefaultConnection": "Data Source=.;Initial Catalog=AzureBrasil;Integrated Security=True;TrustServerCertificate=true" } } ``` Seguindo o modelo de configuração padrão do .net core, quando precisamos especificar uma chave de objetos utilizamos um duplo underscore **\_\_** para cara nível do objeto. Com isso temos nosso problema resolvido! \[\]s e até a próxima. ### Preview: Serviço de Aplicativo do Azure - Dimensionamento Automático URL: https://www.azurebrasil.cloud/blog/preview-servico-de-aplicativo-do-azure-dimensionamento-automatico/ Last updated: 2023-05-16T12:21:21.000Z Uma novidade interessante que saiu semana passada foi a possibilidade de termos escala automática do Azure App Service baseado na quantidade de requisições http e não somente baseado em métricas. É interessante, pois traz um recurso que existe no Azure Functions que pode auxiliar muito, mas, por outro lado, pode ser bem mais caro que a escala tradicional baseada em métricas. 💡 Tenha em mente que na época em que escrevo o artigo a feature foi recém anunciada em PREVIEW e até o lançamento geral muita coisa pode e deve mudar. Para conferir as últimas novidades desse recurso e entender melhor como funciona recomendo ler a [documentação oficial](https://learn.microsoft.com/en-us/azure/app-service/manage-automatic-scaling?tabs=azure-portal&ref=azurebrasil.cloud). No geral o time do Azure App Service esta trazendo um recurso que já existe no Azure Functions, que é ter a opção de escala automática baseado na carga e não em métricas como CPU e/ou Memoria. Inclusive uma grande reclamação de quem utiliza Azure Functions em um App Service Plan é a falta desse recurso. Por outro lado, para a escala automática funciona ele mantém no mínimo uma instância pronta para uso (chamamos de warm state) o que vai no mínimo duplicar seus custos com o App Service. ### Como funciona Quando voce habilita o dimensionamento automático, seu trafego começa a ser monitorado e o próprio Azure decide quando adicionar ou remover novas instâncias. Um ponto de atenção é que a escala acontece no nivel do Plano do Aplicativo, logo todos os Serviços de Aplicativo que estiverem contidos naquele plano também irão ser escalados. 💡 O recurso [Always ON](https://learn.microsoft.com/en-us/azure/app-service/configure-common?tabs=portal&ref=azurebrasil.cloud#configure-general-settings) precisa estar desabilitado para a escala automática funcionar. Para habilitarmos basta apenas selecionarmos a opção de escala automática no portal do Azure. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image-1.png) Habilitando a escala automática no portal do Azure ### Conclusão Embora eu tenha gostado muito da opção de escala automática ainda acho um pouco complicado sermos forçados a termos que sempre deixar ao menos uma instância no modo "Always Ready" o que nos força a pagar por uma instância que talvez não será usada. Para finalizar, segue uma comparação entre os modos de escala disponíveis hoje. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image-2.png) ### Resumo Semanal #4 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-4/ Last updated: 2023-05-15T12:54:07.000Z ### Azure Updates - [Preview: Automatic Scaling for App Service Web Apps](https://azure.microsoft.com/pt-br/updates/preview-automatic-scaling-for-app-service-web-apps/?ref=azurebrasil.cloud) - [Public preview: Always Serve for Azure Traffic Manager](https://azure.microsoft.com/pt-br/updates/alwaysserve/?ref=azurebrasil.cloud) - [Generalized Azure Compute Gallery custom image support in Update management center](https://azure.microsoft.com/pt-br/updates/generalized-azure-compute-gallery-custom-image-support-in-update-management-center/?ref=azurebrasil.cloud) - [Generally available: Azure DNS Private Resolver is available in 8 additional regions](https://azure.microsoft.com/pt-br/updates/generally-available-azure-dns-private-resolver-is-available-in-8-additional-regions/?ref=azurebrasil.cloud) - [General availability: Inbound ICMPv4 pings are now supported on Azure Load Balancer](https://azure.microsoft.com/pt-br/updates/general-availability-inbound-icmpv4-pings-are-now-supported-on-azure-load-balancer/?ref=azurebrasil.cloud) - [Public Preview: App Service Minimum TLS Cipher Suite Now on Azure Portal](https://azure.microsoft.com/pt-br/updates/app-service-min-tls-cipher-suite-preview/?ref=azurebrasil.cloud) - [General availability: Azure Sphere OS version 23.05 expected on May 24](https://azure.microsoft.com/pt-br/updates/general-availability-azure-sphere-os-version-2305-expected-on-may-24/?ref=azurebrasil.cloud) - [Azure VMware Solution on Azure Government](https://azure.microsoft.com/pt-br/updates/azure-vmware-solution-on-azure-government/?ref=azurebrasil.cloud) - [Generally available: Azure Monitor Agent supports Linux Hardening for CIS and SELinux](https://azure.microsoft.com/pt-br/updates/generally-available-azure-monitor-agent-supports-linux-hardening-for-cis-and-selinux/?ref=azurebrasil.cloud) - [Public Preview: Azure Monitor OpenTelemetry Distro for ASP.NET Core, JavaScript (Node.js), Python](https://azure.microsoft.com/pt-br/updates/public-preview-azure-monitor-opentelemetry-distro-for-aspnet-core-javascript-nodejs-python/?ref=azurebrasil.cloud) - [Azure SQL—Public preview updates for early-May 2023](https://azure.microsoft.com/pt-br/updates/azure-sql-public-preview-updates-for-earlymay-2023/?ref=azurebrasil.cloud) - [Azure SQL—General availability updates for mid-May 2023](https://azure.microsoft.com/pt-br/updates/azure-sql-general-availability-updates-for-midmay-2023/?ref=azurebrasil.cloud) - [Azure Advisor data in Azure Resource Graph is now available in Azure China and US Government clouds](https://azure.microsoft.com/pt-br/updates/azure-advisor-data-in-azure-resource-graph-is-now-available-in-azure-china-and-us-government-clouds/?ref=azurebrasil.cloud) - [GA: GitHub action to build and deploy to Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/ga-github-action-to-build-and-deploy-to-azure-container-apps/?ref=azurebrasil.cloud) - [Public Preview: Troubleshooting guides for Azure Database for PostgreSQL Flexible Server ](https://azure.microsoft.com/pt-br/updates/public-preview-troubleshooting-guides-for-azure-database-for-postgresql-flexible-server/?ref=azurebrasil.cloud) - [Public preview: Azure Cache for Redis trigger for Azure Functions](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cache-for-redis-trigger-for-azure-functions/?ref=azurebrasil.cloud) - [Public preview: 99th percentile latency metric in Azure Cache for Redis](https://azure.microsoft.com/pt-br/updates/public-preview-99th-percentile-latency-metric-in-azure-cache-for-redis/?ref=azurebrasil.cloud) - [General Availability: Azure Database for MySQL - Flexible Server major version upgrade](https://azure.microsoft.com/pt-br/updates/general-availability-azure-database-for-mysql-flexible-server-major-version-upgrader/?ref=azurebrasil.cloud) - [GA: Azure Pipelines task to build and deploy to Azure Container Apps](https://azure.microsoft.com/pt-br/updates/ga-azure-pipelines-task-to-build-and-deploy-to-azure-container-apps/?ref=azurebrasil.cloud) - [Public Preview – Azure Cache for Redis now supports aAAD based authentication and authorization](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cache-for-redis-now-supports-aaad-based-authentication-and-authorization/?ref=azurebrasil.cloud) - [Public Preview: Cross Origin Resource Sharing (CORS) in Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/public-preview-cross-origin-resource-sharing-cors-in-azure-container-apps/?ref=azurebrasil.cloud) - [Public preview: Init containers in Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/public-preview-init-containers-in-azure-container-apps/?ref=azurebrasil.cloud) - [Public Preview: Database-is-alive metrics for monitoring Azure Postgres Flexible Server database availability.](https://azure.microsoft.com/pt-br/updates/public-preview-databaseisalive-metrics-for-monitoring-azure-postgres-flexible-server-database-availability-2/?ref=azurebrasil.cloud) - [Azure VMware Solution now available in Qatar with AV36P](https://azure.microsoft.com/pt-br/updates/azure-vmware-solution-now-available-in-qatar-with-av36p/?ref=azurebrasil.cloud) - [Generally available: Azure Bastion now support shareable links](https://azure.microsoft.com/pt-br/updates/generally-available-azure-bastion-shareable-links/?ref=azurebrasil.cloud) - [General Availability: AzAcSnap 8 — Azure Application Consistent Snapshot tool updates](https://azure.microsoft.com/pt-br/updates/general-availability-azacsnap-8-azure-application-consistent-snapshot-tool-updates/?ref=azurebrasil.cloud) - [Alert processing rules fields update ](https://azure.microsoft.com/pt-br/updates/alert-processing-rules-fields-update/?ref=azurebrasil.cloud) - [General Availability: Azure Automation supports Python 3.8 runbooks](https://azure.microsoft.com/pt-br/updates/azure-automation-python3-ga/?ref=azurebrasil.cloud) - [We're retiring Speech-to-text REST preview API v3.1-preview.1 on May 12, 2023](https://azure.microsoft.com/pt-br/updates/were-retiring-speechtotext-rest-preview-api-v31preview1-on-may-12-2023/?ref=azurebrasil.cloud) ### Estudo de Caso: Transformando PDF's em API URL: https://www.azurebrasil.cloud/blog/estudo-de-caso-transformando-pdfs-em-api/ Last updated: 2025-02-19T14:24:39.000Z Iniciando uma nova categoria de posts por aqui, quero compartilhar de tempos em tempos alguns estudos de caso envolvendo ferramentas do Azure. No nosso estudo de hoje iremos abordar como utilizamos Playwright, Azure Logic Apps, Azure Container Instance e Azure Form Recognizer para extrair dados de múltiplos PDFs e criar uma API. ### Desafio Similar ao Brasil, nos Estados Unidos existem vários concelhos profissionais para várias áreas da saúde, cada estado tem seu próprio conselho. Esses conselhos publicam documentos regulares de profissionais que tiveram sua licença suspensa por um período ou permanentemente, cada conselho publica essas informações de um modo, sendo a maioria em PDFs e Excel. Como a empresa vende serviços de validação de diplomas e registros nos concelhos estávamos procurando uma maneira de automatizar essas consultas e criar uma API que o sistema principal pudesse checar se um determinado profissional está banido ou não de exercer a profissão. Os principais desafios são: - Recuperar os arquivos: Os sites não possuem APIs e nem um período pré-determinado para publicação. - Extrair os dados dos arquivos: Os arquivos no formato Excel são mais fáceis de extrair os dados, mas transformar os dados do PDF de uma forma confiável já fica um pouco mais difícil. ### Solução proposta Para recuperar os arquivos decidimos utilizar o [Playwright](https://playwright.dev/dotnet/?ref=azurebrasil.cloud) que é uma ferramenta de automação em cima do Chromium. Após testar algumas ferramentas pagas, optamos pelo [Azure Form Recognizer](https://learn.microsoft.com/en-us/azure/applied-ai-services/form-recognizer/?view=form-recog-3.0.0&ref=azurebrasil.cloud) para fazer a extração dos dados. Como precisamos rodar a ferramenta todos os dias para checar por novos arquivos adicionamos o [Azure Logic Apps](https://learn.microsoft.com/en-us/azure/logic-apps/?ref=azurebrasil.cloud) para termos um agendamento para rodar nosso contêiner no [Azure Container Instance](https://learn.microsoft.com/en-us/azure/container-instances/?ref=azurebrasil.cloud) que é cobrado apenas por tempo de execução. A execução ficou assim: - **Azure Logic Apps**: Inicia uma nova execução do Azure Container Instance todos os dias as 8:00AM. - **Azure Container Instance**: Executa um contêiner com imagem customizada, que possui uma console app com toda a lógica a aplicação. - **Aplicação**: Para cada site suportado, inicia uma instância do Playwright, verifica se existe um novo arquivo, em caso positivo faz o download e envia para o Azure Form Recognizer. - **Azure Form Recognizer**: Transforma o texto do PDF em um JSON estruturado, para nós o interessante é a função que retorna tabelas de forma estruturada. Uma vez com os dados em formato JSON aplicamos algumas regras do negócio e inserimos no banco de dados que a API utiliza posteriormente para rodar as consultas. Para não ficar só nas minhas palavras, segue um código de exemplo fazendo o parse de um arquivo PDF e utilizando o Azure Form Recognizer para fazer o parse da tabela. O único pacote que precisa ser referenciado é o **Azure.AI.FormRecognizer.** ``` class Program { private static readonly string endpoint = "https://seu-form-recognizer.cognitiveservices.azure.com/"; private static readonly string apiKey = "sua-api-key"; private static readonly AzureKeyCredential Credential = new AzureKeyCredential(apiKey); static async Task Main(string[] args) { var fileName = "seu-arquivo.pdf"; var sampleDocument = File.OpenRead(fileName); var watch = Stopwatch.StartNew(); var client = new FormRecognizerClient(new Uri(endpoint), Credential); var formPages = await client.StartRecognizeContentAsync(sampleDocument) .WaitForCompletionAsync(); watch.Stop(); Console.WriteLine($"Time to convert file: {watch.Elapsed:g}"); foreach (var page in formPages.Value) { if (!page.Tables.Any()) { continue; } var fileData = new List(); var table = page.Tables.First(); var rows = table.Cells.GroupBy(c => c.RowIndex).ToList(); foreach (var row in rows) { var cells = row.ToList(); var line = cells[0].Text; line += $" | {cells[1].Text}"; line += $" | {cells[2].Text}"; line += $" | {cells[3].Text}"; line += $" | {cells[4].Text}"; fileData.Add(line); } await File.WriteAllLinesAsync($"{fileName}_{page.PageNumber}.txt", fileData); } Console.WriteLine("Done!"); } } ``` ### Custos Se você chegou até aqui deve estar curioso quanto uma solução dessa custa por mês. O custo estimado total é de **$10.49 USD**. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/05/image.png) - **Azure Logic Apps**: Temos direito a **4 mil execuções por mês gratuitas**. Como fazemos uma unica execução por dia iremos utilizar apenas 30, então no nosso caso o serviço não terá custos. - **Azure Container Instances**: O código leva em média 5 minutos para executar todos os crawlers e parses, como pagamos apenas pelo hardware utilizado (no caso 2 vcpus e 4 gb de memória) em **30 dias gastaremos apenas $0.49** - **Azure Form Recognizer**: Temos direito a 500 páginas gratuitas por mês, na solução proposta guardamos o hash do arquivo e apenas processamos em caso de mudança, mas mesmo estimando uma média de **1000 páginas por mês nosso custo é de apenas $10.00**. ### Links Uteis - Exemplos do Azure Form Recognizer: [https://learn.microsoft.com/en-us/samples/azure/azure-sdk-for-net/azure-form-recognizer-client-sdk-samples/?view=form-recog-3.0.0](https://learn.microsoft.com/en-us/samples/azure/azure-sdk-for-net/azure-form-recognizer-client-sdk-samples/?view=form-recog-3.0.0&ref=azurebrasil.cloud) - Primeiros passos com o Playwright: [https://playwright.dev/dotnet/docs/library](https://playwright.dev/dotnet/docs/library?ref=azurebrasil.cloud) - Exemplos do Logic Apps: [https://learn.microsoft.com/en-us/samples/browse/?products=azure-logic-apps](https://learn.microsoft.com/en-us/samples/browse/?products=azure-logic-apps&ref=azurebrasil.cloud) - Exemplos do Azure Container Instance: [https://learn.microsoft.com/en-us/samples/browse/?products=azure&terms=container%2Binstance](https://learn.microsoft.com/en-us/samples/browse/?products=azure&terms=container%2Binstance&ref=azurebrasil.cloud) ### Conclusão De uma maneira simples e objetiva conseguimos propor uma solução altamente escalável e de baixo custo que resolveu o problema do cliente. Foi um desafio bem legal de se implementar e ver funcionando em produção. E você, como resolveria de alguma outra forma? Gostaria de saber mais detalhes de alguma das implementações? ### Resumo Semanal #3 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-3/ Last updated: 2023-05-08T12:36:22.000Z ### Azure Updates - [Generally available: Azure Event Hubs Dedicated self-serve scalable clusters for mission critical Kafka, AMQP and HTTPs workloads](https://azure.microsoft.com/pt-br/updates/generally-available-azure-event-hubs-dedicated-selfserve-scalable-clusters-for-mission-critical-kafka-amqp-and-https-workload/?ref=azurebrasil.cloud) - [Generally available: Zone Redundant Storage for Azure Disks is available in Southeast Asia, Australia East and Qatar Central.](https://azure.microsoft.com/pt-br/updates/generally-available-zone-redundant-storage-for-azure-disks-is-available-in-southeast-asia-australia-east-and-qatar-central/?ref=azurebrasil.cloud) - [Preview: Cloud Next-Generation Firewall (NGFW) Palo Alto Networks - an Azure Native ISV Service](https://azure.microsoft.com/pt-br/updates/public-preview-cloud-next-generation-firewall-for-azure-from-palo-alto-networks/?ref=azurebrasil.cloud) - [Generally available: Serverless SQL for Azure Databricks ](https://azure.microsoft.com/pt-br/updates/generally-available-serverless-sql-for-azure-databricks/?ref=azurebrasil.cloud) - [Generally Available: Azure Backup Server V4](https://azure.microsoft.com/pt-br/updates/mabsv4/?ref=azurebrasil.cloud) - [Generally Available: Ebsv5 and Ebdsv5 NVMe-enabled VM sizes](https://azure.microsoft.com/pt-br/updates/generally-available-ebsv5-and-ebdsv5-nvmeenabled-vm-sizes/?ref=azurebrasil.cloud) - [Public Preview: Palo Alto Networks SaaS Cloud NGFW Integration with Virtual WAN](https://azure.microsoft.com/pt-br/updates/public-preview-palo-alto-networks-saas-cloud-ngfw-integration-with-virtual-wan/?ref=azurebrasil.cloud) - [Public preview: Azure Cold Storage](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cold-storage/?ref=azurebrasil.cloud) - [General availability: Azure IoT Edge supports Red Hat Enterprise Linux 9](https://azure.microsoft.com/pt-br/updates/general-availability-azure-iot-edge-supports-rhel-9/?ref=azurebrasil.cloud) - [Retirement of SQL Server Native Client (SNAC) OLE DB provider for linked servers in Azure SQL Managed Instance](https://azure.microsoft.com/pt-br/updates/retirement-of-sql-server-native-client-snac-ole-db-provider-for-linked-servers-in-azure-sql-managed-instance/?ref=azurebrasil.cloud) ### Resumo Semanal #2 URL: https://www.azurebrasil.cloud/blog/resumo-semanal-2/ Last updated: 2023-05-01T13:17:35.000Z ### Azure Updates - [Preview: Introducing DCesv5 and ECesv5-series Confidential VMs with Intel TDX ](https://azure.microsoft.com/pt-br/updates/confidential-vms-with-intel-tdx-dcesv5-ecesv5/?ref=azurebrasil.cloud) - [Generally available: Cross-region service endpoints for Azure Storage](https://azure.microsoft.com/pt-br/updates/generally-available-crossregion-service-endpoints-for-azure-storage/?ref=azurebrasil.cloud) - [Azure Service Fabric 9.1 Third Refresh Release](https://azure.microsoft.com/pt-br/updates/azure-service-fabric-91-third-refresh-release-2/?ref=azurebrasil.cloud) - [Public Preview: Support for Azure VMs using Premium SSD v2 in Azure Backup](https://azure.microsoft.com/pt-br/updates/premium-ssd-v2-backup-support/?ref=azurebrasil.cloud) - [Generally available: Synthetic GraphQL](https://azure.microsoft.com/pt-br/updates/generally-available-synthetic-graphql-2/?ref=azurebrasil.cloud) - [Generally available: API Management Authorizations ](https://azure.microsoft.com/pt-br/updates/generally-available-api-management-authorizations/?ref=azurebrasil.cloud) - [Generally Available: TCP support for Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/generally-available-tcp-support-for-azure-container-apps/?ref=azurebrasil.cloud) - [Public preview: Session affinity for Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/public-preview-session-affinity-for-azure-container-apps/?ref=azurebrasil.cloud) - [Generally Available: Inbound IP restrictions for Azure Container Apps ](https://azure.microsoft.com/pt-br/updates/generally-available-inbound-ip-restrictions-for-azure-container-apps/?ref=azurebrasil.cloud) - [Generally Available: Operation Abort in AKS](https://azure.microsoft.com/pt-br/updates/generally-available-operation-abort-in-aks/?ref=azurebrasil.cloud) - [Generally available: Azure Monitor alerts now suggests signals to alert on](https://azure.microsoft.com/pt-br/updates/generally-available-azure-monitor-alerts-now-suggests-signals-to-alert-on/?ref=azurebrasil.cloud) - [Public Preview: Azure Monitor Metrics Dataplane API released](https://azure.microsoft.com/pt-br/updates/public-preview-azure-monitor-metrics-dataplane-api-released/?ref=azurebrasil.cloud) - [Continuous Language ID in Azure Speech Service](https://azure.microsoft.com/pt-br/updates/continuous-language-id-in-azure-speech-service/?ref=azurebrasil.cloud) - [Public Preview: Azure API Management and Microsoft Defender for APIs integration](https://azure.microsoft.com/pt-br/updates/public-preview-azure-api-management-and-microsoft-defender-for-apis-integration/?ref=azurebrasil.cloud) - [General Availability: Centrally Managed Azure Hybrid Benefit for SQL Server](https://azure.microsoft.com/pt-br/updates/general-availablility-centrally-managed-azure-hybrid-benefit-for-sql-server/?ref=azurebrasil.cloud) - [Azure Advisor VM/VMSS right-sizing recommendations with custom lookback period](https://azure.microsoft.com/pt-br/updates/azure-advisor-vmvmss-rightsizing-recommendations-with-custom-lookback-period/?ref=azurebrasil.cloud) - [Azure SQL—General availability updates for late-April 2023 ](https://azure.microsoft.com/pt-br/updates/azure-sql-general-availability-updates-for-lateapril-2023/?ref=azurebrasil.cloud) - [General availability: Microsoft Azure available from new cloud region in Poland ](https://azure.microsoft.com/pt-br/updates/general-availability-microsoft-azure-available-from-new-cloud-region-in-poland/?ref=azurebrasil.cloud) - [Update your IoT Edge devices on Ubuntu 18.04 LTS](https://azure.microsoft.com/pt-br/updates/update-ubuntu-1804/?ref=azurebrasil.cloud) - [Public Preview : Azure Cosmos DB for PostgreSQL Data Encryption with Customer Managed Keys](https://azure.microsoft.com/pt-br/updates/public-preview-azure-cosmos-db-for-postgresql-data-encryption-with-customer-managed-keys/?ref=azurebrasil.cloud) - [New Azure Virtual Desktop features to answer our customers’ top needs ](https://azure.microsoft.com/pt-br/updates/new-azure-virtual-desktop-features-to-answer-our-customers-top-needs/?ref=azurebrasil.cloud) ### Azure Functions: Iniciando apenas uma função URL: https://www.azurebrasil.cloud/blog/azure-functions-iniciando-apenas-uma-funcao/ Last updated: 2023-04-27T19:16:38.000Z Ola pessoALL, Uma dúvida muito comum para quem trabalha com Azure Functions é como iniciar apenas funções especificas. [A documentação](https://learn.microsoft.com/en-us/azure/azure-functions/disable-function?tabs=portal&ref=azurebrasil.cloud#localsettingsjson) nos da algumas formas de desabilitarmos funções individualmente, mas geralmente nossa necessidade é iniciar uma ou algumas funções em específico. Rodando pela internet acabei encontrando uma maneira, utilizando uma configuração não documentada. #### Arquivo host.json A chave está na [própria documentação](https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json?ref=azurebrasil.cloud) do Azure. Temos uma entrada no arquivo chamada "functions" onde podemos especificar quais funções desejamos iniciar e um array vazio significa todas as funções. O maior problema é esquecermos essa configuração no arquivo e publicarmos sem habilitarmos todas as funções, o que poderia ocasionar problemas em produção. [![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/04/image-11.png)](https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json?ref=azurebrasil.cloud#functions) A documentação também nos fornece outra dica extremamente importante, para alterarmos alguma configuração, podemos adicionar nos nossos arquivos entradas no seguinte formato: **AzureFunctionsJobHost\_\_path\_\_to\_\_setting.** Como a configuração "functions" é um array precisamos especificar cada função desejada individualmente, sendo assim no nosso arquivo local.settings.json ficaria com o seguinte formato: ```json { "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "AzureFunctionsJobHost__functions__0": "functionName" } } ``` Tudo o que precisamos fazer é adicionar valores obedecendo ao formato **"AzureFunctionsJobHost\_\_functions\_\_0"** onde cada linha terá seu índice de posição no array. Finalizando, vou mostrar a aplicação rodando antes e depois da configuração. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/04/image-12.png) Antes da configuração, todas as funções executando ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/04/image-13.png) Apenas a função específica sendo iniciada. Espero ter ajudado com essa dica. \[\]s e até a próxima. ### Descubra como economizar até 60% no Azure sem comprometer a qualidade! URL: https://www.azurebrasil.cloud/blog/descubra-como-economizar-ate-60-no-azure-sem-comprometer-a-qualidade/ Last updated: 2025-03-31T13:21:18.000Z Você está pronto para desvendar estratégias eficientes de **redução de custos de até 60% no Azure**, sem afetar a qualidade do serviço ou precisar de reestruturação e refatoração de projetos? Então, você está no lugar certo! Com a crescente migração das empresas para soluções em nuvem, os investimentos e consumo neste setor aumentam constantemente. Frente à valorização do dólar, a otimização de custos torna-se essencial para reduzir gastos e possibilitar a implementação de novos projetos. E empresas que contratam o Azure por meio de cartão de crédito enfrentam impostos adicionais, tornando a operação ainda mais onerosa. É por isso que nós, da AzureBrasil.cloud, nos dedicamos a desenvolver **ferramentas e estratégias** que auxiliem nossos clientes na **otimização automática de seus ambientes no Azure**. Como fizemos com a [MarqPonto](https://marqponto.com.br/?ref=azurebrasil.cloud). A empresa enfrentava desafios, incertezas e dificuldades para determinar se seus recursos estavam sendo utilizados de maneira eficiente e se havia espaço para redução de custos sem prejudicar o desempenho do ambiente. Diante dessa situação, a empresa nos procurou. Após uma reunião para entender suas necessidades e objetivos, iniciamos a análise do ambiente em busca de melhorias de desempenho e custos. Com o uso de uma **ferramenta própria de análise**, mergulhamos no universo de recursos e serviços utilizados pela empresa. Comparamos os custos e identificamos oportunidades para otimizar a utilização de recursos e os gastos. Também buscamos opções de migração para camadas mais vantajosas, com adequação de preço, sem comprometer a qualidade dos serviços. Após análise minuciosa, apresentamos os resultados e as recomendações à empresa. Para a surpresa e satisfação dos gestores, **a aplicação das medidas sugeridas resultou em uma redução inicial de 52% nos custos**. Mas o trabalho não parou por aí. Foi apresentada uma lista de itens adicionais que, se implementados, poderiam proporcionar ainda mais economia no futuro. Através dessa parceria, **a MarqPonto conseguiu otimizar seus gastos no Azure e se tornou mais consciente e capaz de gerenciar seu ambiente em nuvem de forma eficiente**. O caso serve como um exemplo para você que enfrenta desafios semelhantes e busca soluções inovadoras para otimizar seus recursos e reduzir custos. E para você compreender melhor o universo Azure, veja algumas das estratégias e práticas que utilizamos para que nossos clientes alcancem resultados surpreendentes. 💡 Entre em contato conosco e descubra como podemos te ajudar. [EU QUERO REVISAR MEU AMBIENTE AZURE](https://www.azurebrasil.cloud/consultoria-finops) ### Azure Advisor: Seu Consultor Personalizado O Azure Advisor é uma ferramenta inteligente e personalizada projetada para ajudar você a aproveitar ao máximo sua experiência na nuvem. Ele atua como um serviço de consultoria personalizado, analisando continuamente seus recursos e fornecendo recomendações valiosas para melhorar o desempenho, a segurança e a eficiência de custos de sua infraestrutura na nuvem. Com o Azure Advisor, você pode ter a confiança de que está tomando decisões baseadas em dados e obtendo o melhor retorno sobre seu investimento. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/04/image-8.png) ### Gerencie seus gastos com o Azure Cost Management O Azure Cost Management é uma ferramenta projetada para ajudá-lo a monitorar, controlar e otimizar seus gastos no Azure. Com ele você terá acesso a ferramentas e recursos avançados para monitorar, analisar e reduzir seus gastos na nuvem, garantindo que seu investimento seja eficiente e rentável. Deixe de se preocupar com custos inesperados e concentre-se no crescimento de seus negócios, enquanto o Azure Cost Management cuida de seus gastos na nuvem. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/04/image-9.png) ### Economize com as Reservas do Azure As Reservas do Azure permitem que você adquira recursos de nuvem com descontos significativos em comparação aos preços padrão, garantindo previsibilidade e otimização dos custos. Ideais para cargas de trabalho previsíveis e de uso contínuo, as Reservas do Azure podem ser aplicadas a diversos serviços. Com as Reservas, você tem acesso prioritário aos recursos do Azure, garantindo a continuidade e a eficiência de suas operações na nuvem. Faça parte das empresas líderes que estão aproveitando as Reservas do Azure e obtenha vantagem competitiva, otimizando seus custos e garantindo a excelência de seus serviços. Aproveite as Reservas do Azure e dê um salto à frente no sucesso de seu negócio! ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/04/image-10.png) ### Maximize seus investimentos no Azure com análises personalizadas e impulsione seu negócio! Descubra o verdadeiro potencial do Azure com análises personalizadas, uma abordagem poderosa e única para otimizar seu ambiente na nuvem. Ao adaptar a análise às especificidades de sua empresa, você identificará oportunidades de redução de custos e maximizará a eficiência, garantindo que cada centavo investido no Azure seja aproveitado ao máximo. Imagine o impacto que a **economia de até 60%** e o **desempenho aprimorado** terão em seu negócio - é a receita para o sucesso! As análises personalizadas no Azure abrem as portas para uma transformação em seu negócio, permitindo que você aprimore como os recursos são gerenciados e aproveitados. Com um olhar atento às suas necessidades e metas específicas, a análise personalizada proporciona a clareza necessária para tomar decisões baseadas em dados, impulsionando seu negócio em direção à eficiência máxima. Não deixe que oportunidades passem despercebidas - invista em análises personalizadas e coloque seu negócio no caminho do sucesso com o Azure! **Está pronto para começar a economizar no Azure?** Entre em contato conosco e solicite uma **análise completa e 100% gratuita** do seu ambiente no Azure. Não perca mais tempo. Comece a otimizar seus custos agora mesmo! ### Disponibilidade Geral: Serviço de Aplicativo do Azure - Novas Ofertas Premium v3 URL: https://www.azurebrasil.cloud/blog/disponibilidade-geral-servico-de-aplicativo-do-azure-novas-ofertas-premium-v3/ Last updated: 2023-04-24T13:34:16.000Z Temos uma ótima notícia para quem usa o Azure App Service, duas novas ofertas foram introduzidas que permitem ainda mais economia e poder de processamento. Como temos abordado na nossa jornada de redução de custos, o App Service Premium V3 é uma fundamental, uma vez que é a única camada que nos permite redução de custos via Instâncias Reservadas, com economia na cada dos 43% se comparado com o mesmo modelo Premium V2. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/04/image-6.png) O Azure introduziu duas novas ofertas na camada de serviço Premium v3 (Pv3): P0v3 e P*mv3\. P0v3 é uma oferta econômica que fornece 1 vCPU e 4 GB de memória. As novas ofertas com otimização de memória (P*mv3) variam de 2 vCPU e 16 GB de memória até 32 vCPU e 256 GB de memória. O P0v3 é a oferta de preço por desempenho com melhor custo-benefício no nível Premium v3, enquanto as ofertas P\*mv3 com otimização de memória permitem provisionar aplicativos que requerem mais memória para armazenar dados em cache ou renderizar páginas da web maiores. ![](https://storage.ghost.io/c/00/52/0052dced-0017-4d07-b190-1f5c48e0ab59/content/images/2023/04/image-7.png) Os preços se tornaram bem atrativos, especialmente no cenário de Azure Functions aonde precisamos usar um App Service Plan para hospedar as functions. Caso precise de ajuda para migrar suas aplicações da camada Premium V2 para Premium V3 entre em contato. ### Resumo Semanal - 24 de abril de 2023 URL: https://www.azurebrasil.cloud/blog/azure-update/ Last updated: 2023-04-24T12:21:27.000Z Olá pessoALL, ### Azure Updates - [General Availability: Azure CNI Overlay](https://azure.microsoft.com/pt-br/updates/azurecnioverlay/?ref=azurebrasil.cloud) - [Azure Storage Mover is now Generally Available](https://azure.microsoft.com/pt-br/updates/azure-storage-mover-is-now-generally-available/?ref=azurebrasil.cloud) - [Regional expansion: Azure Elastic SAN Public Preview is now available in more regions.](https://azure.microsoft.com/pt-br/updates/regional-expansion-azure-elastic-san-public-preview-is-now-available-in-more-regions/?ref=azurebrasil.cloud) - [Public Preview: Isovalent Cilium Enterprise through Azure Marketplace](https://azure.microsoft.com/pt-br/updates/ciliumenterpriseonazuremarketplace/?ref=azurebrasil.cloud) - [Generally Available: Azure App Service - New Premium v3 Offerings](https://azure.microsoft.com/pt-br/updates/generally-available-azure-app-service-new-premium-v3-offerings/?ref=azurebrasil.cloud) - [Hotpatch is now available on preview images of Windows Server VMs on Azure with the Desktop Experience installation mode](https://azure.microsoft.com/pt-br/updates/hotpatch-is-now-available-on-preview-images-of-windows-server-vms-on-azure-with-the-desktop-experience-installation-mode/?ref=azurebrasil.cloud) - [Azure Service Operator stable release version 2.0 now available](https://azure.microsoft.com/pt-br/updates/azure-service-operator-stable-release-version-20-now-available-2/?ref=azurebrasil.cloud) - [GA: Azure Active Directory workload identity with AKS](https://azure.microsoft.com/pt-br/updates/ga-azure-active-directory-workload-identity-with-aks-2/?ref=azurebrasil.cloud) - [OpenCost for AKS cost visibility](https://azure.microsoft.com/pt-br/updates/opencost-for-aks-cost-visibility/?ref=azurebrasil.cloud) - [Generally Available: Azure CNI Overlay for Linux](https://azure.microsoft.com/pt-br/updates/generally-available-azure-cni-overlay-for-linux/?ref=azurebrasil.cloud) - [Public preview: Fail Fast Upgrade on API Breaking change detection](https://azure.microsoft.com/pt-br/updates/public-preview-fail-fast-upgrade-on-api-breaking-change-detection/?ref=azurebrasil.cloud) - [Generally Available: Long term support version in AKS](https://azure.microsoft.com/pt-br/updates/generally-available-long-term-support-version-in-aks/?ref=azurebrasil.cloud) - [Public preview: AKS service mesh addon for Istio](https://azure.microsoft.com/pt-br/updates/public-preview-aks-service-mesh-addon-for-istio/?ref=azurebrasil.cloud) - [Generally Available: Kubernetes 1.26 support in AKS](https://azure.microsoft.com/pt-br/updates/generally-available-kubernetes-126-support-in-aks/?ref=azurebrasil.cloud) - [Public preview: Azure Container Apps available in Azure China](https://azure.microsoft.com/pt-br/updates/public-preview-azure-container-apps-available-in-azure-china/?ref=azurebrasil.cloud) - [Azure CycleCloud 8.4.0 release](https://azure.microsoft.com/pt-br/updates/cyclecloud840/?ref=azurebrasil.cloud) - [General Availability: Support for Linux clients to use identity-based access to Azure file shares over SMB](https://azure.microsoft.com/pt-br/updates/azurefilessmblinuxad/?ref=azurebrasil.cloud) - [App Service Environment version 1 and version 2 will be retired on 31 August 2024](https://azure.microsoft.com/pt-br/updates/app-service-environment-v1-v2-retirement/?ref=azurebrasil.cloud) - [Support has ended for Gen 4 hardware on Azure SQL Database](https://azure.microsoft.com/pt-br/updates/support-has-ended-for-gen-4-hardware-on-azure-sql-database/?ref=azurebrasil.cloud) - [Cognitive Services Custom Commands feature is being retired on April 30, 2026](https://azure.microsoft.com/pt-br/updates/retirement-notice-custom-commands-will-retire-on-30-april-2026/?ref=azurebrasil.cloud) ### Descubra a Assinatura Azure Ideal para Impulsionar o Sucesso do seu Negócio URL: https://www.azurebrasil.cloud/blog/guia-definitivo-como-escolher-a-assinatura-azure-perfeita-para-suas-necessidades-empresariais/ Last updated: 2025-02-19T14:24:00.000Z Iniciar sua jornada no Azure geralmente começa com a criação de uma conta gratuita, repleta de benefícios para quem está começando. No entanto, para empresas, há opções mais vantajosas, que podem levar a uma **economia superior a 35%**, como aconteceu com a QuestInvestimentos. A empresa enfrentava dificuldades com seus gastos no Azure, totalizando **R$ 8.000 por mês**. O principal motivo era o uso do Power BI Embedded, um serviço que não oferecia descontos nem reservas. Diante desse desafio, a empresa decidiu buscar ajuda especializada para encontrar soluções que reduzissem os custos sem prejudicar a qualidade do serviço. Após analisar a situação, nós identificamos que o maior volume de uso do sistema ocorria durante o horário comercial. Fora desse período, a demanda caía de forma significativa e a empresa poderia se beneficiar de uma camada mais básica do serviço. Com base nessa descoberta, elaboramos um plano para otimizar o uso do Power BI Embedded. A solução encontrada foi utilizar o Azure Logic Apps para criar uma automação que ajustasse o sistema de relatórios às camadas adequadas nos horários determinados. Dessa forma, durante o horário comercial, o sistema operaria na camada intermediária necessária, enquanto fora desse período, a camada mais básica seria utilizada, gerando economia. Com a implementação dessa estratégia, **a empresa conseguiu uma impressionante redução de 35% em sua fatura do Azure**, passando a pagar R$ 5.200,00 por mês. Esse resultado permitiu um **melhor gerenciamento dos custos** e **abriu espaço para a utilização de outras ferramentas e recursos** que poderiam beneficiar ainda mais o negócio. O caso da QuestInvestimentos é um exemplo de como a análise cuidadosa e a aplicação de soluções inovadoras pode trazer resultados significativos e ajudar a enfrentar os desafios do uso eficiente dos serviços de nuvem. [![](https://svgsilh.com/svg_v2/2071331.svg)Quero Experimentar sem Custos](https://wa.me/5527988987852?ref=azurebrasil.cloud) ### E se você está iniciando no Azure, é possível experimentá-lo sem custos! A conta gratuita do Azure oferece diversos serviços e recursos para você se familiarizar com a plataforma e testar soluções sem comprometer seu orçamento. Algumas das principais vantagens incluem: 1\. Crédito inicial de $200 2\. Serviços gratuitos por 12 meses 3\. Serviços sempre gratuitos 4\. Acesso a mais de 55 serviços gratuitos A conta gratuita é perfeita para desenvolvedores, estudantes e profissionais que desejam explorar o Azure antes de investir mais recursos. Contudo, é importante estar atento às limitações e restrições de uso para evitar surpresas indesejadas na fatura. ### Eleve sua empresa com uma Assinatura Azure Empresarial A conta Pay-As-You-Go pode não ser a melhor opção para empresas, devido a algumas desvantagens. Porém, há uma solução mais eficiente: o Provedor de Soluções na Nuvem (CSP) através de um parceiro Microsoft. #### Vantagens do Provedor de Soluções na Nuvem (CSP) Ao optar por uma conta Azure com um parceiro Microsoft, sua empresa desfruta de benefícios exclusivos, como: 1. Experiência e conhecimento técnico 2. Suporte personalizado 3. Acesso a ofertas exclusivas 4. Capacitação e treinamento 5. Gestão e otimização de custos [![](https://svgsilh.com/svg_v2/2071331.svg)Quero Criar uma Conta no Azure](https://wa.me/5527988987852?ref=azurebrasil.cloud) Criar uma conta no Azure através de um parceiro Microsoft oferece apoio valioso e personalizado para sua empresa, desde a escolha das soluções até a gestão eficiente de recursos e custos. Além disso, sua empresa poderá pagar as faturas por boleto, e a nota fiscal será emitida por uma empresa brasileira, eliminando a necessidade de recolher impostos adicionais. Outro ponto relevante são as Reservas do Azure, fundamentais na redução de custos. No Brasil, as Reservas só podem ser contratadas por assinaturas associadas a um parceiro Microsoft. ### Encontre a Assinatura Azure Perfeita para o seu Negócio! Não deixe que as limitações da conta gratuita ou Pay-As-You-Go impeçam sua empresa de alcançar o sucesso no Azure. Com a ajuda da AzureBrasil.cloud você desfrutará de todos os benefícios de uma assinatura empresarial, adaptada às suas necessidades específicas. Aproveite a experiência técnica, o suporte personalizado, as ofertas exclusivas, a capacitação e a gestão de custos que nós podemos oferecer. Tome a decisão certa para o seu negócio e entre em contato conosco hoje mesmo para começar sua jornada rumo ao sucesso no Azure. Vamos juntos elevar seu negócio a novos patamares com a Assinatura Azure perfeita! [QUERO ENCONTRAR A ASSINATURA IDEAL](https://wa.me/5527988987852?ref=azurebrasil.cloud)