O que é um AI agent: cinco tipos clássicos, duas definições rivais
O mundo do aspirador partido quatro vezes, cada falha revelando um dos cinco tipos clássicos de agent. Depois, uma tool multiplica 39 tokens por 420.
Nesta página
Aqui está a mesma pergunta, feita duas vezes ao mesmo modelo, com os mesmos pesos e greedy decoding. A única diferença é que, da segunda vez, havia uma tool no catálogo.
no tools in the catalogue
turn 1 prompt= 39 out= 8 finish=stop TEXT "The capital of France is Paris."
=> model calls=1 prompt tokens=39 output=8 wall=974 ms
one tool in the catalogue: get_temperature(city)
turn 1 prompt= 185 out= 20 finish=tool_calls CALL get_temperature({"city": "Paris"})
tool get_temperature -> {"city":"Paris","celsius":11}
turn 2 prompt= 235 out= 18 finish=stop TEXT "The capital of France is Paris. It is
currently at 11 degrees Celsius."
=> model calls=2 prompt tokens=420 output=38 wall=6,685 msUma chamada tornou-se duas. Trinta e nove input tokens tornaram-se 420, um fator de 10,8. Menos de um segundo tornou-se quase sete. E a resposta ganhou um facto que ninguém pediu, vindo de uma tool que o modelo escolheu chamar para uma pergunta que nunca mencionou o tempo.
O segundo sistema é aquilo a que a maior parte da indústria, em 2026, chama um agent. Ou não é, dependendo de qual das duas definições mais lidas abrir — e essas duas não dizem a mesma coisa. Uma delas nem sequer concorda consigo própria.
Esse desacordo é este capítulo. Não é uma disputa de vocabulário: as duas definições traçam a fronteira em eixos diferentes, e o eixo que escolher decide o que constrói e o que lhe é faturado. Ambas assentam numa taxonomia mais antiga, e a forma mais barata de a ganhar é construir o pior agent do mundo.
Mostrar detalhes
O que este capítulo precisa dos anteriores.
- Capítulo 13 mediu quanto custa uma única chamada em tempo; este capítulo multiplica isso pelo número de turnos.
- Capítulo 15: o prompt é o estado completo do modelo, porque nada sobrevive à chamada.
- Capítulo 16: os input tokens crescem com o quadrado da conversa.
- Capítulo 18: o catálogo de tools e a viagem de ida e volta em que o modelo pede e o seu código executa.
Sem tensores aqui. O capítulo é TypeScript, onde a regra de linguagem do Capítulo 14 o coloca, e o seu loop é o antepassado direto do loop do Capítulo 23.
Um robô com duas divisões
Ligação para a secção: Um robô com duas divisõesO exemplo mais antigo da área é um aspirador num mundo de dois quadrados, A e B, cada um limpo ou sujo.1 Sobrevive em todos os manuais porque é o mundo mais pequeno em que um agent pode estar certo ou errado.
O percepto é um par — onde estou e se aqui está sujo — e as ações são SUCK, LEFT e RIGHT. O programa inteiro é uma linha.
type Percept = { dirty: boolean; where?: "A" | "B" };
type Action = "SUCK" | "LEFT" | "RIGHT";
const textbook = (p: Percept): Action =>
p.dirty ? "SUCK" : p.where === "A" ? "RIGHT" : "LEFT"; Execute-o contra todas as configurações iniciais do mundo de dois quadrados:
A dirty, B dirty, start A -> steps=3 clean=true
A clean, B dirty, start A -> steps=2 clean=true
A dirty, B clean, start B -> steps=2 clean=trueIsto é um simple reflex agent: age apenas sobre o percepto atual, sem memória de nada anterior. Não é uma categoria de brinquedo — um termóstato é um, e uma única chamada a um modelo de linguagem sem conversa anexada também.
Agora parta-o como a realidade faz. Um aspirador robô real tem um sensor de sujidade e um para-choques, não um quadrado etiquetado A debaixo da carpete. Retire a localização do percepto e não mude mais nada:
const dirtOnly = (p: Percept): Action => (p.dirty ? "SUCK" : "RIGHT");A dirty, B dirty, start A -> steps=3 clean=true still dirty=0
t=0 at=A percept={dirty:true} -> SUCK
t=1 at=A percept={dirty:false} -> RIGHT
t=2 at=B percept={dirty:true} -> SUCK
A dirty, B clean, start B -> steps=500 clean=false still dirty=1
t=0 at=B percept={dirty:false} -> RIGHT
t=1 at=B percept={dirty:false} -> RIGHT
t=2 at=B percept={dirty:false} -> RIGHT
t=3 at=B percept={dirty:false} -> RIGHTO mesmo programa, dois quadrados. A partir de um estado inicial acaba em três passos; a partir de outro bate na parede da direita quinhentas vezes e continuaria até a bateria morrer. Não consegue perceber a diferença entre as duas situações, por isso não consegue agir de forma diferente nelas. Russell e Norvig enunciam o resultado geral numa linha: loops infinitos são muitas vezes inevitáveis para simple reflex agents em ambientes parcialmente observáveis.1
Há uma correção que custa uma linha e nenhuma memória, que vale a pena medir antes de recorrermos a algo mais inteligente.
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);
const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT"); Duas mil execuções de um corredor todo sujo em três tamanhos, com um único gerador seeded do princípio ao fim:
| divisões | passos médios | mediana | pior de 2.000 | nunca terminou |
|---|---|---|---|---|
| 2 | 4,0 | 4 | 13 | 0 |
| 4 | 16,6 | 14 | 81 | 0 |
| 8 | 68,7 | 52 | 306 | 0 |
A aleatorização remove completamente o loop. Também tem um custo: oito divisões precisam de quinze movimentos se souber o que está a fazer, e este agent faz em média 68,7 e chegou a demorar 306. Esse é o capítulo inteiro em miniatura. Cada capacidade que adicionamos compra correção num caso que o agent anterior não conseguia tratar, e cobra por isso numa moeda que tem primeiro de nomear.
Dar nome às peças, agora que são necessárias
Ligação para a secção: Dar nome às peças, agora que são necessáriasUm agent perceciona o seu ambiente através de sensores e age através de atuadores. O programa do agent é a função de perceptos para ações — cada listagem acima é uma. A sequência de perceptos é tudo o que foi percecionado até agora, e um simple reflex agent ignora tudo exceto o último item.
Racionalidade é a palavra que a maioria dos artigos usa mal, e acertar nela torna o resto deste capítulo utilizável. Um agent não é racional ou irracional em si. Russell e Norvig definem um agent racional como aquele que, para cada sequência de perceptos possível, seleciona a ação que se espera maximizar a sua medida de desempenho, dadas as evidências dessa sequência e qualquer conhecimento incorporado que tenha.1 A medida de desempenho não está dentro do agent: pertence ao designer, e a racionalidade só é definida relativamente a ela.
A especificação é convencionalmente escrita como quatro coisas, PEAS: medida de desempenho, ambiente, atuadores, sensores.
| o aspirador robô | um support agent em produção | |
|---|---|---|
| medida de desempenho (P) | quadrados limpos, por unidade de bateria | tickets resolvidos, por dólar, sem escalamento |
| ambiente (E) | o chão, a sujidade, a mobília, a carpete | a fila de tickets, a sua base de dados, o cliente |
| atuadores (A) | rodas, sucção | chamadas de tool |
| sensores (S) | sensor de sujidade, para-choques | a mensagem do utilizador, resultados de tools |
Repare em qual é a linha fora do comum. Quase todas as equipas que constroem agents em 2026 escrevem E, A e S — os schemas das tools, as integrações, o formato das mensagens — porque o código não corre sem isso. Quase ninguém escreve P. Sem isso, "o nosso agent está a portar-se bem" não tem significado que alguém possa verificar, e "racional" não se pode aplicar ao sistema de todo, apenas a uma demonstração. O Capítulo 29 é sobre transformar P num número, e é por isso que existe.
┌───────────────────────── the environment ─────────────────────────┐
│ │
│ ┌──────────────────────── the agent ─────────────────────┐ │
│ │ │ │
───┼──►│ sensors ──► the agent program ──► actuators ─────┼──────┼──►
percept │ │ action
│ └────────────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────────────────┘
▲
the performance measure lives out here, in the head of
whoever built the thing, and the agent cannot change itOs ambientes de tarefa são ainda classificados ao longo de sete eixos, cinco dos quais determinam a maior parte da dificuldade aqui: total ou parcialmente observáveis, determinísticos ou não, episódicos ou sequenciais, estáticos ou dinâmicos, conhecidos ou desconhecidos.1 Um agent que fala com tools reais através de uma rede real está no canto difícil dos cinco — não determinístico mesmo a temperature zero (Capítulo 17) e, o ponto subestimado, desconhecido, porque não tem um modelo fiável do que as suas próprias tools fazem ao mundo. É por isso que o loop do Capítulo 23 precisa mais de tratamento de erros do que de planeamento.
Adicionar memória e encontrar a próxima parede
Ligação para a secção: Adicionar memória e encontrar a próxima paredeChãos reais não são unidimensionais, por isso eleve o mundo a uma planta. Cardinales são paredes, asteriscos são sujidade, e o robô começa na câmara do meio:
col 0 1 2 3 4 5 6
row 0 * . . # . . *
row 1 . # . # . # .
row 2 . # . S . # . S = the robot starts here
row 3 . # . # . # .
row 4 * . . # . . *A melhoria óbvia é memória. O agent mantém um mapa: cada quadrado onde esteve e cada quadrado onde o para-choques disparou. A sua regra é entrar num quadrado adjacente que ainda não visitou — direita, depois baixo, depois esquerda, depois cima — e recuar quando tudo à volta já é conhecido. Isto é um model-based reflex agent: mantém estado interno a partir do histórico de perceptos, para poder agir sobre o que não consegue ver neste momento.
É uma melhoria real, e ainda assim não chega:
5,000 steps allowed -> steps=5,000 distinct squares visited=13/25 still dirty=2/4Cinco mil movimentos, metade do chão nunca vista. O mapa está correto e as regras estão corretas. O que o agent não consegue fazer é usar o mapa para ir a algum lado: as suas regras só respondem a "em qual dos meus quatro vizinhos devo pisar", por isso, quando fica sem quadrados não visitados ao lado, não tem forma de expressar o pensamento há um quadrado não visitado a oito movimentos de distância e eu gostava de estar em cima dele. Sabe onde está. Não sabe onde quer estar.
Um objetivo e depois uma razão para preferir uma rota a outra
Ligação para a secção: Um objetivo e depois uma razão para preferir uma rota a outraUm goal-based agent mantém, por cima do seu modelo do mundo, uma descrição da situação que quer provocar, e escolhe ações procurando em sequências delas até encontrar uma que acabe aí. Objetivos transformam a seleção de ações de uma consulta numa pesquisa.
O objetivo é "não resta nenhum quadrado sujo". A pesquisa é uma exploração em largura até ao quadrado sujo mais próximo, e o caminho que devolve é o plano.
goal-based (fewest moves) -> moves=27 battery=52 still dirty=0
from 2,3 -> 4,6 via 5 moves: 2,3 2,4 3,4 4,4 4,5 4,6
from 4,6 -> 0,6 via 4 moves: 4,6 3,6 2,6 1,6 0,6
from 0,6 -> 4,0 via 10 moves: 0,6 0,5 0,4 1,4 2,4 2,3 2,2 3,2 4,2 4,1 4,0
from 4,0 -> 0,0 via 4 moves: 4,0 3,0 2,0 1,0 0,0Vinte e sete movimentos, chão limpo. Mas olhe para a coluna da bateria e para a última perna do plano. A coluna 0 tem carpete: atravessar um quadrado com carpete custa seis unidades de bateria, um quadrado com mosaico custa uma. O agent voltou a casa pela coluna 0 porque são quatro movimentos em vez de oito, e esses quatro movimentos na carpete custaram 24 quando o desvio de oito movimentos teria custado 13.
Não consegue fazer de outra forma. Um objetivo é um teste binário: o chão está limpo ou não está. Todos os planos que acabam com um chão limpo o satisfazem igualmente, por isso, quando vários têm sucesso, o agent não tem nada para escolher entre eles. Preferir um sucesso a outro precisa de um número sobre resultados, e esse número é uma função de utilidade. Um agent que a maximiza é um utility-based agent.
A alteração ao código é um termo dentro da pesquisa. A pesquisa em largura conta movimentos; faça-a contar custo e tem o algoritmo de Dijkstra e um agent diferente:
const nd = dist.get(k)! + (byCost ? cell.cost : 1); // <- the entire differencegoal-based (fewest moves) -> moves=27 battery=52 still dirty=0
utility-based (cheapest route) -> moves=31 battery=41 still dirty=0
from 4,0 -> 0,0 via 8 moves: 4,0 4,1 4,2 3,2 2,2 1,2 0,2 0,1 0,0Mais quatro movimentos, menos onze unidades de bateria: vinte e um por cento mais barato. Mesmo objetivo, mesmo mapa, mesmo código exceto por um termo. Os dois agents diferem apenas no que estão a tentar fazer bem, e tomam rotas diferentes para casa.
Este é também o primeiro ponto em que o agent precisa de algo que não consegue produzir. Alguém tem de decidir quanto vale uma unidade de bateria relativamente a um movimento. A utilidade é a medida de desempenho escrita numa forma com que o agent consegue calcular, e escrevê-la é trabalho do designer. Quando as pessoas dizem que um agent "otimizou a coisa errada", quase nunca querem dizer um bug. Querem dizer que esta linha foi escrita sem cuidado.
O quinto tipo e a forma como corre mal
Ligação para a secção: O quinto tipo e a forma como corre malAgora deixe a sujidade voltar. Quatro divisões voltam a sujar-se a quatro ritmos diferentes, e o agent nunca os recebe. Visita uma divisão por tick e vê apenas essa divisão. A medida de desempenho são room-ticks passados sujos ao longo de 4.000 ticks — mais baixo é melhor.
Um learning agent, na decomposição do manual, é qualquer um dos anteriores mais três partes: um elemento de aprendizagem que altera o agent, um crítico que lhe diz como o agent se está a sair face a um padrão de desempenho fixo, e um gerador de problemas que propõe ações que vale a pena tentar pelo que ensinariam.1 Três políticas no mesmo ambiente. A primeira não aprende; a segunda e a terceira aprendem a mesma coisa e usam-na de forma diferente.
| política | room-ticks sujos em 4.000 | face à ronda |
|---|---|---|
| ronda fixa round-robin, sem aprendizagem | 2.290 | — |
| learner A: estima a taxa de sujidade de cada divisão, depois vai onde a sujidade é mais provável | 11.820 | 5,2× pior |
| learner B: mesmas estimativas, ponderadas pelo tempo desde a última visita | 1.576 | 31 % melhor |
As taxas escondidas eram 0,35 para a cozinha, 0,05 para o corredor, 0,02 para o escritório e 0,01 para o sótão — e o learner A descobriu-as. Identificou corretamente a cozinha como a divisão mais suja da casa, depois foi à cozinha em todos os ticks durante o resto da simulação enquanto as outras três ficavam sujas para sempre. É cinco vezes pior do que não aprender de todo, e não está avariado.
A lição é a da secção da utilidade. O learner A maximizou "probabilidade de a divisão que estou prestes a visitar estar suja". A medida de desempenho era "room-ticks passados sujos". Números diferentes; o segundo é o que o crítico estava a pontuar, e ninguém o disse ao agent. O learner B multiplica a mesma taxa aprendida pelo tempo desde a última visita — a sujidade que espera encontrar em vez da hipótese de encontrar alguma — e bate a ronda de onde partiu.
Um detalhe de implementação decidiu o resultado. Na primeira versão do learner B, uma divisão onde não tinha aparecido sujidade em três visitas recebeu uma taxa exatamente zero — e zero vezes qualquer coisa é zero, por isso nunca mais foi visitada e a estimativa nunca pôde ser corrigida. Suavizar a fração, sucessos mais um sobre tentativas mais dois, transformou 11.895 em 1.576. "Ainda não observado" e "medido e deu zero" são afirmações diferentes, e um sistema que as guarda no mesmo campo toma decisões que não consegue desfazer.
Os cinco tipos e o que são em 2026
Ligação para a secção: Os cinco tipos e o que são em 2026 1 simple reflex percept ────────────────────────────────► rules ────► action
2 model-based percept ──► [state] ──────────────────► rules ────► action
3 goal-based percept ──► [state] ──► [goal] ──────► search ───► action
4 utility-based percept ──► [state] ──► [goal] ──► [U] ──► argmax ► action
5 learning all of the above, plus [critic] ──► changes the parts aboveTodos os cinco estão hoje em produção com outro nome.
| tipo clássico | o que transporta entre perceptos | a sua forma em 2026 | o que não consegue fazer |
|---|---|---|---|
| simple reflex | nada | uma chamada de modelo sem histórico: um classificador, um endpoint de extração, uma completion de turno único | qualquer coisa que dependa do turno anterior |
| model-based reflex | estado interno construído a partir do histórico de perceptos | um chat: a transcrição, reenviada inteira em cada chamada | escolher onde a conversa deve acabar |
| goal-based | estado mais uma descrição da situação desejada | um loop de razão-e-ação com uma condição de paragem2 | preferir um plano bem-sucedido a outro |
| utility-based | estado, objetivo e um número sobre resultados | loops avaliador–otimizador e ordenação de respostas candidatas por um critério escrito (Capítulo 25) | inventar o critério |
| learning | tudo isso, mais um crítico e um gerador de problemas | Reflexion, que escreve as suas próprias lições num buffer episódico em vez de atualizar pesos;3 memória persistente de utilizador (Capítulo 24) | escolher o padrão contra o qual o crítico pontua |
Duas linhas são mais próximas do que uma analogia, de uma forma que custa dinheiro.
O chat é um model-based reflex agent cujo modelo não é interno. No manual, o estado é uma variável dentro do programa do agent. Num chat, é a transcrição: vive do seu lado, é reenviada por completo em cada chamada e é reconstruída do zero dentro do modelo de cada vez. Essa é a fatura quadrática do Capítulo 16, e é o mesmo objeto que o manual desenhou como uma caixa etiquetada "estado". Aqui está a diferença, medida numa pergunta de seguimento com e sem as duas mensagens anteriores:
with the transcript prompt=67 "The current temperature in Lisbon, Portugal is 15°C."
without the transcript prompt=29 "Lisbon is the capital of Portugal, not a city in Portugal."O mesmo modelo, as mesmas três palavras de input do utilizador, e a segunda é o robô do corredor a bater na parede. Não havia tools nessa execução, por isso o 15 é inventado — mas o estado é o que faz a pergunta de seguimento significar alguma coisa. Reconstrói-o de cada vez e paga 2,3× os input tokens por isso numa conversa de dois turnos. O Capítulo 16 mediu até onde esse multiplicador chega no turno quarenta.
Reflexion é um learning agent que altera o input em vez do programa. Na decomposição do manual, o elemento de aprendizagem modifica o elemento de desempenho. Reflexion deixa os pesos em paz e escreve texto reflexivo num buffer episódico que a tentativa seguinte lê.3 O elemento de aprendizagem é um prompt, a memória é uma linha de base de dados, o elemento de desempenho é um modelo congelado — e o diagrama é o do manual, sem alterações.
E aqui está o limite honesto do mapeamento. Os cinco tipos classificam o programa do agent. Em 2026, esse programa está dividido ao meio: parte dele é o seu código, parte está dentro de pesos que não treinou. Quando um modelo decide sozinho chamar uma tool, o teste de objetivo está no seu programa ou no modelo? A taxonomia não tem resposta, porque quando foi escrita não havia outro sítio onde pudesse estar — e essa pergunta é exatamente o ponto em que as duas definições modernas se separam.
Responder, chamar e parar, num só trace
Ligação para a secção: Responder, chamar e parar, num só traceAs definições são argumentos sobre comportamento, e são muito mais fáceis de julgar com um trace à frente.
O loop abaixo envia a conversa para um modelo; se a resposta contiver uma chamada de tool, executa a tool, acrescenta o resultado e envia tudo outra vez. Corre contra um Qwen2.5-0.5B-Instruct local atrás de um endpoint com formato OpenAI nesta máquina — a costura do Capítulo 14, por isso o loop não sabe nem quer saber o que está atrás da porta.
const BASE = process.env.LLM_BASE_URL ?? "http://127.0.0.1:8799/v1";
async function loop(question: string, maxTurns = 6) {
const messages: Msg[] = [
{ role: "system", content: SYSTEM },
{ role: "user", content: question },
];
for (let turn = 1; turn <= maxTurns; turn++) {
const reply = await call(messages, TOOLS);
const calls = reply.choices[0].message.tool_calls ?? [];
messages.push(reply.choices[0].message);
if (!calls.length) return messages;
for (const c of calls) {
const out = runTool(c.function.name, JSON.parse(c.function.arguments));
messages.push({ role: "tool", name: c.function.name, content: out });
}
}
throw new Error("turn cap reached");
}Duas linhas transportam a ideia inteira, e ambas estão assinaladas; o resto é contabilidade. Os três comportamentos são visíveis numa só execução. Quando lhe perguntam algo que consegue fazer sozinho, o modelo responde. Quando lhe perguntam algo que não consegue, chama:
=== a question the model cannot answer, one tool available
turn 1 prompt= 187 out= 21 finish=tool_calls CALL get_temperature({"city": "Oslo"})
tool get_temperature -> {"city":"Oslo","celsius":4}
turn 2 prompt= 238 out= 12 finish=stop TEXT "The current temperature in Oslo is 4
degrees Celsius."
=> model calls=2 prompt tokens=425 output=33 wall=6,257 ms
=> stopped by: the model produced text instead of a callE para — o terceiro comportamento, e o mais fácil de ignorar, porque parece que nada aconteceu. O loop termina porque o turno 2 voltou sem chamada de tool. Ninguém decidiu isso; o modelo decidiu, ao emitir prosa. A condição de terminação deste programa é o sinal de uma ausência.
Mais duas execuções merecem o espaço. Ao pedir-lhe para comparar duas cidades, o modelo emite ambas as chamadas de tool num só turno, recebe as duas leituras de volta e erra a comparação:
turn 1 prompt= 188 out= 43 finish=tool_calls CALL get_temperature({"city": "Oslo"}),
get_temperature({"city": "Lisbon"})
tool get_temperature -> {"city":"Oslo","celsius":4}
tool get_temperature -> {"city":"Lisbon","celsius":19}
turn 2 prompt= 284 out= 13 finish=stop TEXT "Oslo is currently warmer than Lisbon
at 4°C."As tools funcionaram. A chamada paralela funcionou. O loop funcionou. A resposta é falsa, com os dois números corretos na transcrição. Envolver um modelo num loop não o faz raciocinar; dá a um modelo que está errado a capacidade de agir com base no seu erro — o que antecipa o Capítulo 30, e metade do Capítulo 29.
Agora apague o return assinalado e deixe o loop correr até ao limite. Mesma pergunta, mesmo modelo:
turn 1 prompt= 187 out= 21 CALL get_temperature({"city": "Oslo"})
turn 2 prompt= 238 out= 12 TEXT "The current temperature in Oslo is 4 degrees Celsius."
turn 3 prompt= 261 out= 30 TEXT "Could you please specify the exact location you're..."
turn 4 prompt= 302 out= 14 TEXT "Sure! Could you tell me which city you're interested in?"
turn 5 prompt= 327 out= 35 TEXT "I'm sorry, but I need more details to provide an..."
turn 6 prompt= 373 out= 12 TEXT "Which city would you like to know the temperature for?"
=> model calls=6 prompt tokens=1,688 output=124 wall=25,261 ms stopped by: turn capQuatro vezes os input tokens, quatro vezes o tempo de relógio, e um fim em que o agent se esqueceu do que lhe perguntaram e está a interrogar o utilizador sobre uma pergunta que este respondeu no turno um. A resposta correta estava no ecrã no turno 2, e todos os turnos depois disso pioraram a transcrição.
Portanto, um agent não é um loop. É um loop mais uma regra para sair dele, e este tem exatamente uma regra dessas. O Capítulo 23 encontra cinco, e mostra o que se parte quando cada uma falta.
As duas definições, lado a lado
Ligação para a secção: As duas definições, lado a ladoAmbas citadas em vez de parafraseadas, porque é nas paráfrases que a confusão é fabricada.
A primeira definição coloca a fronteira em quem controla o fluxo. Building effective agents, da Anthropic, nomeia a ambiguidade e decide assim:
"Na Anthropic, categorizamos todas estas variações como agentic systems, mas traçamos uma distinção arquitetural importante entre workflows e agents: workflows são sistemas em que LLMs e tools são orquestrados através de caminhos de código predefinidos. Agents, por outro lado, são sistemas em que LLMs dirigem dinamicamente os seus próprios processos e uso de tools, mantendo controlo sobre a forma como realizam tarefas."4
O teste é uma pergunta sobre o seu código-fonte: quem escolheu o passo seguinte? Um switch no seu programa: workflow. O modelo: agent. O mesmo documento diz que agents "são normalmente apenas LLMs a usar tools com base em feedback ambiental num loop" — que é exatamente a listagem acima.
A segunda definição coloca a fronteira na independência face ao utilizador. A practical guide to building agents, da OpenAI, abre a página definicional assim:
"Enquanto o software convencional permite aos utilizadores simplificar e automatizar workflows, agents conseguem executar os mesmos workflows em nome dos utilizadores com um elevado grau de independência. Agents são sistemas que realizam tarefas de forma independente em seu nome."5
Duas frases depois, na mesma página, exclui:
"Aplicações que integram LLMs mas não os usam para controlar a execução do workflow — pense em chatbots simples, LLMs de turno único ou classificadores de sentimento — não são agents."5
Leia essas citações por ordem. As frases iniciais traçam a linha na independência: isto vai embora e acaba o trabalho sem mim? A quarta traça-a no controlo da execução, que é exatamente a linha da Anthropic. Testes diferentes, mesma página, e há sistemas reais em que discordam.
Por baixo há uma colisão de vocabulário, e ela causa discussões em reuniões reais. No primeiro documento, um workflow é uma arquitetura, e é aquilo que não é um agent. No segundo, um workflow é "uma sequência de passos que tem de ser executada para cumprir o objetivo do utilizador" — o trabalho em si, que todos os agents têm. "Substituímos o workflow por um agent" é coerente na primeira definição e quase sem sentido na segunda.
Três sistemas, classificados duas vezes
Ligação para a secção: Três sistemas, classificados duas vezesTrês sistemas que existem em 2026, nas duas definições.
Um coding agent num terminal
Ligação para a secção: Um coding agent num terminalDescreve uma tarefa; ele lê ficheiros, corre a suite de testes, edita, volta a corrê-los e para quando passam ou quando desiste. Nada no seu código decide que o passo seguinte é "correr os testes" — o modelo decide, a partir do que a última tool devolveu.
Definição um: agent, porque o modelo dirige o seu próprio processo. Definição dois: agent, porque realiza a tarefa de forma independente, reconhece a conclusão e devolve o controlo. Ambos os documentos citam esta forma como o seu exemplo central.
Um pipeline noturno de triagem de tickets
Ligação para a secção: Um pipeline noturno de triagem de ticketsPara cada novo ticket de suporte, três chamadas de modelo numa ordem fixa — classificar, extrair os campos, redigir a resposta — e depois envia. Nenhum modelo escolhe alguma vez o que acontece a seguir; um loop for fá-lo. Corre às 03:00 e ninguém o observa.
Definição um: não é um agent. É prompt chaining, listado pelo nome como workflow. Definição dois: ambas as respostas. Pelas frases iniciais, realiza tarefas de forma independente em seu nome; pela quarta, não usa o modelo para controlar a execução do workflow, e fica excluído. Este sistema é a razão para ler a página inteira e não apenas a citação destacada.
Um assistente de chat com uma search tool
Ligação para a secção: Um assistente de chat com uma search toolUm turno de utilizador. O modelo decide por si próprio se deve pesquisar antes de responder, depois responde e espera por si.
Definição um: agent, porque o modelo dirige dinamicamente o seu próprio uso de tools com resultados do ambiente, que é o teste declarado. Definição dois: não é um agent, porque não há independência — um turno, depois devolve o controlo — e "chatbots simples" estão nominalmente na lista de exclusões.
Dois dos três mudam de lado. Isso não é uma falha de nenhum dos documentos. É um aviso sobre um tipo de reunião em que duas pessoas que concordam completamente sobre o que um sistema faz passam uma hora a discordar sobre como lhe chamar.
A saída são dois eixos, não um
Ligação para a secção: A saída são dois eixos, não umAs definições colidem porque cada uma comprime duas perguntas independentes numa só palavra. Separe-as e o desacordo torna-se uma tabela, que é mais útil do que um veredito.
| o seu código escolhe o passo seguinte | o modelo escolhe o passo seguinte | |
|---|---|---|
| uma pessoa está a observar cada turno | um formulário com um modelo lá dentro: classificadores, extração, completion de turno único | um chat com tools — a definição um diz agent, a definição dois diz não |
| ninguém observa até terminar | um pipeline — a abertura da definição dois diz agent, a sua quarta frase diz não | todos concordam: um agent |
Cada definição disputa uma célula diferente, e as outras duas não estão em disputa. Por isso, quando o rótulo importa — num contrato, numa revisão de risco, num postmortem — as duas frases que vale a pena escrever não são "é um agent", mas quem escolheu o passo seguinte e quem estava a observar. Ambas se respondem lendo código, nenhuma precisa da definição de ninguém, e juntas carregam todas as consequências que o rótulo estava a representar.
Nada disto é novo. Wooldridge e Jennings passaram em revista os sentidos concorrentes de "agent" em 1995;6 Franklin e Graesser fizeram a pergunta deste capítulo em 1996, reuniram as definições então em circulação e descobriram que discordavam.7 Um survey de 2023 ainda define agents a partir de primeiros princípios — "entidades artificiais que sentem o seu ambiente, tomam decisões e realizam ações"8 — porque não existia nada assente para citar, e CoALA descreve partes em vez de traçar uma fronteira.9 Trinta anos a recusar chegar a acordo dizem que a palavra faz mais do que um trabalho.
Um agent são N chamadas, não uma
Ligação para a secção: Um agent são N chamadas, não umaAgora a consequência que chega antes da filosofia, que é a fatura.
Todas as medições aqui têm a mesma forma. A chamada única custou 39 input tokens; a mesma pergunta com uma tool custou 420 ao longo de duas chamadas; o loop sem a sua regra de paragem custou 1.688 ao longo de seis. O crescimento é pior do que linear, porque o turno n transporta todos os turnos anteriores: a coluna de prompt dessa execução de seis turnos lê 187, 238, 261, 302, 327, 373. O Capítulo 16 derivou que o total é e ajustou a curva numa conversa real. Um agent transforma cada tarefa nessa conversa, quer um humano a veja ou não.
Se essas contagens medidas de tokens tivessem ido para um endpoint comercial às tarifas que o Capítulo 16 leu em 6 de setembro de 2026 — $2,00 por milhão de input tokens e $12,00 por milhão de output tokens — as quatro execuções teriam este preço:
| execução | chamadas de modelo | input tokens | output tokens | custo |
|---|---|---|---|---|
| a pergunta, sem tools | 1 | 39 | 8 | $0,000174 |
| a mesma pergunta, uma tool no catálogo | 2 | 420 | 38 | $0,001296 |
| uma pergunta que precisa da tool | 2 | 425 | 33 | $0,001246 |
| a mesma, sem a regra de paragem | 6 | 1.688 | 124 | $0,004864 |
A linha dois contra a linha um é o número a reter. Sete vezes e meia o custo, por uma resposta pior a uma pergunta que o modelo já sabia responder. Nada estava mal configurado: existia uma tool, por isso o modelo usou-a — e a conclusão do Capítulo 18, de que o que dói é o preço de um catálogo e não a sua precisão, tem aqui a sua demonstração mais barata com um catálogo de uma só tool.
É por isso que a metade útil de ambos os documentos é a metade sobre não construir isto. O da Anthropic é direto: encontre a solução mais simples possível e acrescente complexidade apenas quando necessário, o que "pode significar não construir agentic systems de todo", já que agentic systems "trocam latência e custo por melhor desempenho na tarefa" e "para muitas aplicações, otimizar chamadas únicas de LLM com retrieval e exemplos in-context é normalmente suficiente".4 O caso a favor de um agent é estreito: problemas em aberto em que não se consegue prever o número de passos e não se consegue hardcode um caminho, num ambiente em que confia, aceitando "custos mais elevados e o potencial de erros compostos".4 O ecrã da OpenAI é a imagem espelhada — julgamento complexo, conjuntos de regras impossíveis de manter, dados não estruturados — e acaba da mesma forma: "caso contrário, uma solução determinística pode ser suficiente".5
Portanto, na taxonomia deste capítulo: um número fixo de passos numa ordem fixa é um pipeline, e chamar-lhe agent não o tornará mais rápido. Se o número de passos depender do que encontrar pelo caminho, quer um loop — e compra essa flexibilidade com N chamadas, uma transcrição quadrática e um sistema que pode estar errado N vezes em vez de uma.
Para onde isto vai a seguir
Ligação para a secção: Para onde isto vai a seguirAgora tem a taxonomia, ambas as definições modernas, os dois eixos que as tornam compatíveis e um loop curto que responde, chama e para.
Esse loop tem uma forma de terminar: o modelo deixa de pedir tools. O Capítulo 23 parte-o de propósito, sete vezes, e cada falha acrescenta uma peça. Uma tarefa impossível, e nunca acaba — um limite de turnos. Uma noite a correr, e a fatura chega — um orçamento em dólares. Uma tool que falha — um erro sobre o qual o modelo pode agir. A mesma chamada duas vezes — uma chave de idempotência. Um ficheiro em que não devia ter tocado — uma aprovação humana. Um reinício a meio — persistência de sessão. Uma tool que demora três minutos em silêncio — progresso e cancelamento. O que sai daí é um harness, o ficheiro sobre o qual o resto deste curso corre.
Isso deixa a pergunta de que a diagonal disputada deste capítulo tratava realmente. Um loop que decide o seu próprio passo seguinte tem de decidir quando parar, e acabámos de ver o que acontece quando não consegue: seis turnos, quatro vezes a fatura, e um agent a interrogar o utilizador sobre uma pergunta que já tinha respondido. Parar não é uma condição. Quantas são, e qual dispara primeiro?
Fontes e método
Ligação para a secção: Fontes e métodoLLM Powered Autonomous Agents (2023), de Lilian Weng, é a decomposição mais conhecida de um language agent em planeamento, memória e uso de tools, e é a próxima leitura certa juntamente com os dois documentos de fornecedores; os seus três componentes são os Capítulos 23, 24 e 18 deste curso, por essa ordem.
Todos os números deste capítulo foram produzidos nesta máquina e nada foi estimado. O corredor, a planta, os quatro agents que a percorrem e as três políticas de ronda são o TypeScript acima, corrido em Node 22; os números do agent aleatorizado são médias de 2.000 execuções seeded cada, e os números da ronda são execuções únicas seeded de 4.000 ticks. Os traces do modelo vêm de Qwen2.5-0.5B-Instruct em float32 em CPU com greedy decoding, servido por loopback por um pequeno endpoint Python local que carrega os pesos e fala no formato OpenAI chat-completions — a costura outra vez, com os tensores do lado Python e o loop do lado TypeScript — por isso as contagens de tokens são as do tokenizer desse modelo e as latências são as dessa máquina. Os únicos números retirados de outro sítio são os dois preços da tabela de custos, que são as tarifas que o Capítulo 16 leu na página de preços da OpenAI em 6 de setembro de 2026, aplicadas aqui a contagens de tokens medidas localmente como ilustração e não como fatura observada.
Referências
Ligação para a secção: Referências-
Russell, S. e Norvig, P. Artificial Intelligence: A Modern Approach, 4.ª edição, capítulo 2, Intelligent Agents. Fonte do mundo do aspirador, da especificação PEAS, da definição de racionalidade relativamente a uma medida de desempenho, das sete propriedades dos ambientes de tarefa, dos cinco tipos de agent usados aqui, e da observação de que loops infinitos são frequentemente inevitáveis para simple reflex agents em ambientes parcialmente observáveis. O código complementar do livro é
aimacode/aima-pythonno GitHub (8.806 estrelas, último push em 30 de junho de 2026, lido em 7 de setembro de 2026) — vale a pena nomeá-lo precisamente pelo que é. É o repositório de acompanhamento de um livro, não uma implementação de referência em que outros projetos se apoiam comokarpathy/micrograd(17.412) ekarpathy/nanoGPT(62.852). É por isso que este capítulo o cita e liga em vez de o traduzir, e é por isso que o argumento do ecossistema que manteve o Capítulo 5 em Python não se aplica aqui: nada neste capítulo toca num tensor, e o loop escrito acima é o antepassado direto do loop do Capítulo 23. ↩ ↩2 ↩3 ↩4 ↩5 -
Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. e Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). O entrelaçar de traces de raciocínio e ações a que a linha goal-based da tabela de mapeamento se refere. ↩
-
Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. e Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). O resumo do próprio artigo sobre o mecanismo é a razão por que mapeia para o learning agent: reforça agents "não atualizando pesos, mas através de feedback linguístico", com agents que "refletem verbalmente sobre sinais de feedback de tarefa e depois mantêm o seu próprio texto reflexivo num buffer de memória episódica para induzir melhor tomada de decisão em tentativas subsequentes". ↩ ↩2
-
Anthropic, Building effective agents, 19 de dezembro de 2024,
anthropic.com/engineering/building-effective-agents, lido em 7 de setembro de 2026. Fonte da distinção workflow/agent citada acima, do termo abrangente "agentic systems", da descrição de agents como "normalmente apenas LLMs a usar tools com base em feedback ambiental num loop", da orientação para encontrar a solução mais simples possível e de que isso "pode significar não construir agentic systems de todo", e do caso a favor e contra agents, incluindo "custos mais elevados e o potencial de erros compostos" e a recomendação de condições de paragem "como um número máximo de iterações" para manter o controlo. ↩ ↩2 ↩3 -
OpenAI, A practical guide to building agents, páginas 4 a 7, lido em 7 de setembro de 2026. Fonte de "Agents são sistemas que realizam tarefas de forma independente em seu nome", da exclusão de "chatbots simples, LLMs de turno único ou classificadores de sentimento", da definição de workflow como "uma sequência de passos que tem de ser executada para cumprir o objetivo do utilizador", das duas características centrais de um agent, dos três componentes — modelo, tools, instruções — e dos critérios de triagem para quando construir um, terminando em "caso contrário, uma solução determinística pode ser suficiente". ↩ ↩2 ↩3
-
Wooldridge, M. e Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, volume 10, número 2 (1995). O survey que dividiu o uso da área numa noção fraca de agência — autonomia, capacidade social, reatividade, proatividade — e noções mais fortes que pediam vocabulário mental emprestado. Lido hoje, é um registo do mesmo argumento que os dois documentos deste capítulo ainda estão a ter. ↩
-
Franklin, S. e Graesser, A. Is It an Agent, or Just a Program? A Taxonomy for Autonomous Agents. Proceedings of the Third International Workshop on Agent Theories, Architectures, and Languages, Springer (1996). Citado aqui pelo que é, e não por uma citação: um survey que reuniu as definições de "agent" então em circulação, descobriu que discordavam e propôs uma taxonomia para substituir a discussão. Trinta anos depois, a discussão está em documentação mais bem desenhada e, de resto, permanece inalterada. ↩
-
Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). Citado acima pela sua definição inicial, "AI agents são entidades artificiais que sentem o seu ambiente, tomam decisões e realizam ações", que é a definição do manual redita em 2023 porque não havia uma definição moderna acordada para citar. ↩
-
Sumers, T. R., Yao, S., Narasimhan, K. e Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Organiza language agents como "componentes modulares de memória, um espaço de ação estruturado para interagir com memória interna e ambientes externos, e um processo generalizado de tomada de decisão para escolher ações", e situa-os explicitamente na história da IA simbólica e da ciência cognitiva. A taxonomia da memória regressa no Capítulo 24, onde a tabela das três stores é a sua sombra prática. ↩