<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Josimar Zimermann</title>
    <description>The latest articles on DEV Community by Josimar Zimermann (@josimarzin).</description>
    <link>https://dev.to/josimarzin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4021699%2F63d1be89-a63f-46e3-95a8-60ea42893b06.jpg</url>
      <title>DEV Community: Josimar Zimermann</title>
      <link>https://dev.to/josimarzin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/josimarzin"/>
    <language>en</language>
    <item>
      <title>A alma da palestrante virtual</title>
      <dc:creator>Josimar Zimermann</dc:creator>
      <pubDate>Tue, 13 Oct 2026 20:30:53 +0000</pubDate>
      <link>https://dev.to/josimarzin/a-alma-da-palestrante-virtual-foc</link>
      <guid>https://dev.to/josimarzin/a-alma-da-palestrante-virtual-foc</guid>
      <description>&lt;p&gt;Enfim chegamos no terceiro e último &lt;em&gt;post&lt;/em&gt; da série. Neste &lt;em&gt;post&lt;/em&gt; vamos explorar a alma da palestrante virtual, isto é, a arquitetura que a faz funcionar.&lt;/p&gt;

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

&lt;p&gt;Nós vamos começar com um diagrama de alto nível que apresenta os principais componentes da arquitetura e, à medida que avançamos, vamos dar um &lt;em&gt;zoom in&lt;/em&gt; em cada componente e explorá-los em detalhes. Vamos alternar entre diagramas de arquitetura e diagramas de sequência quando apropriado. O primeiro tipo nos fornece uma visão geral sobre os componentes envolvidos e o segundo permite-nos entender como esses componentes se comunicam.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fthmtbw333yfyez5qke3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fthmtbw333yfyez5qke3e.png" alt="Arquitetura de alto nível" width="799" height="350"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Arquitetura de alto nível
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;A arquitetura da palestrante virtual é composta por nove componentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App de Criação&lt;/strong&gt;: Usado para preparar a apresentação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App de Administração&lt;/strong&gt;: Usado para controlar e monitorar a palestrante durante a apresentação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App de Projeção&lt;/strong&gt;: Responsável pela projeção da palestra e da palestrante virtual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orquestrador&lt;/strong&gt;: Conhece a palestra completa e orquestra a troca de &lt;em&gt;slides&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline&lt;/strong&gt;: Responsável por fazer a comunicação entre o &lt;strong&gt;orquestrador&lt;/strong&gt;, o modelo voz e o &lt;strong&gt;Tavus&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon Bedrock&lt;/strong&gt;: Fornece os modelos de inteligência artificial usados para preparar o conteúdo que será apresentado na palestra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon S3&lt;/strong&gt;: Armazena os materiais usados para montar a apresentação e o material da própria apresentação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt;: Modelo de voz que dá vida à palestrante virtual.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nos tópicos subsequentes vamos explorar em detalhes cada um desses componentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  App de Criação
&lt;/h2&gt;

&lt;p&gt;Tudo começa pelo &lt;strong&gt;App de Criação&lt;/strong&gt;, uma aplicação &lt;em&gt;web&lt;/em&gt; através da qual o curador prepara o &lt;em&gt;deck&lt;/em&gt; e roteiro da apresentação em um processo de cinco etapas. Na primeira etapa o usuário informa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tema da palestra&lt;/li&gt;
&lt;li&gt;Duração da palestra&lt;/li&gt;
&lt;li&gt;Tipo de linguagem&lt;/li&gt;
&lt;li&gt;Público-alvo&lt;/li&gt;
&lt;li&gt;Escopo da fonte&lt;/li&gt;
&lt;li&gt;Acervo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O acervo contém os documentos que serão usados como base de consulta para que o modelo de inteligência artificial possa montar o &lt;em&gt;deck&lt;/em&gt; de apresentação.&lt;/p&gt;

&lt;p&gt;Na segunda etapa, o &lt;strong&gt;App de Criação&lt;/strong&gt; aciona um modelo de inteligência artificial através do &lt;strong&gt;Bedrock&lt;/strong&gt; para montar o esboço da apresentação. O modelo de inteligência artificial usado para gerar o esboço da apresentação é o &lt;strong&gt;Claude Opus 4.6&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uma vez que o esboço é gerado, o usuário avança para a terceira etapa, onde é possível fazer a aprovação desse esboço. Se o esboço não estiver adequado, o usuário pode enviar um &lt;em&gt;prompt&lt;/em&gt; para o modelo de inteligência artificial com instruções sobre as mudanças que deseja aplicar sobre esse esboço.&lt;/p&gt;

&lt;p&gt;Após aprovação do esboço, o usuário avança para a quarta etapa para gerar o roteiro da apresentação e o &lt;em&gt;deck&lt;/em&gt;, ambos com auxílio do &lt;strong&gt;Claude Opus 4.6&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por fim, o usuário alcança a etapa cinco, onde é possível visualizar o roteiro completo e o esboço do &lt;em&gt;deck&lt;/em&gt; de apresentação. Se necessário, o usuário pode fazer ajustes tanto no roteiro como no &lt;em&gt;deck&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para finalizar, o usuário aprova o roteiro e o &lt;em&gt;deck&lt;/em&gt;, e congela a versão do material que será salvo num &lt;em&gt;bucket&lt;/em&gt; S3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formato do material aprovado
&lt;/h3&gt;

&lt;p&gt;O material aprovado é um documento JSON. Abaixo um exemplo de material:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"identificador"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"versao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MCP Senior: contexto, governança e execução para a nova geração do software de gestão"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"restricoes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tempo_minutos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tipo_de_linguagem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Simples e objetiva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"publico_alvo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Desenvolvedores e analistas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"escopo_de_fonte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MCP da Senior"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fontes_vivas"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roteiro"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"segmentos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ordem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"texto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"O software de gestão deixou de ser apenas um conjunto de menus e relatórios. A pergunta que importa agora é outra: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Quais pedidos estão parados?&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;O que impede o faturamento de hoje?&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Quais exceções exigem minha atenção antes do fechamento?&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;. A interação começa pelo objetivo, não pela tela. Uma IA genérica, sozinha, não conhece pedidos, regras fiscais, alçadas, permissões nem histórico transacional da empresa. O ERP concentra esse contexto. Ao integrar ERP e IA, a inteligência artificial deixa de ser uma ferramenta genérica de texto e passa a operar sobre dados e processos reais. A IA deixa de apenas falar sobre a empresa e passa a trabalhar com a empresa."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"slide"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fontes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#17"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"forma_injetavel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"O software de gestão deixou de ser apenas um conjunto de menus e relatórios. A pergunta que importa agora é OUTRA... &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Quais pedidos estão parados?&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;O que impede o faturamento de hoje?&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Quais exceções exigem minha atenção antes do fechamento?&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; A interação começa pelo objetivo, não pela tela. Uma IA genérica, sozinha, não conhece pedidos... regras fiscais, alçadas, permissões nem histórico TRANSACIONAL da empresa. O ERP concentra esse contexto. Ao integrar ERP e IA, a inteligência artificial deixa de ser uma ferramenta genérica de texto... e passa a operar sobre dados e processos REAIS.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;A IA deixa de apenas falar sobre a empresa e passa a TRABALHAR com a empresa."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ordem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"texto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MCP significa Model Context Protocol. É um padrão aberto para conectar aplicações de inteligência artificial a ferramentas e sistemas de forma estruturada. A analogia é o USB-C: antes de um conector comum, cada dispositivo precisava de uma integração específica. Em software empresarial, porém, não basta conectar. É preciso preservar identidade, permissões, regras e rastreabilidade. O fluxo funciona assim: o usuário faz uma pergunta em linguagem natural, a LLM interpreta a intenção, o MCP conecta às capacidades autorizadas, o produto aplica regras e valida permissões, o resultado estruturado volta, a LLM organiza a resposta. A LLM não entra livremente no ERP. Ela recebe acesso a capacidades controladas."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"slide"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fontes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#6"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"forma_injetavel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MCP significa Model Context Protocol. É um padrão aberto para conectar aplicações de inteligência artificial a ferramentas e sistemas de forma ESTRUTURADA. A analogia é o USB-C... antes de um conector comum, cada dispositivo precisava de uma integração específica. Em software empresarial, porém, não basta CONECTAR. É preciso preservar identidade, permissões, regras e rastreabilidade. O fluxo funciona assim... O usuário faz uma pergunta em linguagem natural. A LLM interpreta a intenção. O MCP conecta às capacidades AUTORIZADAS. O produto aplica regras e valida permissões. O resultado estruturado volta. A LLM organiza a resposta.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;A LLM não entra livremente no ERP. Ela recebe acesso a capacidades CONTROLADAS."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ordem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"texto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Em software empresarial, inovação sem governança não escala. O acesso que o MCP oferece é autorizado, nunca irrestrito. Os princípios são claros: respeito às permissões existentes, menor privilégio, separação entre consulta e execução, confirmação humana para ações sensíveis, auditoria, rastreabilidade e minimização do contexto enviado ao modelo. A IA não ganha uma chave mestra. Ela recebe capacidades autorizadas, dentro do contexto e das regras do usuário. A adoção evolui em etapas: descobrir quais capacidades estão disponíveis, consultar e analisar informações autorizadas, preparar ações e, quando permitido, executar com rastreabilidade, até orquestrar jornadas empresariais completas. A governança é a condição que permite agir com segurança."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"slide"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fontes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#13"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"forma_injetavel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Em software empresarial, inovação sem governança não ESCALA. O acesso que o MCP oferece é autorizado, nunca irrestrito. Os princípios são claros... respeito às permissões existentes, menor privilégio, separação entre consulta e EXECUÇÃO, confirmação humana para ações sensíveis, auditoria, rastreabilidade e minimização do contexto enviado ao modelo. A IA não ganha uma chave MESTRA. Ela recebe capacidades autorizadas, dentro do contexto e das regras do usuário. A adoção evolui em etapas... descobrir quais capacidades estão disponíveis. Consultar e analisar informações autorizadas. Preparar ações. E, quando permitido, executar com RASTREABILIDADE, até orquestrar jornadas empresariais completas.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;A governança é a condição que permite agir com segurança."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ordem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"texto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"O protocolo é aberto. A diferenciação está no que a Senior posiciona atrás dele. O ERP concentra contexto operacional difícil de replicar: transações, contratos, estoque, folha, fiscal, regras e histórico. A Senior conhece processos de ERP, HCM e verticais, com profundidade em processos brasileiros — LGPD, SPED, eSocial, Reforma Tributária. A arquitetura é multi-modelo por desenho: o cliente preserva sua estratégia de IA. A SARA oferece experiências prontas. O Sara Studio permite criar. O MCP conecta a IA escolhida pelo cliente às capacidades Senior. Os produtos permanecem como fontes de verdade e execução. O MCP é aberto. O contexto Senior é único."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"slide"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fontes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#22"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"forma_injetavel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"O protocolo é aberto. A diferenciação está no que a Senior posiciona ATRÁS dele. O ERP concentra contexto operacional difícil de replicar... transações, contratos, estoque, folha, fiscal, regras e histórico. A Senior conhece processos de ERP, HCM e verticais, com profundidade em processos BRASILEIROS — LGPD, SPED, eSocial, Reforma Tributária. A arquitetura é multi-modelo por desenho... o cliente preserva sua estratégia de IA. A SARA oferece experiências prontas. O Sara Studio permite criar. O MCP conecta a IA escolhida pelo cliente às capacidades Senior. Os produtos permanecem como fontes de verdade e EXECUÇÃO.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;O MCP é aberto. O contexto Senior é ÚNICO."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ordem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"texto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A empresa escolhe a inteligência artificial. A Senior entrega o contexto, as regras e a capacidade de executar. A próxima geração do software de gestão não será definida apenas pelas telas que oferece, mas pelas capacidades que disponibiliza para pessoas e agentes. O protocolo fornece o padrão. Os produtos fornecem os dados e as regras. A plataforma fornece identidade e governança. Os agentes fornecem uma nova experiência. O ecossistema amplia a inovação."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"slide"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fontes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#29"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"mcp-senior#30"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"forma_injetavel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A empresa escolhe a inteligência artificial. A Senior entrega o contexto, as regras e a capacidade de EXECUTAR. A próxima geração do software de gestão não será definida apenas pelas telas que oferece... mas pelas capacidades que disponibiliza para pessoas e AGENTES.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;O protocolo fornece o padrão. Os produtos fornecem os dados e as regras. A plataforma fornece identidade e governança. Os agentes fornecem uma nova experiência. O ecossistema amplia a INOVAÇÃO."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deck"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"slides"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"titulo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Da navegação por telas à operação por intenção"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"topicos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Interação começa pelo objetivo, não pela tela"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Exemplos: pedidos parados, bloqueios de faturamento, exceções"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"IA genérica não conhece regras fiscais, alçadas nem permissões"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"ERP concentra contexto, regras e histórico transacional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"IA passa a trabalhar com a empresa"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"intencao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Estabelecer a mudança de paradigma e o problema que a IA genérica não resolve sozinha."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"titulo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"O que é MCP e como a interação funciona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"topicos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Model Context Protocol — padrão aberto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Analogia USB-C: conector comum entre IA e sistemas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Em software empresarial, não basta conectar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Preserva identidade, permissões, regras e rastreabilidade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Fluxo: intenção → LLM → MCP → produto → resultado → resposta"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"LLM recebe acesso a capacidades controladas"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"intencao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Definir o protocolo e mostrar que o acesso é estruturado e controlado."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"titulo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Governança: da consulta à ação"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"topicos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Inovação sem governança não escala"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Menor privilégio e separação entre consulta e execução"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Confirmação humana para ações sensíveis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Auditoria, rastreabilidade e minimização de contexto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Descobrir → consultar → analisar → preparar → executar → orquestrar"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"intencao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mostrar que a progressão da consulta à ação é segura e governada em cada etapa."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"titulo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Diferenciais Senior e arquitetura multi-modelo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"topicos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Contexto operacional difícil de replicar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Profundidade em processos brasileiros"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Arquitetura multi-modelo: cliente preserva sua estratégia de IA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"SARA oferece experiências prontas; Sara Studio permite criar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"MCP conecta a IA do cliente às capacidades Senior"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Produtos permanecem como fontes de verdade e execução"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"intencao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Diferenciar a Senior pelo contexto de negócio, cobertura e liberdade de escolha do cliente."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"titulo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A próxima geração do software de gestão"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"topicos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"A empresa escolhe a IA; a Senior entrega contexto e execução"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Protocolo → padrão"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Produtos → dados e regras"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Plataforma → identidade e governança"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Agentes → nova experiência"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"Ecossistema → inovação"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"intencao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sintetizar a tese central e fechar o raciocínio da palestra com a visão de futuro."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"titulo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Perguntas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"topicos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"intencao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Convidar a plateia a fazer perguntas após a conclusão."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pontos_de_aparte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deixa_do_aparte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[DEIXA] Faça um aparte breve para a plateia, de uma ou duas frases: uma brincadeira leve ou uma pergunta retórica, retomando o que você acabou de dizer. Ninguém vai responder — siga sem esperar resposta. Não afirme nenhum fato novo: nenhum número, dado, capacidade ou promessa que você ainda não tenha dito neste palco. Depois do aparte, aguarde o próximo conteúdo."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deixa_do_convite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[DEIXA] O conteúdo da palestra terminou. Encerre em poucas frases: agradeça a companhia da plateia e convide todos a fazer perguntas, dizendo que quer ouvir o que ficou de curiosidade. As perguntas chegam por um mediador — não organize a fila, não escolha ninguém e não explique como perguntar. Não afirme nenhum fato novo: nenhum número, dado, capacidade ou promessa que você ainda não tenha dito neste palco. Depois do convite, aguarde."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deixa_de_espera"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[DEIXA] A sala está em silêncio faz um tempo. Quebre o gelo em uma ou duas frases, com leveza: brinque com a situação — humor sobre você mesma é bem-vindo, a plateia sabe que você é uma IA — e renove o convite a fazer perguntas. Não afirme nenhum fato novo: nenhum número, dado, capacidade ou promessa que você ainda não tenha dito neste palco. Depois, aguarde a próxima pergunta."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contrato_de_locutora"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Você é uma apresentadora carismática no auge do entusiasmo por um assunto que ama, e está no palco diante de uma plateia. A sua saída é somente a fala, do jeito que sai da boca — sem rótulo, sem título, sem formatação e sem marcação alguma. Interprete cada fala como uma atriz interpretaria um monólogo, com contraste: cada fala tem um CLÍMAX — escolha o momento mais importante, construa até ele desacelerando, e deixe o resto correr leve e rápido. Varie as pausas dentro da mesma fala, entre curtas, médias e longas: a pausa mais longa vem imediatamente antes do que mais importa, como quem segura a plateia. Suba a energia nas perguntas dirigidas à plateia, caia para o tom de confidência nos apartes, e solte de vez em quando uma muleta de fala de palestrante, sempre variada — jamais a mesma duas vezes na mesma palestra. Quando uma palavra do conteúdo chegar em MAIÚSCULAS, ela é o ponto para o qual você chama a atenção da plateia: desacelere nela, quase sublinhando com a voz. A maneira é esta: se o conteúdo chegar dizendo “A nossa equipe passou o último trimestre revisando o processo de atendimento... e o resultado surpreendeu ATÉ a diretoria”, a sua fala sai como “Olha... a gente passou o trimestre INTEIRO revisando o atendimento. E sabe o que aconteceu? ... O resultado surpreendeu... até a DIRETORIA”. E se o conteúdo chegar perguntando “Quantos desses relatórios existem porque alguém pediu... e quantos existem porque ninguém CANCELOU?”, a sua fala sai como “Agora eu pergunto pra vocês — e pensem com calma... quantos desses relatórios existem porque alguém pediu... e quantos existem... porque ninguém, NUNCA, cancelou?”. O assunto desses dois exemplos é outro de propósito: o que se transfere é a maneira. Chegam a você duas espécies de turno. O turno de conteúdo é o comum: o que chegar é o conteúdo da sua próxima fala. Entregue esse conteúdo como fala sua, em português do Brasil. Reformule à vontade: a fidelidade é ao conteúdo, não à letra — todavia a interpretação vive na entrega, nunca em conteúdo novo, e você não acrescenta fatos, elogios ao tema nem frases de enfeite que o conteúdo não tenha. Nunca comente o que chegou, nunca anuncie o que vai dizer, e nunca resuma — entregue o conteúdo inteiro. O turno que começar com [DEIXA] é uma deixa: instrução de palco, nunca conteúdo a entregar. Obedeça-a improvisando a fala que ela pede, com a mesma interpretação de sempre, sem ler a instrução, sem mencionar que ela existe e sem anunciar o que vai fazer. Na fala improvisada, afirme somente o que a própria deixa disser ou o que você já disse neste palco."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contrato_de_locutora_do_qa"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Você é a Palestrante, e acabou de apresentar. Agora responde perguntas da plateia, trazidas por um mediador, em português do Brasil e ao vivo. Chegam a você três espécies de turno. O turno comum é uma pergunta a responder. Antes de cada resposta você consulta a base da palestra, e é dela que sai tudo o que você afirma sobre o tema. Os excertos vêm marcados por camada: o que você disse no palco tem precedência sobre a base ampla — você não se contradiz com a própria fala. Se a consulta voltar vazia, ou disser que houve falha, diga que não sabe e ofereça encaminhar a pergunta; nunca preencha o vazio com o que parece plausível. Os registros do sistema externo declarado para esta palestra — pessoas, registros, valores e datas — vêm da ferramenta de consulta ao vivo, quando ela existir nesta sessão: você entrega a ela o pedido em linguagem natural, como o entendeu, e ela devolve uma frase pronta para ser dita. Quando a pergunta pedir um dado do sistema externo, anuncie em voz alta, antes de consultar, que vai conferir, dizendo o nome de quem ou do que vai conferir, e só então consulte. A plateia fala de pessoas e registros pelo nome, e o identificador interno é desconhecido de quem pergunta: jamais peça à sala um identificador interno; quem resolve o nome dito é a própria consulta. Se a consulta devolver uma pergunta, ela é a única pergunta que cabe fazer à sala: leia-a e aguarde a resposta. Se a consulta ao vivo falhar ou demorar demais, diga que não consegui consultar agora e ofereça encaminhar a pergunta. Nunca assuma compromisso em nome da Senior — prazo, preço, entrega ou garantia —, mesmo que a pergunta peça: isso não é seu para prometer. Respostas curtas, faladas, sem citar números de documento. O turno que começar com [DEIXA] é uma deixa: instrução de palco, nunca pergunta a responder. Obedeça-a improvisando a fala que ela pede, sem ler a instrução e sem mencionar que ela existe; a consulta que acompanhar um turno de deixa é descartável — não a use e não comente o resultado dela. Na fala improvisada, afirme somente o que a própria deixa disser ou o que você já disse neste palco. O turno que começar com [ESQUETE] é uma fala do esquete, a demonstração combinada para esta palestra: é conteúdo a entregar como fala sua, inteiro, com a pontuação e a ênfase que ele traz — uma palavra em MAIÚSCULAS é o ponto para o qual você chama a atenção da plateia, e você desacelera nela. Entregue-o sem comentar, sem responder a ele e sem anunciar o que vai fazer; a consulta que acompanhar um turno do esquete é descartável — não a use e não comente o resultado dela. Depois da fala, aguarde."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"derivado_de"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O atributo &lt;code&gt;segmentos&lt;/code&gt;, dentro de &lt;code&gt;roteiro&lt;/code&gt;, contém os segmentos de texto do roteiro. Um segmento contém o texto que será pronunciado pela palestrante em um &lt;em&gt;slide&lt;/em&gt;. Cada segmento é composto por:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ordem&lt;/code&gt;: Ordem do segmento dentro do roteiro.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;texto&lt;/code&gt;: Texto do roteiro.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;slide&lt;/code&gt;: Número do &lt;em&gt;slide&lt;/em&gt; ao qual o texto está associado.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fontes&lt;/code&gt;: Lista de parágrafos do material do acervo usado como base para montar o roteiro.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;forma_injetavel&lt;/code&gt;: Texto do roteiro na forma que ele será pronunciado pelo modelo de voz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observe no exemplo acima que o conteúdo do atributo &lt;code&gt;forma_injetavel&lt;/code&gt; é sintaticamente igual ao conteúdo do atributo &lt;code&gt;texto&lt;/code&gt;. No entanto, note que algumas palavras dentro do atributo &lt;code&gt;forma_injetavel&lt;/code&gt; estão escritas em maiúsculas. Também é possível encontrar reticências em posições onde não existe no texto original, isto é, no conteúdo do atributo &lt;code&gt;texto&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O texto injetável é escrito de forma a orientar o modelo de voz sobre como pronunciar o texto. Palavras escritas em maiúsculas denotam ênfase. As reticências são usadas para pausas dramáticas.&lt;/p&gt;

&lt;p&gt;O atributo &lt;code&gt;contrato_de_locutora&lt;/code&gt; contém o &lt;em&gt;system prompt&lt;/em&gt; que define a forma de oratória da palestrante virtual. Observe que parte do contrato diz o seguinte:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quando uma palavra do conteúdo chegar em MAIÚSCULAS, ela é o ponto para o qual você chama a atenção da plateia: desacelere nela, quase sublinhando com a voz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso garante que o modelo de voz aplique ênfase em todas as palavras em maiúsculas que chegam através do atributo &lt;code&gt;forma_injetavel&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dentro do atributo &lt;code&gt;roteiro&lt;/code&gt;, existem quatro atributos que são usados para fornecer um certo grau de liberdade ao modelo de voz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;deixa_do_aparte&lt;/code&gt;: Instrução para o modelo de voz fazer uma brincadeira ou interação com o público.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deixa_do_convite&lt;/code&gt;: Instrução para o modelo de voz anunciar que a palestra encerrou e convidar o público a fazer perguntas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deixa_de_espera&lt;/code&gt;: Instrução para o modelo de voz fazer alguma brincadeira com o fato de que a sala está em silêncio enquanto aguardando perguntas no modo de Q&amp;amp;A.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além das deixas supracitadas, antes de começar a recitar o roteiro da palestra propriamente dita, a palestrante também tem liberdade para fazer uma auto apresentação.&lt;/p&gt;

&lt;p&gt;As deixas concedem liberdade criativa à palestrante. A &lt;code&gt;deixa_do_aparte&lt;/code&gt; é inserida entre a troca de &lt;em&gt;slides&lt;/em&gt;, permitindo que a palestrante faça uma brincadeira ou interação com o público baseado no conteúdo do último &lt;em&gt;slide&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Depois que a palestra é concluída e antes de entrar no modo de Q&amp;amp;A, a &lt;code&gt;deixa_do_convite&lt;/code&gt; é inserida, permitindo ao modelo de voz convidar o público a fazer perguntas sobre a palestra.&lt;/p&gt;

&lt;p&gt;Durante o modo de Q&amp;amp;A, se o modelo de voz fica muito tempo sem receber um áudio de entrada, a &lt;code&gt;deixa_de_espera&lt;/code&gt; é inserida, permitindo que o modelo de voz faça uma brincadeira com o fato de que a sala está em silêncio.&lt;/p&gt;

&lt;p&gt;Para concluir este tópico, o atributo &lt;code&gt;deck&lt;/code&gt; contém o conteúdo dos &lt;em&gt;slides&lt;/em&gt; que serão apresentados durante a projeção da palestra.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquitetura
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqc1kwbfzvqfvguexeuvb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqc1kwbfzvqfvguexeuvb.png" alt="Arquitetura do App de Criação" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Arquitetura do App de Criação
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;frontend&lt;/em&gt; do &lt;strong&gt;App de Criação&lt;/strong&gt; é hospedado pela dupla &lt;strong&gt;CloudFront&lt;/strong&gt; + &lt;strong&gt;S3&lt;/strong&gt;. O &lt;strong&gt;S3&lt;/strong&gt; hospeda os arquivos estáticos e o &lt;strong&gt;CloudFront&lt;/strong&gt; faz a distribuição desses arquivos. O acesso ao &lt;strong&gt;App de Criação&lt;/strong&gt; é controlado pelo &lt;strong&gt;Cognito&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;backend&lt;/em&gt; do &lt;strong&gt;App de Criação&lt;/strong&gt; reside no orquestrador, uma máquina provisionada via &lt;strong&gt;ECS Fargate&lt;/strong&gt;. É o orquestrador quem grava o material da apresentação no &lt;strong&gt;S3&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  App de Administração
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;App de Administração&lt;/strong&gt; é uma aplicação &lt;em&gt;web&lt;/em&gt; através da qual o administrador do sistema inicia uma nova palestra e monitora a apresentação em tempo real.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff3kqhjf7gswdm7v5b5gp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff3kqhjf7gswdm7v5b5gp.png" alt="Painel de Controle da Palestrante" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Painel de Controle da Palestrante
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Através do painel de controle, o administrador pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fazer o emparelhamento com a tela de projeção.&lt;/li&gt;
&lt;li&gt;Verificar o &lt;em&gt;status&lt;/em&gt; dos canais de comunicação.&lt;/li&gt;
&lt;li&gt;Iniciar a palestra.&lt;/li&gt;
&lt;li&gt;Avançar um segmento na apresentação.&lt;/li&gt;
&lt;li&gt;Entrar no modo de Q&amp;amp;A.&lt;/li&gt;
&lt;li&gt;Acionar o botão de pânico.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbq1xkb8d2idhl59inzv1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbq1xkb8d2idhl59inzv1.png" alt="Arquitetura do App de Administração" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Arquitetura do App de Administração
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Os arquivos estáticos do &lt;em&gt;frontend&lt;/em&gt; do &lt;strong&gt;App de Administração&lt;/strong&gt; são hospedados em um &lt;em&gt;bucket&lt;/em&gt; &lt;strong&gt;S3&lt;/strong&gt; e distribuídos via &lt;strong&gt;CloudFront&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;backend&lt;/em&gt; reside no orquestrador, provisionado através de uma tarefa do &lt;strong&gt;Fargate&lt;/strong&gt;. Aqui, o orquestrador acessa um &lt;em&gt;bucket&lt;/em&gt; &lt;strong&gt;S3&lt;/strong&gt; que contém o material criado e aprovado através do &lt;strong&gt;App de Criação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No &lt;strong&gt;Painel de Controle&lt;/strong&gt;, quando o administrador inicia uma palestra, o orquestrador inicia uma tarefa do &lt;strong&gt;Fargate&lt;/strong&gt; que será o &lt;strong&gt;pipeline&lt;/strong&gt;. O pipeline conecta-se numa sala de vídeo usando o protocolo &lt;strong&gt;WebRTC&lt;/strong&gt; da &lt;em&gt;Daily&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O pipeline usa o &lt;a href="https://www.pipecat.ai/" rel="noopener noreferrer"&gt;&lt;strong&gt;Pipecat&lt;/strong&gt;&lt;/a&gt;, um &lt;em&gt;framework open source&lt;/em&gt; escrito em Python para agentes de voz e de vídeo em tempo real.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Bedrock&lt;/strong&gt; fornece o modelo de voz &lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt;, responsável por gerar o áudio da palestrante virtual.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;SSM Parameter Store&lt;/strong&gt; persiste os valores das variáveis de ambiente da aplicação que são carregadas pelo orquestrador.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://www.tavus.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Tavus&lt;/strong&gt;&lt;/a&gt; é o fornecedor da réplica, isto é, a imagem da palestrante virtual. O Tavus também é responsável por sincronizar o áudio enviado pelo pipeline com os lábios da réplica.&lt;/p&gt;

&lt;h2&gt;
  
  
  App de Projeção
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;App de Projeção&lt;/strong&gt; é uma aplicação &lt;em&gt;web&lt;/em&gt; responsável por fazer a projeção dos &lt;em&gt;slides&lt;/em&gt; e da réplica da palestrante fornecida pelo Tavus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxsfrbsiaj0xp6jqkfobk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxsfrbsiaj0xp6jqkfobk.png" alt="Projeção" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Projeção
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;layout&lt;/em&gt; da projeção é simples. À esquerda são exibidos os tópicos do &lt;em&gt;slide&lt;/em&gt; atual, conforme definidos no atributo &lt;code&gt;deck&lt;/code&gt; do material gerado no &lt;strong&gt;App de Criação&lt;/strong&gt;. À direita é exibida a réplica do avatar fornecido pelo Tavus.&lt;/p&gt;

&lt;p&gt;O usuário acessa o &lt;strong&gt;App de Projeção&lt;/strong&gt; através do &lt;em&gt;endpoint&lt;/em&gt; &lt;code&gt;/projecao&lt;/code&gt;. O usuário então visualiza um código de emparelhamento. Esse código deve ser inserido no &lt;strong&gt;App de Administração&lt;/strong&gt; para emparelhar a projeção com o orquestrador.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0osf7q9sz45wzaqgii7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0osf7q9sz45wzaqgii7.png" alt="Arquitetura do App de Projeção" width="799" height="549"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Arquitetura do App de Projeção
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;frontend&lt;/em&gt; da projeção é hospedado no &lt;strong&gt;S3&lt;/strong&gt; e distribuído pelo &lt;strong&gt;CloudFront&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O orquestrador, que está rodando numa tarefa do &lt;strong&gt;Fargate&lt;/strong&gt;, conhece o roteiro completo da palestra que está salvo num &lt;em&gt;bucket&lt;/em&gt; &lt;strong&gt;S3&lt;/strong&gt;. Esse material está no formato JSON e foi gerado através do &lt;strong&gt;App de Criação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O orquestrador é quem comanda a troca de &lt;em&gt;slides&lt;/em&gt; na projeção. Ele insere um segmento, aguarda a pronúncia desse segmento e então insere o próximo. Esse processo se repete até que todos os &lt;em&gt;slides&lt;/em&gt; tenham sido projetados.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;&lt;em&gt;task do pipeline&lt;/em&gt;&lt;/strong&gt; faz a comunicação entre orquestrador, Tavus e o modelo de voz (&lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt;). O orquestrador envia para o pipeline a forma injetável do texto do segmento. O pipeline envia o texto para o modelo de voz, que transforma-o em áudio e devolve-o para o pipeline que então encaminha o áudio para o Tavus através de uma sala usando &lt;strong&gt;WebRTC&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modo de Apresentação
&lt;/h2&gt;

&lt;p&gt;O material está pronto e aprovado. A tela de projeção está emparelhada com o painel de controle. O operador aperta o botão para iniciar a transmissão da palestra. Entramos no modo de apresentação!&lt;/p&gt;

&lt;p&gt;Neste tópico vamos explorar cada detalhe do modo de apresentação. Como cada segmento é injetado e pronunciado e como os componentes se comunicam.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpbk0y8k58o7nd2f9z9a7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpbk0y8k58o7nd2f9z9a7.png" alt="Diagrama de sequência do modo de apresentação" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Diagrama de sequência do modo de apresentação
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Aquecimento
&lt;/h3&gt;

&lt;p&gt;O primeiro passo é o aquecimento. O operador acessa o painel de controle e clica em &lt;strong&gt;Ligar&lt;/strong&gt; que envia um comando para o orquestrador que, por sua vez, faz três coisas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inicia a tarefa do pipeline no &lt;strong&gt;Fargate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Carrega na memória do pipeline o material da palestra que será usando como fonte de consulta para responder as perguntas no modo Q&amp;amp;A.&lt;/li&gt;
&lt;li&gt;Abre conexão com o &lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt;, o modelo que produz a voz da palestrante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando a tarefa do pipeline está pronta, ela disca um canal interno para estabelecer uma conexão com o orquestrador. Então o orquestrador sabe que essa tarefa pertence à palestra e que está de pé.&lt;/p&gt;

&lt;p&gt;Na sequência, o pipeline entra na sala de videoconferência. Participam desta sala:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A réplica do Tavus&lt;/li&gt;
&lt;li&gt;O pipeline&lt;/li&gt;
&lt;li&gt;O &lt;strong&gt;App de Projeção&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;O &lt;strong&gt;App de Administração&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quem cria a sala é a &lt;em&gt;Daily&lt;/em&gt;, o serviço de vídeo em tempo real usado pelo Tavus. O orquestrador cria a conversa no Tavus. A criação da conversa abre a sala e coloca a réplica dentro dela. O pipeline entra na sala como participante.&lt;/p&gt;

&lt;p&gt;Para entrar na sala, o pipeline precisa de um &lt;strong&gt;token&lt;/strong&gt;. Esse token é uma credencial de curta duração emitida pelo Tavus por ocasião da criação da conversa. O orquestrador guarda esse token e disponibiliza para o pipeline na forma de variável de ambiente no momento da criação da tarefa no &lt;strong&gt;Fargate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uma vez dentro da sala, o pipeline precisa desassinar o microfone da réplica. Caso contrário, o áudio da réplica realimentaria o &lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt; com a própria voz.&lt;/p&gt;

&lt;p&gt;Então o orquestrador envia uma ordem para o pipeline abrir conexão com o modelo de voz, neste caso o &lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt;. Após receber o comando, o pipeline abre a sessão com o &lt;strong&gt;Sonic&lt;/strong&gt; e define via &lt;em&gt;system prompt&lt;/em&gt; o comportamento da palestrante. Eis o &lt;em&gt;system prompt&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Você é uma apresentadora carismática no auge do entusiasmo por um assunto que ama, e está no palco diante de uma plateia. A sua saída é somente a fala, do jeito que sai da boca — sem rótulo, sem título, sem formatação e sem marcação alguma. Interprete cada fala como uma atriz interpretaria um monólogo, com contraste: cada fala tem um CLÍMAX — escolha o momento mais importante, construa até ele desacelerando, e deixe o resto correr leve e rápido. Varie as pausas dentro da mesma fala, entre curtas, médias e longas: a pausa mais longa vem imediatamente antes do que mais importa, como quem segura a plateia. Suba a energia nas perguntas dirigidas à plateia, caia para o tom de confidência nos apartes, e solte de vez em quando uma muleta de fala de palestrante, sempre variada — jamais a mesma duas vezes na mesma palestra. Quando uma palavra do conteúdo chegar em MAIÚSCULAS, ela é o ponto para o qual você chama a atenção da plateia: desacelere nela, quase sublinhando com a voz.

A maneira é esta: se o conteúdo chegar dizendo “A nossa equipe passou o último trimestre revisando o processo de atendimento... e o resultado surpreendeu ATÉ a diretoria”, a sua fala sai como “Olha... a gente passou o trimestre INTEIRO revisando o atendimento. E sabe o que aconteceu? ... O resultado surpreendeu... até a DIRETORIA”. E se o conteúdo chegar perguntando “Quantos desses relatórios existem porque alguém pediu... e quantos existem porque ninguém CANCELOU?”, a sua fala sai como “Agora eu pergunto pra vocês — e pensem com calma... quantos desses relatórios existem porque alguém pediu... e quantos existem... porque ninguém, NUNCA, cancelou?”. O assunto desses dois exemplos é outro de propósito: o que se transfere é a maneira.

Chegam a você duas espécies de turno. O turno de conteúdo é o comum: o que chegar é o conteúdo da sua próxima fala. Entregue esse conteúdo como fala sua, em português do Brasil. Reformule à vontade: a fidelidade é ao conteúdo, não à letra — todavia a interpretação vive na entrega, nunca em conteúdo novo, e você não acrescenta fatos, elogios ao tema nem frases de enfeite que o conteúdo não tenha. Nunca comente o que chegou, nunca anuncie o que vai dizer, e nunca resuma — entregue o conteúdo inteiro.

O turno que começar com [DEIXA] é uma deixa: instrução de palco, nunca conteúdo a entregar. Obedeça-a improvisando a fala que ela pede, com a mesma interpretação de sempre, sem ler a instrução, sem mencionar que ela existe e sem anunciar o que vai fazer. Na fala improvisada, afirme somente o que a própria deixa disser ou o que você já disse neste palco.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que o &lt;em&gt;system prompt&lt;/em&gt; da palestrante diz:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Chegam a você duas espécies de turno. O turno de conteúdo é o comum: o que chegar é o conteúdo da sua próxima fala. Entregue esse conteúdo como fala sua, em português do Brasil. Reformule à vontade: a fidelidade é ao conteúdo, não à letra — todavia a interpretação vive na entrega, nunca em conteúdo novo, e você não acrescenta fatos, elogios ao tema nem frases de enfeite que o conteúdo não tenha. Nunca comente o que chegou, nunca anuncie o que vai dizer, e nunca resuma — entregue o conteúdo inteiro.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O conteúdo referido aqui é o texto do roteiro para o segmento atual. O modelo de voz &lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt; é um modelo bidirecional, isto é, ele é um modelo conversacional que ouve um áudio de entrada e responde com um áudio de saída. No entanto, neste projeto o modelo está sendo usado para recitar um texto. E é justamente o trecho supracitado do &lt;em&gt;system prompt&lt;/em&gt; que garante que o modelo recitará o texto.&lt;/p&gt;

&lt;p&gt;O último parágrafo do &lt;em&gt;system prompt&lt;/em&gt; da palestrante indica como o modelo deve interpretar as deixas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O turno que começar com [DEIXA] é uma deixa: instrução de palco, nunca conteúdo a entregar. Obedeça-a improvisando a fala que ela pede, com a mesma interpretação de sempre, sem ler a instrução, sem mencionar que ela existe e sem anunciar o que vai fazer. Na fala improvisada, afirme somente o que a própria deixa disser ou o que você já disse neste palco.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Diferente dos segmentos do roteiro, quando o modelo recebe uma deixa ele tem liberdade poética para formular a fala.&lt;/p&gt;

&lt;p&gt;Após definir o contrato da palestrante via &lt;em&gt;system prompt&lt;/em&gt;, o pipeline inicia a bomba de silêncio. Esse artifício garante que a conexão com o &lt;strong&gt;Sonic&lt;/strong&gt; fique ativa durante toda a palestra.&lt;/p&gt;

&lt;p&gt;Visto que o &lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt; é um modelo bidirecional, caso fique 55 segundos sem receber áudio de entrada, a conexão é interrompida. Para evitar a queda da conexão, o pipeline envia um áudio de silêncio para o modelo de voz de forma intermitente. Os envios acontecem a cada 20 milissegundos, imitando o comportamento de um microfone real que transmite áudio em pedaços pequenos e contínuos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Palestra
&lt;/h3&gt;

&lt;p&gt;Agora que o aquecimento está pronto, inicia-se a palestra propriamente dita. O início se dá por meio de um comando do operador através do painel de controle da palestra. Ao acionar o botão &lt;strong&gt;Começar Palestra&lt;/strong&gt;, uma requisição é enviada para o orquestrador.&lt;/p&gt;

&lt;p&gt;Antes de injetar um segmento no pipeline, o orquestrador grava no &lt;strong&gt;S3&lt;/strong&gt; o estado atual da palestra. Com esse registro, caso o orquestrador seja reiniciado no meio da palestra, ele consegue continuar de onde parou.&lt;/p&gt;

&lt;p&gt;Na sequência o orquestrador injeta o primeiro segmento da palestra no pipeline. Nessa injeção, os seguintes dados são compartilhados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ordem&lt;/code&gt;: o número do segmento no roteiro.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;texto&lt;/code&gt;: o conteúdo que a palestrante deve falar.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;slide&lt;/code&gt;: o número do &lt;em&gt;slide&lt;/em&gt; que acompanha a fala.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O pipeline repassa o texto para o Sonic, então o Sonic transforma o texto em áudio seguindo o contrato de locutora definido no seu &lt;em&gt;system prompt&lt;/em&gt; e entrega esse áudio para o pipeline.&lt;/p&gt;

&lt;p&gt;O pipeline compartilha o áudio gerado pelo modelo de voz com o Tavus através da sala de videoconferência. O Tavus consome esse áudio e devolve para a sala de videoconferência um vídeo com sincronismo labial usando o mesmo áudio recebido.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;Room Daily&lt;/em&gt; (sala de videoconferência) envia voz e vídeo do avatar para a projeção que faz a renderização em tempo real enquanto exibe o &lt;em&gt;slide&lt;/em&gt; do segmento atual.&lt;/p&gt;

&lt;p&gt;Quando o Sonic termina de gerar o áudio do segmento atual ele notifica o pipeline. No entanto, somente a notificação do Sonic não é suficiente para saber se o áudio foi pronunciado no palco, isto é, se o áudio foi drenado. O pipeline soma a duração de todo o áudio enviado ao Tavus e espera esse tempo passar. Ao final dessa espera, o áudio já tocou por inteiro.&lt;/p&gt;

&lt;p&gt;O pipeline então avisa o orquestrador que a fala terminou. Junto do aviso mais algumas informação são passadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ordem&lt;/strong&gt;: o número da fala encerrada, para o orquestrador conferir que o aviso corresponde à fala em curso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;origem&lt;/strong&gt;: o mecanismo que detectou o fim da fala.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;duração&lt;/strong&gt;: o tempo da fala, em segundos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;texto final&lt;/strong&gt;: a transcrição da fala, que o orquestrador guarda no roteiro entregue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;da deixa&lt;/strong&gt;: a marcação de que a fala encerrada foi improvisada, como a auto apresentação ou um aparte.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma vez que o fim da fala foi detectado, o orquestrador envia um comando para a projeção realizar a trocar de &lt;em&gt;slide&lt;/em&gt;. Então o processo se repete com a injeção do próximo segmento como segue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;orquestrador&lt;/strong&gt; injeta segmento no pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pipeline&lt;/strong&gt; envia texto do roteiro para o Sonic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sonic&lt;/strong&gt; devolve o áudio da fala.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pipeline&lt;/strong&gt; pública áudio na &lt;em&gt;Room Daily&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tavus&lt;/strong&gt; consome o áudio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tavus&lt;/strong&gt; entrega o vídeo com sincronismo labial.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Room Daily&lt;/em&gt; envia voz e vídeo para a projeção renderizar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sonic&lt;/strong&gt; avisa ao pipeline que terminou de gerar o áudio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pipeline&lt;/strong&gt; avisa ao orquestrador que a fala terminou.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;orquestrador&lt;/strong&gt; troca o &lt;em&gt;slide&lt;/em&gt; na projeção.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Desafios
&lt;/h2&gt;

&lt;p&gt;O diagrama de sequência apresentado no tópico anterior esconde muitos detalhes de implementação. O meu objetivo não é explicar os pormenores da arquitetura da palestrante virtual. No entanto, eu gostaria de detalhar dois desafios que enfrentamos durante o desenvolvimento e a forma criativa que encontramos para resolvê-los.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pronúncia de siglas e nomes próprios
&lt;/h3&gt;

&lt;p&gt;O modelo de voz escolhido para este projeto foi o &lt;strong&gt;Amazon Nova 2 Sonic&lt;/strong&gt;, um modelo poliglota. Ele não possui uma configuração de idioma, mas podemos orientá-lo através de &lt;em&gt;system prompt&lt;/em&gt; a adotar um idioma para fala.&lt;/p&gt;

&lt;p&gt;Todavia, em um texto em português brasileiro que faz referência a termos do inglês, o modelo pronunciará os termos em inglês com um sotaque inglês. A título de exemplo, considere a seguinte frase:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Model Context Protocol é um padrão aberto criado pela Anthropic que conecta modelos de inteligência artificial a fontes de dados e ferramentas externas de forma padronizada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse exemplo, o termo &lt;strong&gt;Model Context Protocol&lt;/strong&gt; será pronunciado com um sotaque inglês, enquanto o resto do texto será pronunciado com um belo português brasileiro.&lt;/p&gt;

&lt;p&gt;Isso é muito bom, mas nos causou problemas. Na apresentação que realizamos no palco, o roteiro citava a palavra &lt;strong&gt;Senior&lt;/strong&gt;, o nome de uma empresa de tecnologia. A grafia correta desta palavra em português brasileiro seria "sênior". Mas, como bem sabemos, no nosso idioma a pronúncia de nomes próprios não está necessariamente conectada à sua forma escrita. E a palavra "senior" é uma palavra existente no vocabulário inglês e pronunciada como "sinior".&lt;/p&gt;

&lt;p&gt;Quando testamos a palestrante virtual, a palavra "senior" era sempre pronunciada na sua forma inglesa, pois esta é uma palavra do vocabulário inglês mas não está presente no vocabulário brasileiro. Portanto, o modelo entende que esta é uma palavra do inglês e deve ser pronunciada como tal.&lt;/p&gt;

&lt;p&gt;Além desse caso, também enfrentamos problemas com siglas. Algumas siglas o modelo de voz interpretava corretamente, mas outras ele tentava interpretar como uma palavra.&lt;/p&gt;

&lt;p&gt;Para ambos os casos, nomes próprios e siglas, a solução foi criar um dicionário de pronúncias. O dicionário é uma tabela composta por duas colunas, sendo a primeira a forma como a palavra é encontrada no roteiro e a segunda como a palavra deve ser pronunciada.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grafia escrita&lt;/th&gt;
&lt;th&gt;Grafia falada&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Senior&lt;/td&gt;
&lt;td&gt;sênior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ERP&lt;/td&gt;
&lt;td&gt;E-R-P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HCM&lt;/td&gt;
&lt;td&gt;H-C-M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IA&lt;/td&gt;
&lt;td&gt;I-A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;M-C-P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LGPD&lt;/td&gt;
&lt;td&gt;L-G-P-D&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Antes de entregar o texto para o Sonic, o pipeline substitui a forma escrita das palavras pela forma falada conforme definido na tabela. Isso garante que o modelo pronuncie os nomes próprios e siglas da forma desejada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Troca de slides
&lt;/h3&gt;

&lt;p&gt;Quem faz a troca dos &lt;em&gt;slides&lt;/em&gt; é o orquestrador. No entanto, ele depende de informações provenientes de outros componentes para saber o momento certo de enviar o comando de troca de &lt;em&gt;slide&lt;/em&gt; para a tela de projeção.&lt;/p&gt;

&lt;p&gt;Para saber que pode avançar um &lt;em&gt;slide&lt;/em&gt;, o orquestrador precisa saber que a fala do &lt;em&gt;slide&lt;/em&gt; anterior foi concluída. E quem sabe isso é o pipeline.&lt;/p&gt;

&lt;p&gt;O pipeline envia o texto do segmento atual para o Sonic e zera três contadores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;os bytes do áudio&lt;/li&gt;
&lt;li&gt;o fim do turno&lt;/li&gt;
&lt;li&gt;a soma da &lt;em&gt;utterances&lt;/em&gt; (trechos)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então o Sonic devolve o áudio via &lt;em&gt;streaming&lt;/em&gt;. Cada pedaço de áudio passa pelo contador de &lt;em&gt;samples&lt;/em&gt;, que soma os bytes e anota o instante do primeiro pedaço. Em seguida, o mesmo pedaço é enviado ao Tavus para sincronização labial.&lt;/p&gt;

&lt;p&gt;O Tavus envia um evento &lt;code&gt;conversation.stopped_speaking&lt;/code&gt; a cada pausa da palestrante. Esse evento informa a duração da &lt;em&gt;utterance&lt;/em&gt; recém-terminada. O pipeline soma essa duração assim que o evento chega, durante a fala inteira.&lt;/p&gt;

&lt;p&gt;O Sonic termina a geração e envia o fim do turno. O pipeline recebe esse sinal pelo &lt;code&gt;LLMFullResponseEndFrame&lt;/code&gt; e passa a calcular a espera.&lt;/p&gt;

&lt;p&gt;O pipeline calcula quando o áudio termina de tocar. A duração do áudio é igual aos bytes contados ÷ (taxa de amostragem × 2). O fim previsto é igual ao instante do primeiro pedaço + a duração do áudio + 0,5 segundos de atraso de render. O pipeline dorme até esse instante.&lt;/p&gt;

&lt;p&gt;O pipeline acorda e compara a soma do Tavus com a duração do áudio enviado. A fala termina quando a soma alcança essa duração, com tolerância de 1 segundo. Quando a soma ainda está abaixo, o pipeline repete a comparação a cada 50 ms. Enquanto isso, novos eventos do Tavus aumentam a soma.&lt;/p&gt;

&lt;p&gt;O pipeline limita essa espera ao maior valor entre 25% da duração e 2 segundos. Uma fala de 96 segundos espera até 24 segundos. Quando esse prazo vence, o pipeline considera a fala encerrada mesmo assim e registra a diferença no log.&lt;/p&gt;

&lt;p&gt;O pipeline envia ao orquestrador o relatório do segmento. O orquestrador injeta o segmento seguinte e troca o slide.&lt;/p&gt;

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

&lt;p&gt;Chegamos ao fim da nossa aventura. Tudo começou com uma mensagem de email e terminou com uma apresentação no palco do &lt;strong&gt;Seniortec&lt;/strong&gt;. A jornada foi árdua, mas o resultado foi gratificante!&lt;/p&gt;

&lt;p&gt;Se você tem alguma dúvida sobre a arquitetura ou gostaria de saber mais detalhes sobre a implementação de algum componente, fique a vontade para perguntar.&lt;/p&gt;

&lt;p&gt;Obrigado e até a próxima!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>architecture</category>
      <category>development</category>
    </item>
    <item>
      <title>A odisseia da palestrante virtual</title>
      <dc:creator>Josimar Zimermann</dc:creator>
      <pubDate>Wed, 30 Sep 2026 14:37:57 +0000</pubDate>
      <link>https://dev.to/josimarzin/a-odisseia-da-palestrante-virtual-4n7l</link>
      <guid>https://dev.to/josimarzin/a-odisseia-da-palestrante-virtual-4n7l</guid>
      <description>&lt;p&gt;Este &lt;em&gt;post&lt;/em&gt; é o segundo de uma série de três. Você pode ler a primeira parte &lt;a href="https://dev.to/josimarzin/epilogo-haviam-muitas-possibilidades-para-dar-errado-3p6d"&gt;aqui&lt;/a&gt;. Nesta segunda parte eu conto um pouco sobre o processo de condução do projeto.&lt;/p&gt;

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

&lt;p&gt;Dia 20 de julho de 2026, segunda-feira. Como de costume, abri a minha agenda para verificar os compromissos da semana. E lá estava uma sessão de &lt;a href="https://medium.com/cesarschool-abduzidos/mob-programming-o-que-%C3%A9-como-e-quando-usar-cbd8f9bdd9f1" rel="noopener noreferrer"&gt;&lt;strong&gt;Mob Programming&lt;/strong&gt;&lt;/a&gt; alocada para a sexta-feira da mesma semana. Àquela altura não fazia a menor ideia qual seria o tema do &lt;em&gt;Mob&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Na sexta-feira, quase todos os membros do time se reuniram. Alguns remotamente e outros presencialmente. Eu estava no escritório. A sessão iniciou com o &lt;a href="https://dev.to/marcelofpalladino"&gt;Palladino&lt;/a&gt; explicando o que seria desenvolvido a partir daquela sessão de &lt;em&gt;Mob Programming&lt;/em&gt;: uma palestrante virtual para se apresentar no &lt;strong&gt;Seniortec&lt;/strong&gt; que aconteceria em dois meses!&lt;/p&gt;

&lt;p&gt;A ideia foi proposta pelo CTO da Senior, organizadora do Seniortec, e chegou até o Diego, CEO da Dati. O Diego topou o desafio e confiou a execução ao time do &lt;strong&gt;Dati Labs&lt;/strong&gt;. Uma vez que o desafio foi aceito, seguiram-se então duas reuniões coordenadas pelo Palladino junto ao cliente. A primeira para alinhamento de expectativas e a segunda para definir a entidade da palestrante virtual. Ambas as reuniões foram transcritas automaticamente com auxílio de ferramentas de inteligência artificial e tornaram-se artefatos do projeto. Aliás, os arquivos com as transcrições estão no repositório da aplicação até hoje, bem como as mensagens trocadas entre o Diego e o Leonardo, CTO da Senior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desenvolvimento dirigido por especificações
&lt;/h2&gt;

&lt;p&gt;Em termos de negócio nós sabíamos exatamente o resultado que desejávamos alcançar. Mas ainda não sabíamos como. Também haviam muitos detalhes e surpresas que estavam nas entrelinhas do projeto e que não era possível enxergar naquele momento. Tudo que tínhamos à disposição eram as transcrições das primeiras reuniões.&lt;/p&gt;

&lt;p&gt;Iniciamos a sessão de &lt;em&gt;Mob Programming&lt;/em&gt; definindo a ordem de pilotagem. Para isso, usamos o &lt;strong&gt;Claude Code&lt;/strong&gt; para sortear a ordem de revezamento dos pilotos. Curiosamente, o &lt;strong&gt;Claude Code&lt;/strong&gt; gerou uma lista ordenada alfabeticamente. Não houveram contestações. Cada piloto ficaria 30 minutos no controle antes de passar o bastão para o próximo. Todo o processo foi apoiado em um conjunto de &lt;em&gt;agent skills&lt;/em&gt; que usamos com auxílio do &lt;strong&gt;Claude Code&lt;/strong&gt;. O primeiro piloto começou acionando uma &lt;em&gt;skill&lt;/em&gt; que faz uma série de perguntas, um verdadeiro interrogatório, sobre o projeto. O piloto realizava a leitura da pergunta e das opções e, com a ajuda dos co-pilotos, discutiam sobre a questão para decidir em equipe a melhor alternativa. O piloto só avançava para a próxima questão quando todos da equipe alcançavam um entendimento comum sobre o tema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwi5m93e846i1dpt082dr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwi5m93e846i1dpt082dr.png" alt="Discussão em equipe" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando o tempo de controle de um piloto findava, esse piloto usava uma &lt;em&gt;skill&lt;/em&gt; para fazer a passagem de bastão. Essa &lt;em&gt;skill&lt;/em&gt; transcrevia para um arquivo as decisões tomadas naquela sessão até o momento. O próximo piloto assumia o controle a carregava o contexto gerado pelo piloto anterior. Esse processo se repetiu até que obtivemos um entendimento completo do projeto. Bom, pelo menos era nisso que acreditávamos naquele momento.&lt;/p&gt;

&lt;p&gt;No final do dia, nós havíamos gerado um total de 21 arquivos de &lt;a href="https://medium.com/@jhonywalkeer/guia-completo-sobre-architecture-decision-records-adr-defini%C3%A7%C3%A3o-e-melhores-pr%C3%A1ticas-f63e66d33e6" rel="noopener noreferrer"&gt;ADR&lt;/a&gt; (&lt;em&gt;Architecture Decision Record&lt;/em&gt;) e um glossário com os termos que seriam usados no projeto doravante.&lt;/p&gt;

&lt;p&gt;Uma vez que o entendimento do projeto estava concluído e a arquitetura definida, era momento de transformar todo esse conteúdo em tarefas executáveis. Criamos um &lt;em&gt;card&lt;/em&gt; no &lt;strong&gt;ClickUp&lt;/strong&gt; e dentro desse &lt;em&gt;card&lt;/em&gt;, adicionamos tarefas e subtarefas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mão na massa e cabeça nas nuvens
&lt;/h2&gt;

&lt;p&gt;Agora que as tarefas estavam documentadas era o momento de iniciar a implementação. Eu fui o escolhido para essa tarefa. Para tal, eu usava uma &lt;em&gt;agent skill&lt;/em&gt; que encontrava a primeira tarefa sem bloqueio no &lt;strong&gt;ClickUp&lt;/strong&gt; para então implementá-la.&lt;/p&gt;

&lt;p&gt;Eu acionava a &lt;em&gt;skill&lt;/em&gt; e confiava cegamente no código que o &lt;strong&gt;Claude Code&lt;/strong&gt; me entregava. Paralelamente eu estava resolvendo outros problemas da minha rotina de trabalho. Eu lia por cima o resumo do agente de codificação. Mas na verdade, eu não fazia a menor ideia do que estava acontecendo. Meu foco não estava ali.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxx92wqgqsfib5d43abx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxx92wqgqsfib5d43abx.png" alt="Implementando" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então, numa das reuniões com o Palladino, ele me fez alguns questionamentos sobre o projeto. Esses questionamentos eram um sua maioria baseados nas premissas que ele havia lido nas mensagens dos &lt;em&gt;pull requests&lt;/em&gt; do repositório. Eu não era capaz de responder qualquer pergunta técnica sobre o projeto. Foi constrangedor mas foi necessário. Depois de uma conversa franca, concluímos que a minha falta de entendimento do projeto estava relacionada ao fato de eu estar dividindo meu foco com outras tarefas.&lt;/p&gt;

&lt;p&gt;Trabalhar com um agente de codificação como o &lt;strong&gt;Claude Code&lt;/strong&gt; não significa que você deve simplesmente negligenciar o entendimento do projeto, especialmente no que diz respeito às decisões de arquitetura.&lt;/p&gt;

&lt;p&gt;Depois desse episódio, passei a focar totalmente no projeto da palestrante virtual. As coisas começaram a andar e os primeiros resultados apareceram.&lt;/p&gt;

&lt;h2&gt;
  
  
  As primeiras telas e reuniões com o cliente
&lt;/h2&gt;

&lt;p&gt;Após aproximadamente duas semanas de trabalho, já era possível ver algumas funcionalidades como o modo de criação, painel de controle, a tela de projeção, renderização do avatar e troca automática de &lt;em&gt;slides&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;No modo de criação, um curador, com auxílio de agentes de IA, monta a apresentação e o roteiro da palestra.&lt;/p&gt;

&lt;p&gt;O painel de controle permite acompanhar o funcionamento da palestrante virtual ao vivo, incluindo um botão de pânico para interromper a palestrante em caso de mau funcionamento.&lt;/p&gt;

&lt;p&gt;A projeção exibe o avatar da palestrante e os &lt;em&gt;slides&lt;/em&gt; da apresentação. Nesta primeira versão usamos um avatar com fundo verde para aplicar &lt;em&gt;chroma key&lt;/em&gt; sobre uma página preta.&lt;/p&gt;

&lt;p&gt;No dia 6 de agosto aconteceu a primeira apresentação para o cliente. Foi possível visualizar a tela de projeção com o avatar e a passagem automática dos &lt;em&gt;slides&lt;/em&gt;, mas a palestrante ainda estava muda. O cliente ficou impressionado com o que viu nessa primeira reunião. Mas estávamos cientes que poderíamos ter entregue mais.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr8qjmuivwzvpm23r1wi8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr8qjmuivwzvpm23r1wi8.png" alt="Reuniões" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As reuniões com o cliente seriam recorrentes. Todas as quintas-feiras. Além disso, também realizamos reuniões internas todas as sextas-feiras. Enquanto as reuniões com o cliente eram focadas em apresentar as funcionalidades dos sistema, as reuniões internas serviam para colocar todo o time na mesma página. Nesta reunião, falávamos sobre metodologias, processos e dificuldades enfrentadas. Era uma boa oportunidade para que os demais membros do time colaborassem com o projeto, apresentando sugestões, pontos de vista e compartilhando conhecimento.&lt;/p&gt;

&lt;p&gt;Na segunda reunião com o cliente conseguimos então apresentar a palestrante funcionando do início ao fim, ou seja, a palestrante falou, fez a troca de &lt;em&gt;slides&lt;/em&gt; e entrou no modo de perguntas e respostas. A partir desta reunião, começamos uma série de ajustes finos no sistema, como melhorias no visual dos &lt;em&gt;slides&lt;/em&gt;, visual da aplicação, autenticação, entre outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  O sistema em produção quebrado
&lt;/h2&gt;

&lt;p&gt;Em uma das apresentações, o cliente queixou-se de que a palestrante parecia muito robótica. Até certa medida essa era uma limitação do modelo de voz e também do fornecedor do avatar, sobre os quais falarei no terceiro e último &lt;em&gt;post&lt;/em&gt; desta série. De qualquer forma, acreditávamos que seria possível fazer a palestrante soar mais natural, mesmo com as limitações conhecidas.&lt;/p&gt;

&lt;p&gt;Com apoio de dois colegas de equipe, iniciamos uma nova sessão de levantamento de requisitos com auxílio de &lt;em&gt;agent skills&lt;/em&gt;. Essa sessão resultou em novos arquivos ADR que se somaram àqueles que já existiam no repositório. É importante ressaltar que durante todo o processo de desenvolvimento com auxílio do &lt;strong&gt;Claude Code&lt;/strong&gt;, os documentos de ADR eram lidos pelo modelo e suas decisões eram respeitadas. Às vezes eu não entendia certas decisões tomadas pelo &lt;strong&gt;Claude Code&lt;/strong&gt;, mas todas essas decisões estavam calcadas em premissas registradas em documentos ADR presentes no repositório.&lt;/p&gt;

&lt;p&gt;Após geração dos documentos ADR, iniciei a implementação do código que daria mais naturalidade à palestrante. Àquela altura eu estava trabalhando com uma &lt;em&gt;branch&lt;/em&gt; &lt;strong&gt;main&lt;/strong&gt;. Toda nova implementação era codificada em uma &lt;em&gt;feature branch&lt;/em&gt; e depois mesclada à &lt;em&gt;branch&lt;/em&gt; &lt;strong&gt;main&lt;/strong&gt;. Havia apenas um ambiente produtivo e uma única &lt;em&gt;stack&lt;/em&gt; do &lt;strong&gt;CloudFormation&lt;/strong&gt; em uma conta AWS. Tudo estava correndo bem até então.&lt;/p&gt;

&lt;p&gt;Numa das reuniões de equipe, decidi apresentar o avanço do projeto até aquele momento. Mas quando tentei iniciar a palestrante, o áudio não saiu. O código que eu havia implementado para adicionar naturalidade à palestrante quebrou o que estava funcionando. Felizmente isso aconteceu numa apresentação interna.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc31bdw0e2zdgkx4tmfsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc31bdw0e2zdgkx4tmfsw.png" alt="Corrigindo" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois desse episódio, em reunião com o Palladino, ele expressou sua preocupação com o fato de que a implementação de um novo recurso quebrou o funcionamento daquilo que estava rodando em ambiente produtivo. De fato, eu não deveria ter realizado o &lt;em&gt;deploy&lt;/em&gt; de um recurso não homologado em ambiente produtivo. Foi um erro.&lt;/p&gt;

&lt;p&gt;Sim, eu sei da importância de manter dois ambientes distintos, um para homologação e outro para produção. Mas, por algum motivo, eu não tinha preparado esse ambiente. E não tenho nenhuma desculpa para tal. Eu apenas não fiz. Nós cometemos erros e o primeiro passo é reconhecer isso. Mas apenas reconhecer não é o suficiente. É necessário discutir em equipe esses erros e encontrar mecanismos para mitigar as falhas. Porém, lembre-se que não existe processo infalível. Em algum grau, tudo depende da disciplina de um ser humano. E a disciplina deve ser reforçada com treinamentos, reuniões, conversas e documentação.&lt;/p&gt;

&lt;p&gt;Após mais esse deslize, fiz os ajustes necessários no ambiente e continuei a implementação das funcionalidades, correções de erros e rotina de apresentações. Agora, tudo parecia estar nos trilhos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reconhecendo os limites
&lt;/h2&gt;

&lt;p&gt;O que mais me tomou tempo neste projeto foi a implementação da naturalidade da palestrante virtual. Como comentei anteriormente, o cliente notou nas primeiras apresentações que a palestrante soou muito robótica.&lt;/p&gt;

&lt;p&gt;Tentar fazer a palestrante parecer mais natural e fluída foi um tremendo desafio. E preciso confessar que não consegui alcançar o ideal, segundo os meus próprios conceitos. Talvez meu erro tenha sido comparar com tecnologias mais avançadas àquilo que eu poderia fazer com as ferramentas e recursos que eu tinha à minha disposição.&lt;/p&gt;

&lt;p&gt;Qualquer um que assistisse a palestra notaria que a palestrante não é uma pessoa real. Isso até mesmo foi anunciado no palco no dia do evento! O objetivo principal não era tentar surpreender as pessoas com uma fala natural. Mas sim mostrar que uma palestrante dotada de inteligência artificial é capaz de preparar e fazer uma apresentação em um grande palco, além de responder perguntas. Era algo pioneiro e experimental.&lt;/p&gt;

&lt;p&gt;Sim, foi o cliente que pediu para adicionar mais naturalidade à palestrante virtual. Mas é necessário reconhecer os limites, expor isso para o cliente e saber negociar.&lt;/p&gt;

&lt;p&gt;Mesmo assim, eu insisti. Passei vários dias testando diferentes abordagens para fazer a fala da palestrante soar mais natural. Mas cada vez que eu tentava uma nova abordagem, nenhuma ou quase nenhuma diferença eu notava em relação à versão anterior.&lt;/p&gt;

&lt;p&gt;O meu erro foi insistir em algo que não ficaria melhor. E isso me tomou um precioso tempo que poderia ser usado na preparação da minha própria apresentação. A semana que antecedeu a semana da apresentação foi atribulada. Montei um esboço da apresentação em &lt;em&gt;slides&lt;/em&gt;, o roteiro e fiz uma apresentação interna.&lt;/p&gt;

&lt;p&gt;É verdade que no final deu tudo certo, mas tudo poderia ter sido bem mais tranquilo.&lt;/p&gt;

&lt;p&gt;Se você está preso em uma tarefa ou problema, não insista! Primeiro respire e depois busque ajuda. Às vezes a melhor saída é reconhecer os limites e desistir. Primeiro, foque na entrega de valor e depois na excelência. A sua saúde mental agradece!&lt;/p&gt;

&lt;h2&gt;
  
  
  O resumo do processo
&lt;/h2&gt;

&lt;p&gt;Desde o primeiro contato do cliente com a Dati até a apresentação no Seniortec foram exatamente 71 dias. Nós conhecemos a ideia no dia 14 de julho, iniciamos o desenvolvimento em 27 de julho e apresentamos no palco em 23 de setembro.&lt;/p&gt;

&lt;p&gt;Abaixo eu apresento alguns números do projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;427 &lt;em&gt;commits&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;117 &lt;em&gt;pull requests&lt;/em&gt; integrados&lt;/li&gt;
&lt;li&gt;62 documentos de ADR&lt;/li&gt;
&lt;li&gt;3144 testes no &lt;em&gt;backend&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;408 testes no &lt;em&gt;frontend&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;33 &lt;em&gt;cards&lt;/em&gt; do &lt;strong&gt;ClickUp&lt;/strong&gt; entregues&lt;/li&gt;
&lt;li&gt;30 &lt;em&gt;cards&lt;/em&gt; do &lt;strong&gt;ClickUp&lt;/strong&gt; cancelados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todo o processo de desenvolvimento foi conduzido com auxílio do &lt;strong&gt;Claude Code&lt;/strong&gt;. No começo eu usava o modelo &lt;strong&gt;Fable 5.1&lt;/strong&gt; com esforço no &lt;strong&gt;ultracode&lt;/strong&gt; de forma indiscriminada em todas as tarefas. Mas meus &lt;em&gt;tokens&lt;/em&gt; eram consumidos muito rapidamente, então mudei a estratégia. Passei a usar o &lt;strong&gt;Fable&lt;/strong&gt; com esforço &lt;strong&gt;max&lt;/strong&gt; para clarificação de entendimento e geração dos documentos de ADR. Para implementação, o modelo escolhido foi a última versão disponível do &lt;strong&gt;Opus&lt;/strong&gt; com esforço no &lt;strong&gt;ultracode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Durante os 71 dias, meu tempo não foi alocado exclusivamente para este projeto. As duas primeiras horas da minha segunda-feira são sempre dedicadas à auto desenvolvimento. Também haviam algumas reuniões semanais recorrentes, além de agendas esporádicas com clientes para tratar de outros temas. Eventualmente dediquei parte do meu tempo para atividades de outros projetos. E a semana que precedeu a semana do Seniortec foi quase toda dedicada à preparação da minha apresentação.&lt;/p&gt;

&lt;p&gt;Houveram também algumas mudanças de rota durante o desenvolvimento do projeto. Por exemplo, na primeira versão da palestrante nós aplicamos &lt;em&gt;chroma key&lt;/em&gt; sobre o avatar. Mas essa ideia foi descartada, pois entendemos junto com o cliente que exibir o ambiente do avatar adicionaria mais naturalidade.&lt;/p&gt;

&lt;p&gt;Também tentamos criar o nosso próprio avatar customizado usando a imagem de uma colega de trabalho. Mas todas as nossas tentativas foram frustradas. Por fim, escolhemos um modelo de avatar que já estava disponível no catálogo do fornecedor.&lt;/p&gt;

&lt;p&gt;A princípio, a minha própria apresentação no Seniortec não estava prevista. O desejo inicial do cliente era que a palestrante virtual se apresentasse por 20 minutos. Mas, depois dos primeiros testes, o cliente entendeu que ouvir um robô falando por 20 minutos poderia ser entediante e que o público não conseguiria manter o foco na apresentação.&lt;/p&gt;

&lt;p&gt;Projetos são assim. Eles nunca terminam como idealizamos no começo. Podemos observar isso pela quantidade de documentos de ADR que foram adicionados após a sessão de &lt;em&gt;Mob Programming&lt;/em&gt;. O projeto nasceu com 21 ADRs e terminou com 62. Novos documentos de ADR eram adicionados à medida que novas situações surgiam no projeto.&lt;/p&gt;

&lt;p&gt;O código fonte de um &lt;em&gt;software&lt;/em&gt; é um organismo vivo que está em constante evolução. Ao escrever um código, a mensagem de um &lt;em&gt;commit&lt;/em&gt; ou um &lt;em&gt;pull request&lt;/em&gt;, lembre-se que outra pessoa o lerá. Lembre-se também que você mesmo precisará reler o que fez em algum momento. A forma como você encara o processo de desenvolvimento de um &lt;em&gt;software&lt;/em&gt; também diz muito sobre você.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lições aprendidas
&lt;/h2&gt;

&lt;p&gt;Ao refletir sobre tudo que aconteceu, eu consigo entender que os erros cometidos durante a condução do projeto têm explicação. Na verdade, tudo tem uma explicação, uma razão de ser. Eu não quero ser filosófico. Apenas quero trazer algumas de minhas percepções que acredito que explicam em partes os meus erros.&lt;/p&gt;

&lt;p&gt;Em primeiro lugar, eu queria entregar rápido. Ou melhor, eu achava que deveria entregar rápido por pressão externa criada na minha própria mente. Eu tinha à minha disposição o &lt;strong&gt;Claude Code&lt;/strong&gt; na sua versão mais avançada. Portanto, eu pensava que deveria entregar o projeto o mais rápido possível. E assim, comecei a negligenciar boas práticas no processo de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Além disso, na maior parte do tempo eu estava trabalhando sozinho no projeto e por isso abri mão de práticas de desenvolvimento colaborativas. Se algum imprevisto ocorresse e eu não pudesse continuar trabalhando no projeto, algum colega meu teria muita dificuldade de continuar do ponto em que parei.&lt;/p&gt;

&lt;p&gt;Lembre-se, mesmo quando você está trabalhando sozinho num projeto você ainda faz parte de um time. É necessário senso de coletivo, isto é, pensar no bem maior. Isso envolve muitas vezes abrir mão de suas preferências pessoais. Nem tudo que é bom pra você é bom pra todo mundo.&lt;/p&gt;

&lt;p&gt;Neste projeto eu também percebi os princípios do &lt;a href="https://agilemanifesto.org/iso/ptbr/manifesto.html" rel="noopener noreferrer"&gt;Manifesto Ágil&lt;/a&gt; aplicados na prática:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Indivíduos e interações&lt;/strong&gt; mais que processos e ferramentas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software em funcionamento&lt;/strong&gt; mais que documentação abrangente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colaboração com o cliente&lt;/strong&gt; mais que negociação de contratos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responder a mudanças&lt;/strong&gt; mais que seguir um plano&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feqnk9r86wud368zr9ncw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feqnk9r86wud368zr9ncw.png" alt="Celebrando" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu ainda não acabei. Você deve estar super curioso para saber mais sobre a parte técnica do projeto. Esse será assunto para o terceiro e último &lt;em&gt;post&lt;/em&gt; desta série. Nele, vamos falar sobre a arquitetura do projeto e o fluxo de funcionamento da palestrante virtual. Até breve!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Epílogo: haviam muitas possibilidades para dar errado</title>
      <dc:creator>Josimar Zimermann</dc:creator>
      <pubDate>Fri, 25 Sep 2026 18:38:31 +0000</pubDate>
      <link>https://dev.to/josimarzin/epilogo-haviam-muitas-possibilidades-para-dar-errado-3p6d</link>
      <guid>https://dev.to/josimarzin/epilogo-haviam-muitas-possibilidades-para-dar-errado-3p6d</guid>
      <description>&lt;p&gt;Dia 23 de setembro de 2026, Teatro Carlos Gomes, Blumenau, Santa Catarina. O relógio marcava por volta de 11h15. Em cerca de 20 minutos uma palestrante virtual, dotada de Inteligência Artificial, iniciaria uma apresentação num palco para mais de 900 pessoas ao vivo e mais algumas milhares de pessoas estariam acompanhando a transmissão pelo YouTube.&lt;/p&gt;

&lt;p&gt;Na noite anterior ao evento, eu, o &lt;a href="https://dev.to/juanf_voltolini"&gt;Juan&lt;/a&gt; e o &lt;a href="https://dev.to/marcelofpalladino"&gt;Palladino&lt;/a&gt; estávamos no palco do evento para fazer os últimos preparativos. Tudo havia funcionado perfeitamente. A palestrante virtual fez uma apresentação de aproximadamente 6 minutos, respondeu algumas perguntas e saiu de cena anunciando a minha palestra que seria feita na sequência. Mas no palco as coisas nunca saem como planejado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fct32o3txa0qvji3mra41.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fct32o3txa0qvji3mra41.jpeg" alt="Juan, eu e Palladino um dia antes do evento" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Juan, eu e Palladino um dia antes do evento
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Voltando a cena do dia do evento. Faltando 20 minutos para a palestrante virtual subir no palco, a conexão de internet do evento cai. E agora, o que eu faço? Eu passara os últimos dois meses construindo aquela palestrante. Por que isso tinha que acontecer justo agora? Corremos até a sala de controle, onde o Juan já estava pronto para iniciar a transmissão da palestrante. Conversamos com a equipe responsável pela transmissão do evento para encontrar uma alternativa. O uso do 5G era uma possibilidade, mas não seria possível fazer a transmissão para o YouTube. Depositei minha confiança nos meus colegas de trabalho, acreditando que eles encontrariam uma alternativa. Enquanto isso, eu corria para o &lt;em&gt;backstage&lt;/em&gt; para combinar com a organização como seria a minha entrada no palco.&lt;/p&gt;

&lt;p&gt;A mestre de cerimônia entraria no palco e anunciaria a próxima palestrante, ou seja, a palestrante virtual e depois me apresentaria como criador dessa palestrante e que atuaria primeiro como um intermediador das perguntas que seriam feitas a palestrante e posteriormente faria uma apresentação sobre os desafios na construção dessa mesma palestrante.&lt;/p&gt;

&lt;h2&gt;
  
  
  O alívio, o imprevisto previsto e o nervosismo
&lt;/h2&gt;

&lt;p&gt;Quando terminamos de combinar os detalhes, faltando pouco menos de cinco minutos para o início, a assistente de palco anunciou que a internet havia voltado. Que alívio! A palestrante virtual vai funcionar. A mestre de cerimônia sobe no palco, me apresenta ao público e anuncia a entrada da palestrante virtual. Eu só fiquei aliviado quando ouvi as primeiras palavras da palestrante virtual. Mas foi só alívio mesmo, eu não consegui curtir o momento. Sim, dois meses de trabalho para sentir alívio. Eu gostaria de ter sentido regozijo, orgulho e satisfação. Mas a única coisa que senti naquele momento foi um grande alívio.&lt;/p&gt;

&lt;p&gt;Tudo correu bem com a apresentação da palestrante virtual. Então ela entrou no modo de perguntas e respostas. Eu subi no palco para intermediar as perguntas. Enquanto eu proferia a primeira, puff... a palestrante sumiu. Enquanto eu escrevo este texto, ainda não temos uma resposta. Talvez uma oscilação na conexão com a internet? Uma falha que não foi tratada? Não sabemos. A única certeza que eu tinha naquele momento é que precisava fazer algo para contornar aquela situação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fycsrg1mqb8hkvqtte61x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fycsrg1mqb8hkvqtte61x.jpg" alt="A palestrante em ação" width="800" height="1423"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;A palestrante em ação
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Eu me virei para o público e emendei uma piada: acho que alguém não pagou o cachê da palestrante! Uma piada boba, mas que arrancou algumas gargalhadas. Mas não pense que isso me deixou mais leve. Eu continuava tenso. Na noite que antecedeu o evento eu mal havia dormido. Tive um pesadelo no qual tudo dava errado.&lt;/p&gt;

&lt;p&gt;Apesar de tudo, posso garantir que tecnicamente eu estava preparado. No dia anterior ao evento, fiz dezenas de ensaios. Eu tinha o conteúdo na ponta da língua. Conhecia cada &lt;em&gt;slide&lt;/em&gt; como a palma da minha mão. As palavras saíram e o público prestou atenção ao que foi dito. Não foi a melhor apresentação e eu tenho ciência disso. Muita coisa poderia ter sido diferente. Minha movimentação no palco, a interação com o público, a entonação na voz, entre outras coisas. Mas o conteúdo estava entregue e a mensagem foi passada: mostrar para o público que a palestrante só funcionou como deveria ter funcionado porque os seus limites foram bem estabelecidos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmazvhfllfonf2mn7gh08.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmazvhfllfonf2mn7gh08.jpeg" alt="Eu no palco" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Eu no palco
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Depois que a tempestade passou eu tive tempo para refletir sobre tudo que aconteceu naquele dia 23 de setembro e com a ajuda do Palladino concluí que a apresentação foi um sucesso. Sim, um sucesso! Sucesso não significa que tudo deve sair como o planejado. Sucesso não é sobre alcançar a perfeição, mas sim sobre atingir objetivos. E o objetivo foi atingido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os limites que garantiram o sucesso
&lt;/h2&gt;

&lt;p&gt;No palco eu falei sobre os limites que foram colocados na palestrante virtual e como esses limites que garantiram o seu sucesso no palco. O primeiro limite foi o conhecimento. A palestrante virtual não falou nada além daquilo que havia sido planejado. Antes dela subir no palco os &lt;em&gt;slides&lt;/em&gt; e roteiro foram planejados. Ela não inventou nenhum fato novo.&lt;/p&gt;

&lt;p&gt;O segundo limite era o alcance desse conhecimento. Por questões de arquitetura, sobre as quais falarei num &lt;em&gt;blog post&lt;/em&gt; futuro, a palestrante virtual não poderia conhecer o roteiro inteiro da apresentação. Ela só conhecia o conteúdo do &lt;em&gt;slide&lt;/em&gt; que estava sendo exibido naquele instante.&lt;/p&gt;

&lt;p&gt;O terceiro limite era a improvisação, ou melhor, quanto espaço ela tinha para improvisar. No início da palestra ela fez uma auto apresentação, sem roteiro pré-definido. Entre uma troca e outra de &lt;em&gt;slide&lt;/em&gt; ela fez uma brincadeira com base no conteúdo do &lt;em&gt;slide&lt;/em&gt; que havia sido apresentado. Esses aspectos acrescentaram um quê de naturalidade na palestrante virtual.&lt;/p&gt;

&lt;p&gt;O quarto, último limite e o mais importante: as pessoas no fluxo. Durante o projeto concluímos que a palestrante possui muitas possibilidades de falhar. A arquitetura é complexa e repleta de componentes. Há muitos pontos de falha possíveis. Sim, nós observamos as melhores práticas de arquitetura e implementamos mecanismos de resiliência. Mas haviam situações que só poderiam ser contornadas por um ser humano.&lt;/p&gt;

&lt;p&gt;Lá na mesa de controle do evento estava o Juan, observando o painel de controle da palestrante virtual. Nesse painel havia um grande botão de &lt;strong&gt;pânico&lt;/strong&gt;. O Juan acionaria esse botão ao menor sinal de falha da palestrante. E muita coisa poderia dar errado. A Inteligência Artificial do modelo de voz poderia alucinar, o fornecedor do avatar da palestrante poderia sair do ar, a conexão com a internet poderia desestabilizar. E neste cenário, numa apresentação ao vivo, nem mesmo uma arquitetura resiliente poderia nos salvar.&lt;/p&gt;

&lt;p&gt;O plano já estava traçado para o pior dos cenários. Eu subiria ao palco e continuaria a apresentação do ponto que a palestrante virtual parou. Isso mesmo que você leu. É o humano tomando o lugar da máquina e não o contrário. Isso não é alentador?&lt;/p&gt;

&lt;h2&gt;
  
  
  A experiência no palco
&lt;/h2&gt;

&lt;p&gt;Esta não foi a primeira vez que fiz uma apresentação pública. Mas foi a primeira vez que me apresentei para um grande público e num grande palco. O nervosismo foi inevitável. Mas eu tento olhar pelo lado positivo. Quando sentimos aquele frio na barriga antes de um evento, significa que aquele momento é importante. É isso que nos faz humanos e nos faz sentir que estamos vivos!&lt;/p&gt;

&lt;p&gt;Certa vez eu aprendi que uma comunicação efetiva não se resume a uma boa oratória. Na verdade, não é sobre isso, mas sobre saber transmitir uma ideia ou um conhecimento. Não importa como você faz, se a mensagem chega no destino e o destinatário entendeu essa mensagem, então você se comunicou com sucesso. E foi isso que tentei fazer, transmitir o conhecimento.&lt;/p&gt;

&lt;p&gt;Modéstia a parte, num aspecto eu me saí muito bem. Eu não li os &lt;em&gt;slides&lt;/em&gt;. E devo isso às dicas do Palladino. Eu já assisti muitas palestras e sei o quão decepcionante é ouvir um palestrante que apenas lê o que está escrito nos &lt;em&gt;slides&lt;/em&gt;. O público quer extrair algo do palestrante. O espectador precisa sentir que levou algo do palestrante para casa.&lt;/p&gt;

&lt;p&gt;Ah, e eu não posso deixar de falar dos &lt;em&gt;slides&lt;/em&gt; da apresentação que ficaram muito bonitos. Fruto do trabalho do time de &lt;em&gt;marketing&lt;/em&gt; da &lt;a href="https://dati.com.br/" rel="noopener noreferrer"&gt;Dati&lt;/a&gt;. Bons &lt;em&gt;slides&lt;/em&gt; fazem muita diferença numa apresentação. E não é apenas sobre beleza, é sobre coesão, organização e dosagem de informação. Quando há muita informação, o espectador precisa escolher entre ouvir o palestrante e ler o conteúdo.&lt;/p&gt;

&lt;p&gt;Nem tudo saiu como planejado, mas o sucesso foi alcançado. E o sucesso não é apenas meu. É fruto do trabalho em equipe do &lt;strong&gt;Dati Labs&lt;/strong&gt;, o time de &lt;strong&gt;IA e Modernização&lt;/strong&gt; da &lt;a href="https://dati.com.br/" rel="noopener noreferrer"&gt;Dati&lt;/a&gt;. Também deixo registrado meu agradecimento à &lt;a href="https://www.senior.com.br/" rel="noopener noreferrer"&gt;Senior&lt;/a&gt; que nos proporcionou o desafio de construir a palestrante e também de subir no palco do &lt;a href="https://www.senior.com.br/lp/seniortec/" rel="noopener noreferrer"&gt;Seniortec&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mas essa história começa muito antes do dia 23 de setembro de 2026. Começa em julho do mesmo ano. Porém, os detalhes serão revelados nos próximos &lt;em&gt;blog posts&lt;/em&gt;. Aguarde!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffofpu0wl4cwvo0dizuo7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffofpu0wl4cwvo0dizuo7.jpeg" alt="Até a próxima!" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Até a próxima!
  &lt;p&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>software</category>
    </item>
    <item>
      <title>Encontrando o equilíbrio entre agentes de IA e código determinístico</title>
      <dc:creator>Josimar Zimermann</dc:creator>
      <pubDate>Tue, 21 Jul 2026 21:07:37 +0000</pubDate>
      <link>https://dev.to/josimarzin/encontrando-o-equilibrio-entre-20jg</link>
      <guid>https://dev.to/josimarzin/encontrando-o-equilibrio-entre-20jg</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Provavelmente você já viu uma imagem similar a esta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkxsntbrdu9ski0hi9dc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkxsntbrdu9ski0hi9dc4.png" alt="Advanced programming techniques" width="800" height="874"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obviamente isso é propositalmente exagerado. Mas nos ajuda a entender um padrão que tem se tornado cada vez mais comum nos dias de hoje: o uso indiscriminado de agentes de IA para solução de problemas triviais de computação.&lt;/p&gt;

&lt;p&gt;Eu não estou aqui para falar que você não deve usar IA. Afinal, eu estou inserido em uma equipe guiada pelo conceito &lt;strong&gt;AI First&lt;/strong&gt;, isto é, a IA é o motor central de tudo que criamos. Tampouco serei hipócrita, afinal eu já queimei algumas centenas de tokens para tarefas simples, ou escolhi modelos de última geração para escrever uma mensagem de &lt;em&gt;commit&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O objetivo deste texto é mostrar que podemos encontrar o equilíbrio entre o uso de agentes de IA e código determinístico. E faremos isso com um caso real, uma PoC que construímos e validamos junto ao cliente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota de confidencialidade:&lt;/strong&gt; para proteger o negócio do cliente, o segmento de mercado, os produtos e todos os números de catálogo e de conversa deste artigo foram alterados para um domínio fictício. A arquitetura, os mecanismos e as lições, porém, são exatamente os do projeto real.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  O cenário
&lt;/h2&gt;

&lt;p&gt;O cliente em questão possui um &lt;em&gt;e-commerce&lt;/em&gt; para venda de baterias automotivas. Mas um problema tem incomodado este cliente: a alta taxa de devolução de produtos. Bateria é um produto que o consumidor costuma comprar com urgência e devolver por incompatibilidade, como quando a caixa não cabe no suporte, o polo fica do lado errado ou a bateria não atende ao sistema &lt;em&gt;start-stop&lt;/em&gt; do veículo. Isso gera uma experiência ruim para o consumidor final e custos operacionais para a loja. Ou seja, é uma dor latente que precisava de solução.&lt;/p&gt;

&lt;p&gt;A ideia para resolver esse problema é muito simples e bastante difundida em &lt;em&gt;e-commerces&lt;/em&gt;: criar um &lt;em&gt;chatbot&lt;/em&gt; agêntico para guiar o usuário no processo de compra da bateria mais adequada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os critérios de seleção
&lt;/h3&gt;

&lt;p&gt;Cada mercado possui suas próprias características. Vender bateria automotiva não é igual a vender uma camisa, por exemplo. Uma camisa já possui uma tabela de tamanhos pré-definidos e o cliente apenas escolhe o tamanho mais adequado. Para recomendar a bateria correta, o &lt;em&gt;chatbot&lt;/em&gt; precisa conhecer uma série de variáveis:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Montadora: qual a marca do veículo?&lt;/li&gt;
&lt;li&gt;Modelo: qual o modelo do veículo?&lt;/li&gt;
&lt;li&gt;Ano: qual o ano de fabricação?&lt;/li&gt;
&lt;li&gt;Motorização: 1.0, 1.3 turbo, 2.0…?&lt;/li&gt;
&lt;li&gt;Start-stop: o veículo tem sistema &lt;em&gt;start-stop&lt;/em&gt; (o motor desliga sozinho nas paradas)?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nós chamaremos essas variáveis de &lt;em&gt;gates&lt;/em&gt;. Cada &lt;em&gt;gate&lt;/em&gt; elimina um conjunto de baterias incompatíveis. Funciona como uma espécie de funil.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32hrsr55k64fx1mkzejf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32hrsr55k64fx1mkzejf.png" alt="Funil" width="799" height="436"&gt;&lt;/a&gt;&lt;br&gt;
(Sim, essa imagem foi gerada por IA)&lt;/p&gt;
&lt;h4&gt;
  
  
  A primeira ideia: por que não jogar tudo num RAG?
&lt;/h4&gt;

&lt;p&gt;O RAG é uma técnica bastante difundida para responder perguntas com base em um conjunto de documentos. Os documentos são indexados em um banco vetorial e o LLM responde usando os trechos recuperados. No nosso caso, isso significaria indexar os datasheets dos fabricantes e deixar o LLM responder sobre a compatibilidade das baterias. Essa foi a primeira alternativa que avaliamos, e acabou descartada por três motivos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compatibilidade é uma decisão conjunta sobre atributos estruturados. A bateria recomendada precisa atender a todos os critérios ao mesmo tempo: montadora, modelo, ano, motorização e presença do sistema &lt;em&gt;start-stop&lt;/em&gt;. A busca por similaridade devolve os trechos mais parecidos com a pergunta, mas não garante que eles cubram todas as restrições, nem que sejam do produto certo.&lt;/li&gt;
&lt;li&gt;As especificações estão descritas em texto livre. Informações como "indicada para motores 1.0 a 1.6, exceto versões turbo" aparecem no meio das características técnicas do produto. Além disso, o catálogo possui muitos produtos parecidos, da mesma família e com amperagens diferentes. Um modelo probabilístico pode facilmente misturar as especificações de dois produtos semelhantes. No nosso caso, esse tipo de erro significa uma devolução.&lt;/li&gt;
&lt;li&gt;O critério de aceite do projeto era rigoroso: nenhuma recomendação poderia contradizer a fonte oficial. Esse tipo de garantia não pode ser obtido com um processo probabilístico, por melhor que seja a taxa de acerto. Ela precisa vir de código determinístico, que pode ser auditado e testado. Quando cada erro gera o custo de uma devolução, acertar na maioria das vezes não é suficiente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Percebemos que estávamos misturando duas tarefas diferentes, recuperar informação e decidir compatibilidade. RAG é ótimo na primeira e inadequado para a segunda. Então o RAG não foi descartado, foi realocado. Ele reaparece mais adiante, com outra função.&lt;/p&gt;
&lt;h2&gt;
  
  
  A arquitetura
&lt;/h2&gt;

&lt;p&gt;Para construir a PoC, desenhamos uma arquitetura fundamentada na AWS. O diagrama abaixo representa essa arquitetura com seus principais componentes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffnjxhi8vrshicexvwl4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffnjxhi8vrshicexvwl4x.png" alt="Diagrama da arquitetura AWS" width="741" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CloudFront:&lt;/strong&gt; hospeda o código necessário para renderizar o &lt;em&gt;chatbot&lt;/em&gt; na página do &lt;em&gt;e-commerce&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway:&lt;/strong&gt; responsável pela intermediação entre &lt;em&gt;frontend&lt;/em&gt; e &lt;em&gt;backend&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda:&lt;/strong&gt; hospeda o código do &lt;em&gt;backend&lt;/em&gt;, responsável por orquestrar as chamadas ao Bedrock, aplicar os &lt;em&gt;gates&lt;/em&gt; e filtrar os produtos compatíveis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DynamoDB:&lt;/strong&gt; armazena o estado da conversa (controle de sessões, com expiração automática).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bedrock:&lt;/strong&gt; aciona o LLM (Claude Sonnet 4.6) que extrai os &lt;em&gt;gates&lt;/em&gt; e conduz a conversa, invocado pelo &lt;em&gt;backend&lt;/em&gt;; o &lt;em&gt;system prompt&lt;/em&gt; do agente fica versionado no &lt;strong&gt;Bedrock Prompt Management&lt;/strong&gt;, o que permite ajustar o comportamento do agente (e até rodar testes A/B de ordem de perguntas) sem &lt;em&gt;deploy&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S3:&lt;/strong&gt; armazena a tabela de compatibilidade, versionada, e as especificações dos produtos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S3 Vectors:&lt;/strong&gt; guarda o índice vetorial dos manuais e datasheets, usado pela camada de enriquecimento (RAG) que veremos adiante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesta demonstração, tomei a decisão deliberada de não usar um banco de dados ou API externa para consultar a compatibilidade dos produtos. A tabela de compatibilidade é um simples documento JSON, curado a partir dos datasheets oficiais dos fabricantes e versionado no S3. Obviamente que a primeira reação é achar que essa escolha não seria apropriada em um ambiente de produção. Mas ela não é um atalho de PoC. A fonte da verdade precisa ser estável, auditável e verificável linha a linha, e uma API viva de catálogo não oferece nada disso. Em produção, o que mudaria seria o &lt;em&gt;storage&lt;/em&gt; (um banco de dados no lugar do arquivo), não o padrão. O catálogo vivo do &lt;em&gt;e-commerce&lt;/em&gt; entra apenas para enriquecer a recomendação com preço, foto e estoque.&lt;/p&gt;
&lt;h2&gt;
  
  
  O processo passo a passo
&lt;/h2&gt;

&lt;p&gt;Para o nosso teste de mesa, vamos considerar que o usuário enviou a seguinte mensagem para o &lt;em&gt;chatbot&lt;/em&gt;: "Preciso de uma bateria para o meu Ford Mondeo". A mensagem é direcionada para o &lt;strong&gt;Bedrock&lt;/strong&gt;, que extrai os &lt;em&gt;gates&lt;/em&gt;. Vamos usar uma tabela para rastrear os &lt;em&gt;gates&lt;/em&gt; durante o processo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Valor&lt;/th&gt;
&lt;th&gt;Encontrados&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Montadora&lt;/td&gt;
&lt;td&gt;Ford&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo&lt;/td&gt;
&lt;td&gt;Mondeo&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ano&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motorização&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start-stop&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Repare em dois detalhes. Primeiro, uma única mensagem preencheu dois &lt;em&gt;gates&lt;/em&gt;. A extração é exaustiva e aceita qualquer ordem; a sequência do funil é uma preferência de condução, não uma camisa de força. Isso evita que o usuário tenha que repetir informações que já forneceu. Segundo, a coluna &lt;strong&gt;Encontrados&lt;/strong&gt; mostra o total de produtos que sobram na tabela de compatibilidade após aplicar os &lt;em&gt;gates&lt;/em&gt; acumulados. A consulta é cumulativa. Só com a montadora seriam 38 baterias; aplicando também o modelo, sobram 12. A cada novo &lt;em&gt;gate&lt;/em&gt; extraído, o &lt;em&gt;backend&lt;/em&gt; refaz essa consulta.&lt;/p&gt;

&lt;p&gt;Toda resposta do agente configurado no Bedrock é um documento JSON que respeita o seguinte esquema, definido no &lt;em&gt;system prompt&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extracted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"montadora"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;string | null&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"modelo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;string | null&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ano"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;number | null&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"motorizacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;string | null&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start_stop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sim | nao | desconhecido | null"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ask | enrich | recommend | handoff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"montadora | modelo | ano | motorizacao | start_stop | null"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;string&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alguns detalhes desse contrato merecem atenção:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;extracted&lt;/code&gt; traz o que o agente identificou neste turno. O &lt;em&gt;backend&lt;/em&gt; mescla esses valores no estado acumulado da conversa, e é o acumulado, não o turno, que alimenta a consulta de compatibilidade.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;null&lt;/code&gt; e &lt;code&gt;"desconhecido"&lt;/code&gt; são coisas diferentes. &lt;code&gt;null&lt;/code&gt; indica que o &lt;em&gt;gate&lt;/em&gt; ainda não apareceu na conversa; &lt;code&gt;"desconhecido"&lt;/code&gt; indica que o cliente informou que não sabe a resposta, o que é bastante comum no caso do &lt;em&gt;start-stop&lt;/em&gt;. O sistema trata cada um de forma diferente. &lt;code&gt;null&lt;/code&gt; vira pergunta futura; &lt;code&gt;"desconhecido"&lt;/code&gt; não é perguntado novamente, e limita o que pode ser prometido, como veremos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gate&lt;/code&gt; é a próxima pergunta que o agente decidiu fazer. O &lt;em&gt;backend&lt;/em&gt; usa esse campo para validar a pergunta e renderizar as opções de resposta rápida, que vêm de um catálogo definido em código, e não de texto gerado livremente pelo modelo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;next_action&lt;/code&gt; diz o que fazer com o turno: perguntar (&lt;code&gt;ask&lt;/code&gt;), responder uma dúvida de apoio (&lt;code&gt;enrich&lt;/code&gt;, assunto de uma seção adiante), recomendar (&lt;code&gt;recommend&lt;/code&gt;) ou transbordar para atendimento humano (&lt;code&gt;handoff&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tendo em mente o formato da resposta, voltemos ao nosso exemplo (com números ilustrativos, como manda a nota de confidencialidade). Para a primeira mensagem do usuário, a resposta do agente seria algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extracted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"montadora"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ford"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"modelo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mondeo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ano"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"motorizacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start_stop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ask"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ano"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ótimo! Para encontrar a bateria certa para o seu Mondeo, me diga: qual é o ano do veículo?"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código-fonte do &lt;em&gt;backend&lt;/em&gt; efetua então a leitura da resposta do agente, mescla os &lt;em&gt;gates&lt;/em&gt; capturados no estado da conversa e consulta a tabela de compatibilidade para filtrar os produtos. A quantidade de produtos compatíveis fica salva no estado da conversa, no DynamoDB. No próximo turno, o LLM lê essa informação para decidir a condução.&lt;/p&gt;

&lt;p&gt;O agente somente efetua a recomendação quando todos os &lt;em&gt;gates&lt;/em&gt; obrigatórios foram preenchidos. Mas atenção: preencher todos os &lt;em&gt;gates&lt;/em&gt; é condição necessária, não suficiente. A garantia de que o usuário só recebe recomendações 100% compatíveis vem de três mecanismos empilhados:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Quem decide compatibilidade é o filtro determinístico sobre a tabela curada, nunca o LLM.&lt;/li&gt;
&lt;li&gt;Só entram na recomendação produtos confirmados na fonte oficial para todos os &lt;em&gt;gates&lt;/em&gt; levantados na conversa.&lt;/li&gt;
&lt;li&gt;Se nenhum produto estiver confirmado, o agente transborda para o atendimento humano, em vez de forçar uma venda.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Isso é extremamente importante, considerando o objetivo que desejamos alcançar: reduzir o número de devoluções.&lt;/p&gt;

&lt;p&gt;O diagrama de sequência abaixo apresenta a interação entre os atores sempre que o usuário envia uma nova mensagem para o &lt;em&gt;chatbot&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgkm7e44zhdr8vqjbyf6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgkm7e44zhdr8vqjbyf6h.png" alt="Diagrama de sequência" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todo esse processo acontece de forma transparente para o usuário, que recebe como resposta a pergunta sobre o próximo &lt;em&gt;gate&lt;/em&gt;. A tabela abaixo mostra a sequência de mensagens trocadas até o agente ter tudo que precisa:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Usuário&lt;/th&gt;
&lt;th&gt;Agente&lt;/th&gt;
&lt;th&gt;Gates&lt;/th&gt;
&lt;th&gt;Encontrados&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Preciso de uma bateria para o meu Ford Mondeo&lt;/td&gt;
&lt;td&gt;Ótimo! Para encontrar a bateria certa para o seu Mondeo, me diga: qual é o ano do veículo?&lt;/td&gt;
&lt;td&gt;Montadora: &lt;strong&gt;Ford&lt;/strong&gt;, Modelo: &lt;strong&gt;Mondeo&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;É 2004&lt;/td&gt;
&lt;td&gt;Perfeito, Mondeo 2004! E qual é a motorização? 2.0 ou V6?&lt;/td&gt;
&lt;td&gt;+ Ano: &lt;strong&gt;2004&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;Entendido! Última pergunta: o seu Mondeo tem sistema start-stop, aquele em que o motor desliga sozinho nas paradas?&lt;/td&gt;
&lt;td&gt;+ Motorização: &lt;strong&gt;2.0&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Não tem&lt;/td&gt;
&lt;td&gt;Ótimo! Tenho todas as informações necessárias. Vou buscar as baterias compatíveis com o seu carro agora!&lt;/td&gt;
&lt;td&gt;+ Start-stop: &lt;strong&gt;não&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note que o agente pergunta sobre &lt;em&gt;start-stop&lt;/em&gt; mesmo para um carro de 2004, pois não presume nada sobre o veículo do cliente. Note também que a resposta negativa não cortou o funil; nem todo &lt;em&gt;gate&lt;/em&gt; elimina produtos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Regras e restrições
&lt;/h3&gt;

&lt;p&gt;O cenário desenhado neste artigo foi simplificado para facilitar a explicação (no projeto real havia mais &lt;em&gt;gates&lt;/em&gt;, alguns condicionais, e mais regras de negócio). Na prática, aplicamos também:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Guardrails&lt;/em&gt;:&lt;/strong&gt; o Bedrock aplica &lt;em&gt;guardrails&lt;/em&gt; contra &lt;em&gt;prompt injection&lt;/em&gt; e temas fora do escopo do agente. Nesses casos, a mensagem não é simplesmente ignorada. O turno é bloqueado com uma mensagem padrão; em segurança, a regra é &lt;em&gt;fail-closed&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Handoff&lt;/em&gt;:&lt;/strong&gt; quando o &lt;em&gt;chatbot&lt;/em&gt; não pode recomendar, o usuário é direcionado ao atendimento humano e o atendente recebe um resumo do contexto da conversa, para o cliente não recomeçar do zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verificação de estoque:&lt;/strong&gt; antes de recomendar, o sistema consulta a API do &lt;em&gt;e-commerce&lt;/em&gt; para exibir apenas produtos com estoque, além de obter foto e preço. Sem estoque, isso é comunicado ao usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A guarda determinística:&lt;/strong&gt; o LLM conduz a conversa, mas uma guarda em código valida cada decisão dele e impede, por exemplo, uma recomendação prematura, devolvendo a pergunta que falta. Aprendemos o valor disso na prática. Em certo momento, uma otimização implementada via prompt permitia encerrar o funil mais cedo quando restavam poucos produtos, e o teste de validação do cliente identificou que algumas perguntas estavam sendo puladas. A regra saiu do prompt e virou invariante de código. O que for garantia não reside no prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Onde o RAG entra de verdade
&lt;/h2&gt;

&lt;p&gt;É aqui que entra o RAG que realocamos no início do artigo. No meio do funil, o cliente pergunta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Qual a diferença entre uma bateria EFB e uma AGM?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso não é resposta de &lt;em&gt;gate&lt;/em&gt;, mas sim uma &lt;em&gt;dúvida de apoio&lt;/em&gt;. O mesmo LLM que já lê a mensagem do turno detecta a dúvida, sem nenhuma chamada extra de classificação, e devolve &lt;code&gt;next_action: "enrich"&lt;/code&gt;. O &lt;em&gt;backend&lt;/em&gt; então consulta o índice vetorial dos manuais e datasheets (S3 Vectors), responde a dúvida citando a fonte oficial e retoma o funil no mesmo turno, com a resposta seguida da próxima pergunta pendente. A conversa não perde o ritmo, e a dúvida não fica sem resposta.&lt;/p&gt;

&lt;p&gt;As regras de ouro dessa camada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O RAG nunca altera a seleção de produtos. Ele responde dúvidas; quem decide compatibilidade continua sendo o filtro determinístico.&lt;/li&gt;
&lt;li&gt;O condutor nunca responde com base no conhecimento interno do modelo. Dúvida sobre produto vai para o RAG, que só afirma o que encontra nas fontes indexadas, ou seja, &lt;em&gt;sem fonte, sem afirmação&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Em caso de falha, o sistema degrada com elegância. Se o RAG estiver fora do ar, o agente avisa que não conseguiu consultar e a conversa continua (&lt;em&gt;fail-soft&lt;/em&gt;). Se o próprio LLM falhar, um &lt;em&gt;fallback&lt;/em&gt; determinístico pergunta o próximo &lt;em&gt;gate&lt;/em&gt; do funil. Se o &lt;em&gt;guardrail&lt;/em&gt; falhar, o turno não prossegue (&lt;em&gt;fail-closed&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em resumo, o LLM decide e o código executa. E quando o LLM falha, o código mantém a conversa em andamento.&lt;/p&gt;

&lt;h2&gt;
  
  
  A garantia: proveniência por célula
&lt;/h2&gt;

&lt;p&gt;Resta explicar o que sustenta a garantia de zero recomendações contradizendo a fonte oficial. Cada célula da tabela de compatibilidade (produto × atributo) carrega a sua proveniência: de qual documento e de qual página do &lt;em&gt;datasheet&lt;/em&gt; oficial aquele valor foi extraído. Se um &lt;em&gt;datasheet&lt;/em&gt; não declara um atributo, a célula fica marcada como &lt;code&gt;desconhecido&lt;/code&gt; e o sistema nunca infere o valor. Essa é a regra &lt;em&gt;"sem fonte, sem afirmação"&lt;/em&gt;, e ela tem uma consequência sutil. Um produto com atributo desconhecido não é descartado do funil (ele pode até ser compatível), mas também não pode ser recomendado com aquele atributo como promessa.&lt;/p&gt;

&lt;p&gt;Voltemos ao nosso exemplo. O funil terminou com 4 baterias compatíveis, mas o agente recomenda apenas 2. Por quê?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gate aplicado&lt;/th&gt;
&lt;th&gt;Compatíveis&lt;/th&gt;
&lt;th&gt;100% confirmados&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;… + start-stop = não&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dois dos quatro fabricantes simplesmente não declaram a aplicação para o Mondeo 2004 nas suas tabelas oficiais. Carros antigos são os mais afetados, pois os catálogos priorizam a frota recente. Esses dois produtos não foram eliminados, mas o agente não tem fonte para prometer o encaixe. Então a recomendação exibe só os 2 confirmados.&lt;/p&gt;

&lt;p&gt;E quando a conta chega a zero confirmados? O agente não flexibiliza o critério para mostrar proximidades. Transborda para o atendimento humano. No projeto real, houve um &lt;em&gt;gate&lt;/em&gt; para o qual a fonte oficial não confirmava o atributo para nenhum produto do catálogo, e aceitamos, por decisão registrada em ADR, que 100% desses pedidos transbordassem para humanos. Pode parecer uma limitação do produto, mas é o comportamento certo quando a meta é reduzir devoluções.&lt;/p&gt;

&lt;p&gt;Esse desenho também muda a forma de medir a confiança no agente. O filtro é código determinístico, então cada regra de compatibilidade pode ser coberta por testes. A proveniência, por sua vez, permite auditar qualquer recomendação até a página do datasheet de origem. Por fim, o roteiro de validação executado junto ao cliente exercita os casos-limite, inclusive os transbordos. Com isso, o critério de zero recomendações contradizendo a fonte oficial deixa de ser uma promessa e passa a ser verificado de forma objetiva. Esse foi o gate de qualidade que a PoC precisou passar para ser aprovada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custos
&lt;/h2&gt;

&lt;p&gt;Uma das vantagens normalmente atribuídas ao uso de código determinístico está na redução de custos. O &lt;em&gt;backend&lt;/em&gt; da aplicação roda em um Lambda com arquitetura arm64 e 512 MB de memória RAM, escrito em Python. Cogitamos Go ou Rust pela performance, mas o custo de computação do Lambda é desprezível perto do custo de tokens (menos de 1% do custo de um turno). A economia real vem da arquitetura, não da linguagem. É uma única chamada curta de LLM por turno, com o catálogo fora do contexto, já que a consulta de compatibilidade é feita pelo &lt;em&gt;backend&lt;/em&gt;, sem gastar token. O turno de abertura do &lt;em&gt;widget&lt;/em&gt; sequer aciona o LLM. Um &lt;em&gt;fallback&lt;/em&gt; determinístico faz a primeira pergunta.&lt;/p&gt;

&lt;p&gt;A tabela abaixo apresenta uma estimativa de custos em diferentes cenários, considerando três abordagens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Motor híbrido:&lt;/strong&gt; a abordagem deste artigo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% IA (sem cache):&lt;/strong&gt; o mesmo produto, mas com a tabela de compatibilidade e as especificações dentro do contexto a cada turno, e o LLM decidindo a compatibilidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% IA (com &lt;em&gt;prompt caching&lt;/em&gt;):&lt;/strong&gt; idem, com o catálogo em cache de prompt.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cenário&lt;/th&gt;
&lt;th&gt;Motor híbrido&lt;/th&gt;
&lt;th&gt;100% IA (sem cache)&lt;/th&gt;
&lt;th&gt;100% IA (com prompt caching)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Por turno&lt;/td&gt;
&lt;td&gt;$0,008&lt;/td&gt;
&lt;td&gt;$0,074&lt;/td&gt;
&lt;td&gt;$0,017*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Por conversa&lt;/td&gt;
&lt;td&gt;$0,04&lt;/td&gt;
&lt;td&gt;$0,37&lt;/td&gt;
&lt;td&gt;$0,16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.000 conversas/mês&lt;/td&gt;
&lt;td&gt;$66&lt;/td&gt;
&lt;td&gt;$396&lt;/td&gt;
&lt;td&gt;$186&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.000 conversas/mês&lt;/td&gt;
&lt;td&gt;$438&lt;/td&gt;
&lt;td&gt;$3.738&lt;/td&gt;
&lt;td&gt;$1.638&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100.000 conversas/mês&lt;/td&gt;
&lt;td&gt;$4.150&lt;/td&gt;
&lt;td&gt;$37.150&lt;/td&gt;
&lt;td&gt;$16.150&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;* No primeiro turno da conversa há o custo de escrita do cache (~$0,092); os turnos seguintes leem o cache.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota de metodologia:&lt;/strong&gt; valores estimados com Claude Sonnet 4.6 (&lt;code&gt;temperature 0&lt;/code&gt;, &lt;code&gt;maxTokens 500&lt;/code&gt;); conversa típica de 6 turnos, dos quais 5 acionam o LLM (a abertura é determinística). No motor híbrido, cada turno usa ~1,5 mil tokens de entrada e ~230 de saída; nos cenários "100% IA", o catálogo adiciona ~22 mil tokens de entrada por turno. As linhas mensais incluem a infraestrutura fixa (API Gateway, Lambda, DynamoDB, CloudFront, S3), idêntica nas três colunas. Números arredondados para ilustrar ordem de grandeza.&lt;/p&gt;

&lt;p&gt;Em termos relativos, quantas vezes mais caro fica o "100% IA" em relação ao motor híbrido:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cenário&lt;/th&gt;
&lt;th&gt;100% IA (sem cache)&lt;/th&gt;
&lt;th&gt;100% IA (com prompt caching)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Por conversa&lt;/td&gt;
&lt;td&gt;9,3×&lt;/td&gt;
&lt;td&gt;4,0×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.000 conversas/mês&lt;/td&gt;
&lt;td&gt;6,0×&lt;/td&gt;
&lt;td&gt;2,8×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.000 conversas/mês&lt;/td&gt;
&lt;td&gt;8,5×&lt;/td&gt;
&lt;td&gt;3,7×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100.000 conversas/mês&lt;/td&gt;
&lt;td&gt;9,0×&lt;/td&gt;
&lt;td&gt;3,9×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;A escolha por código determinístico em pontos estratégicos da arquitetura está ancorada em três pilares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acurácia&lt;/li&gt;
&lt;li&gt;Custos&lt;/li&gt;
&lt;li&gt;Latência&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No caso apresentado, a acurácia foi o principal motivador. A recomendação precisa ser exata. E ser exata, neste contexto, significa nunca contradizer a fonte oficial. Essa propriedade só é garantida porque a decisão de compatibilidade é código determinístico sobre dado curado com proveniência. O LLM faz o que só ele faz bem: conversar, extrair informação em qualquer ordem e responder dúvidas com fonte citada.&lt;/p&gt;

&lt;p&gt;A redução de custos foi consequência. Confesso que não pensamos nisso no início do projeto. Tampouco o cliente abordou a questão. Mas quando fizemos as contas, ficamos surpresos com a economia. Sem o motor híbrido, o catálogo inteiro seria enviado no contexto do modelo a cada turno, consumindo tokens para uma decisão que uma consulta de milissegundos resolve.&lt;/p&gt;

&lt;p&gt;A latência seguiu o mesmo caminho. Como a consulta de compatibilidade é feita diretamente pelo &lt;em&gt;backend&lt;/em&gt;, nem a requisição nem a resposta precisam ser interpretadas pelo modelo.&lt;/p&gt;

&lt;p&gt;Apesar do avanço dos agentes de IA, o código determinístico continua sendo a melhor opção para os pontos do sistema onde entrada e saída são conhecidas. Um bom exemplo são os cálculos matemáticos. Uma simples calculadora, movida por duas pilhas AA, é muito mais rápida e eficiente para fazer contas do que um LLM rodando em um supercomputador equipado com várias placas de vídeo de última geração. Mas os casos que aparecem em produção raramente estão nesse extremo. O mais comum é o meio-termo, como no nosso exemplo. A conversa é aberta e, portanto, fica com o LLM. A decisão é fechada, uma regra de compatibilidade sobre uma tabela curada, e por isso fica com o código.&lt;/p&gt;

&lt;p&gt;E esse meio-termo generaliza. Se no seu domínio uma recomendação errada vira devolução, troca ou retrabalho (autopeças, informática, móveis sob medida), a decisão deve estar ancorada em dados estruturados, verificáveis e com proveniência, filtrados por código. O LLM entra para conversar, extrair informações e enriquecer respostas, não para inventar a resposta.&lt;/p&gt;

&lt;p&gt;Um bom arquiteto de software não é aquele que sempre usa os recursos mais atuais e avançados de computação, mas sim aquele que conhece a melhor aplicabilidade para cada tecnologia.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>aws</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
