O Agente
Um agente é uma entidade que interage com um ambiente em qualquer nível significativo. Uma pessoa em seu dia a dia é um agente nesse sentido, assim como um termostato que mantém a temperatura de uma sala ou um carro autônomo que se desloca pelo trânsito.
Todos eles percebem o ambiente por meio de sensores e agem sobre ele por meio de atuadores. Como cada ação alimenta a observação seguinte, percepção e ação formam um ciclo contínuo, o ciclo perceber, raciocinar e agir, que dura enquanto o agente interage. Todos os agentes construídos no curso seguem esse ciclo. O que muda é quanto conseguem perceber e até onde suas ações alcançam.
As três partes do ciclo
Cada iteração passa por três etapas, com nomes simples e funções distintas.
A percepção reúne o que o agente pode saber, o raciocínio escolhe o que fazer e a ação altera o ambiente. A percepção e a ação costumam vir de um modelo de interação existente, seja ele usado para controlar um aspirador, automação web, uma entidade de jogo ou um humanoide. O raciocínio pode mudar sem alterar essa fronteira, o que separa capacidade de alcance.
Profundo · ConceitosExplorar o ciclo e as arquiteturas clássicas?
Abra esta seção para ver exemplos concretos e uma taxonomia mais completa de arquiteturas.
- A percepção fornece tudo o que o agente sabe sobre o ambiente. Um termostato lê um único número: a temperatura atual. Um carro autônomo combina câmeras, radar e um mapa em um modelo da via. O agente trabalha somente com o que a percepção captura, pois as etapas seguintes não acessam o mundo diretamente. Uma lacuna na percepção permanece invisível para o restante do agente.
- O raciocínio transforma uma percepção em uma decisão, e isso varia muito entre agentes. Um termostato compara a temperatura com um alvo e para por aí, enquanto um motor de xadrez busca milhões de jogadas e um carro autônomo executa uma política aprendida. Os agentes que você constrói aqui raciocinam chamando um modelo de linguagem, e quase tudo o que o curso acrescenta depois (ferramentas/memória/planejamento) se apoia nesse único passo.
- A ação altera o ambiente para o próprio agente e para outros participantes. Pode ser tão pequena quanto acionar um relé ou tão complexa quanto conduzir um carro. Nas páginas seguintes, o código exposto ao modelo recebe o nome de ferramenta, pois, para o modelo, ele representa outra ação disponível. Chamar uma ferramenta significa solicitar que esse código seja executado como ação. O conjunto de ações também define o alcance máximo do agente: por melhor que seja o raciocínio, ele só afeta o mundo por meio das ações permitidas.
Os projetos clássicos de agentes diferem na etapa de decisão. O livro Artificial Intelligence: A Modern Approach, de Russell e Norvig, organiza esses projetos em um espectro que vai do agente reflexo a um agente de aprendizagem capaz de melhorar as próprias regras. O curso começa com lógica rígida e depois acrescenta um modelo de linguagem e contexto projetado, aproximando o ciclo de um agente orientado a objetivos e baseado em modelo. Nos módulos seguintes, o ciclo continua sobre um estado que muda, padrão que serve de base para agentes de aprendizagem.
Aplicado · ReflexoExecutar o menor ciclo de agente baseado em regras?
Um agente sem modelo de linguagem
A menor função de decisão é uma única instrução if. Aqui ela conduz uma pista
unidimensional limitada por paredes nas posições 0 e 9. Pressione Run e observe a posição
alternar entre as paredes enquanto o ciclo é executado.
Duas coisas que vale a pena examinar no código acima:
- O ambiente (posições das paredes, posição atual) vive em
state.env, enquanto as características intrínsecas do agente (sua direção) vivem emstate.agent. Mantê-los separados significa que um agente diferente, com estado intrínseco diferente, pode operar no mesmo ambiente sem atrito. - O passo de raciocínio é uma única instrução
if. Substituí-lo por algo mais poderoso, seja uma árvore de decisão, uma rede neural ou um modelo de linguagem, exige apenas mudar o que está entre a percepção e a ação. A estrutura do laço, a organização do estado e o passo de ação permanecem idênticos.
O que muda quando o raciocínio chama um LLM
Você chama a interface de chat-completions como qualquer outra função: entregue a ela uma lista de mensagens e um nome de modelo, e ela devolve uma mensagem do assistente mais metadados.
chat(). É o wrapper fornecido pelo curso que você executa ao vivo um pouco mais adiante nesta página. O trecho abaixo prevê o formato de chamada e os campos que ele retorna, para que os nomes já sejam familiares quando você chegar à célula executável.
const reply = await chat({
model: "nvidia/nemotron-3-nano-30b-a3b",
messages: [{ role: "user", content: "Hi" }],
});
// reply.choices[0].message → { content, reasoning_content }
// reply.choices[0].finish_reason → "stop" | "tool_calls" | "length"
Três fatos sobre essa função moldam como os agentes construídos sobre ela precisam funcionar:
- As chamadas não compartilham estado. Entre requisições o servidor não guarda nada para você. Se quiser que o modelo lembre do turno anterior, você envia esse turno de novo. A "memória" de uma conversa é uma lista de mensagens que seu código mantém e reenvia a cada vez.
- A saída tem dois canais. Modelos de raciocínio retornam suas anotações de trabalho em
reasoning_contente sua resposta final emcontent. Você inspeciona essas anotações durante o desenvolvimento, enquanto o próximo estágio do laço lê e age sobre a resposta emcontent. - finish_reason é a condição de saída do laço.
"stop"significa que o modelo escreveu sua resposta final."tool_calls"significa que ele quer que seu código execute uma função nomeada e reporte o resultado de volta."length"significa que o orçamento de tokens acabou antes de o modelo terminar. Um laço que conduz um agente baseado em LLM é construído inteiramente em torno de ler esse único campo e decidir o que fazer em seguida.
Profundo · ConstruçãoComparar onde as APIs mantêm o estado da conversa?
Este curso usa a
Chat Completions API
o tempo todo: você mantém a conversa como um array messages[] no seu próprio código e reenvia o array completo a cada turno. A mais recente
Responses API
pode, em vez disso, manter a thread no servidor, de modo que você envia apenas a nova entrada e uma referência ao turno anterior. De qualquer forma, o modelo permanece sem estado e inalterado entre as chamadas. A conversa vive fora dele, em um estado que seu código ou o servidor guarda.
Uma chamada de verdade, no seu navegador
A célula abaixo envia uma chat-completion ao modelo. Ela precisa de uma chave de API da NVIDIA, mas o nível gratuito cobre todos os exercícios. Você a insere uma vez, e o curso então a mantém no seu navegador e a reutiliza em todas as páginas, para que você nunca a cole duas vezes.
Pressione Run para enviar uma única requisição. Ela se sustenta inteiramente sozinha, sem nenhum laço em volta e sem carregar nada de um turno anterior.
Profundo · ProtocoloInspecionar a solicitação e a resposta HTTP brutas?
O que o chat() realmente envia
chat() é um wrapper de conveniência em torno de um único
POST HTTP comum no formato de transmissão compatível com a OpenAI. Essa requisição carrega três coisas:
- o endpoint para onde enviar,
- um cabeçalho
Authorizationque carrega sua chave, - e um corpo JSON com
modelemessages.
A célula abaixo faz essa chamada manualmente e mostra os dois lados. Abra request para ver o que sai do seu navegador com a chave omitida, e raw response para ver o objeto completo que o chat() devolve.
Todos os endpoints deste curso falam esse mesmo formato, incluindo o runtime do agente OpenClaw no Módulo 3.
- Sua requisição pode passar por um proxy. Se você selecionou a opção
LMS/iframe ao informar a chave, a requisição não segue diretamente para
build.nvidia.com. Como esse endpoint não retorna os cabeçalhos de origem cruzada (CORS) exigidos porfetchno navegador, a chamada passa por um proxy que os acrescenta. O proxy também adiciona um cabeçalho de atribuição para identificar o tráfego do curso. A lição envia sua chave nessa requisição sem armazená-la nem substituí-la. - O streaming é encapsulado em um helper.
chatStream()envia a mesma requisição de chat com streaming ativado e interpreta o fluxo de eventos como texto de resposta, texto de raciocínio, metadados de uso e sinal de término. O helper conecta esses elementos ao painel da lição e ao botão Stop, deixando a célula concentrada no conceito. O código-fonte do helper pode ser aberto pelo menu da célula.
Aplicado · CicloComparar formas de raciocinar sobre o labirinto dentro de um ciclo fixo?
Trocar a função de decisão sem alterar o ciclo
Você agora tem as duas metades de um agente. A função sem estado chat() combina
com o ciclo perceber, raciocinar e agir do agente reflexo anterior. Antes de conectar o
modelo ao ciclo, observe a etapa de decisão com rotinas que não são modelos de linguagem.
Execute os nós em ordem. Cada um aplica uma regra de decisão diferente ao mesmo ciclo que resolve o labirinto:
- A regra constante "sempre leste" alcança o objetivo em um corredor reto, depois trava na primeira parede do labirinto, já que um rumo fixo não consegue virar.
- A busca em profundidade (DFS) segue um ramo até o fim antes de voltar.
- A busca em largura (BFS) explora a fronteira por níveis e encontra o caminho mais curto em uma grade sem pesos.
- O A* usa uma heurística de distância para priorizar caminhos promissores sem perder a garantia de menor caminho.
chat() pode
ocupar a mesma etapa. Duas bordas mudam: o código representa a percepção como texto e
o modelo devolve uma chamada de ferramenta que o código aplica.
Como usar um modelo de linguagem para escolher movimentos
O ciclo ainda amostra o mundo e aplica um movimento validado. Somente a etapa de decisão
muda. Em vez de DFS, BFS ou A*, o modelo lê a representação do labirinto e solicita ao
código uma chamada de choose_direction.
Execute as células nesta ordem e depois altere um controle por vez:
- Comece pelo nó do mecanismo. Ele exporta os utilitários e o resolvedor compartilhado
state.runMaze, que percorre corredores automaticamente e chama o modelo somente nas bifurcações. - Execute o nó editável do agente.
DIRECTIVEé a instrução central do sistema; o objeto de opções controla modelo, tamanho, mapa textual, imagem, histórico de movimentos, trilha de coordenadas e repetição do schema da ferramenta. - Use primeiro os padrões funcionais. Depois, ative
includeImage, troquemodelpara comparar modelos ou definaadvancedpara ampliar o labirinto.
choose_direction oferece o mesmo contrato
ao modelo e o aplica por meio de JSON Schema. Assim, o ciclo lê um valor tipado em vez de
interpretar texto livre, e o modelo de linguagem ocupa a etapa de decisão antes usada por BFS e A*.
O ciclo em detalhe
Coloque a chamada chat() dentro do laço que reenvia o histórico, e um único turno de qualquer agente LLM neste curso assume o mesmo formato de quatro estágios. Nomeie os estágios agora, porque toda questão de segurança e confiabilidade mais à frente remete a uma destas quatro setas.
- Amostrar localmente. Seu código lê uma fatia do ambiente, que pode ser a célula do labirinto e seus movimentos válidos, ou a última mensagem do usuário, ou o conteúdo de um arquivo. Ele nunca tenta abarcar o mundo inteiro de uma vez, porque tudo o que o turno exige é o pedaço estreito de estado que o modelo precisa para agir desta vez.
- Perceber localmente. Essa fatia é renderizada em um contexto completo e construído: o prompt de sistema, o histórico
messages[]em andamento, resultados de ferramentas anteriores e a fatia que você acabou de amostrar. Tudo isso é texto puro. Para um agente LLM, a percepção é engenharia de contexto. - Agir localmente. O modelo mapeia esse texto em mais texto: um
sinal de intenção, idealmente uma chamada de ferramenta tipada como
{ "move": "east" }em vez de prosa livre. A intenção apenas solicita uma ação, e nunca executa uma. Seu código a lê e aplica uma atualização limitada ao ambiente (doMove(...)), validando-a primeiro. - Impactar localmente. A atualização muda o mundo. Nada permanece dentro do modelo. O estado durável está no ambiente e no contexto que o código reconstruirá. No turno seguinte, a amostragem local lê o mundo alterado e o ciclo recomeça.
Olhe de perto o meio dessa lista. O passo de perceber-a-agir é um único mapeamento texto-para-texto sem estado , no qual um contexto completo e construído entra e um sinal de intenção volta. O modelo apenas transforma texto, então perceber o mundo e transformar uma intenção em uma mudança real continuam sendo trabalho do seu código nos dois lados desse mapeamento.
Isso deixa a caixa verde abaixo como a única parte que você não escreveu. Um agente, portanto, tem apenas duas escolhas: o que você alimenta em seu contexto e o que você faz com a intenção que ele retorna.
Antes de continuar
Cada pergunta pode ser respondida ajustando um controle na célula do labirinto-LLM acima e rodando de novo.
- Tire o texto do modelo multimodal.
Defina
includeText:falseeincludeImage:truee execute novamente. Agora o modelo vê somente a imagem do labirinto. Ele ainda alcança o objetivo? Precisa de mais decisões do que na execução com texto e imagem? - Remova a dica de estratégia da DIRECTIVE. Exclua a linha que recomenda ramos ainda não visitados e execute a mesma célula. Compare a quantidade de decisões com a execução que continha a dica. Quanto daquela competência veio de uma única frase?
- Troque o modelo de decisão.
Mude
model:"vision"paramodel:"super"e execute novamente. Ciclo, labirinto, percepção e ação permanecem iguais; somente o modelo muda. O modelo de texto maior alcança o objetivo com menos decisões?
Experimente · o modelo como uma função pura
O menor artefato do curso é uma única chamada chat() sem ferramentas e sem memória ao redor. Cada mensagem que você envia se sustenta sozinha, executando a função pura e sem estado que o laço vai depois envolver. Digite algo abaixo e observe a resposta chegar em streaming.