Do prompt ao carrinho: arquitetura de um agente que compara ofertas entre Amazon, Mercado Livre e Magalu
Você já viu a demo. Alguém digita "iPhone 15 Pro 256GB" no chat, o agente sai correndo, abre Amazon, Mercado Livre e Magalu, e cospe a tabela bonita com preços lado a lado.
Funciona uma vez. Na frente da câmera.
Em produção, esse agente quebra em três pontos que ninguém mostra na demo: ele compara produto que não é o mesmo, ignora frete e cupom, e chama uma API que vai morrer em abril. Esse post é sobre essas camadas que decidem se o agente vira feature de verdade ou vira piada.
TL;DR
- O que é: arquitetura de um agente multi-marketplace que compara ofertas reais entre Amazon, Mercado Livre e Magalu, considerando produto equivalente, frete e cupom.
- Stack/Modelos: orquestrador agêntico (LangGraph, Claude Agent SDK ou Prism no PHP), LLM com tool use, embeddings para matching, fila e cache.
- Custo/Acesso: APIs públicas e de parceiro. Atenção: a Amazon PA-API será descontinuada em 30/04/2026. Quem está construindo hoje precisa saber.
- Foco: decisões arquiteturais. Não é tutorial de código. É o que separa demo de produto.
Por que comparar preço é um problema sujo
Comparar preço parece um if-else. É marketing.
Na prática, são quatro problemas técnicos empilhados:
- Identidade de produto. "iPhone 15 Pro 256GB Titânio Natural" no Mercado Livre e "Apple iPhone 15 Pro 256 GB Titânio Natural" na Amazon são o mesmo SKU? Provavelmente. E o "iPhone 15 Pro 256GB" sem cor, importado, com 6 meses de garantia? Não.
- Custo total. O preço da página é só a primeira fatia. Frete pode chegar a 40% do valor da compra. Cupom muda o ranking. Cashback de carteira distorce ainda mais.
- Acesso à oferta. Cada marketplace tem uma API com regra própria, rate limit próprio, política de afiliado própria. E mudam.
- Tempo de resposta do agente. O usuário não espera 30 segundos. Você tem entre 3 e 8.
Resolver os quatro ao mesmo tempo é o que torna o projeto interessante. Errar um deles é o que torna a feature inútil.
Visão geral da arquitetura
O pipeline tem cinco camadas, todas com responsabilidade única:
[Usuário]
│ prompt em linguagem natural
▼
[Orquestrador agêntico]
│ intenção + filtros (CEP, preço-teto, prazo)
▼
[Camada de coleta] ──► Amazon │ Mercado Livre │ Magalu
│ ofertas brutas, uma por marketplace
▼
[Normalização]
│ produto canônico (marca, modelo, variante, GTIN)
▼
[Matching de equivalentes]
│ grupos de oferta para o mesmo SKU
▼
[Cálculo de custo total]
│ ranking por custo final
▼
[Resposta + link de carrinho]
Por que separar assim? Porque cada camada falha de um jeito diferente e precisa de monitoramento próprio. Coleta falha por rate limit. Matching falha por embedding ruim. Cálculo de frete falha porque o CEP não chegou. Misturar tudo em um prompt gigante é o jeito mais rápido de não saber por que o agente errou.
Camada 1 — Coleta: três marketplaces, três interfaces
Aqui começa a parte que ninguém mostra na demo.
Amazon
A entrada oficial é a Product Advertising API 5.0. Você começa com 1 TPS e 8.640 requisições por dia, e o limite cresce conforme sua receita de afiliado.
Detalhe que muda tudo: a Amazon vai descontinuar a PA-API em 30 de abril de 2026 e migrar para a Creators API. Se seu agente nasceu este ano, ele já nasce em prazo de validade. Planeje a abstração desde o dia zero.
Mercado Livre
A API pública é generosa. O endpoint /sites/MLB/search?q=... retorna lista de itens ativos sem OAuth. Veja a documentação oficial de itens e buscas.
Cuidado com o calendário: a partir de 18 de março de 2026, requisições que só atualizam preço passam a ser rejeitadas com 400. Não afeta busca, mas se seu agente também publica ou atualiza preço, o contrato mudou.
Magalu
A API da Magalu é mais voltada a seller: catálogo, pedido, etiqueta. Para comparação pública você costuma ir por API de afiliado ou por scraping responsável da página de produto, não pelo endpoint de seller. Os endpoints base são id.magalu.com/oauth/token e api.magalu.com/, e há webhooks para eventos de SKU.
O padrão por trás
Três interfaces totalmente diferentes. Uma vai morrer. Outra muda contrato. A terceira é orientada a vendedor.
A consequência arquitetural é direta: uma camada de adapters, um por marketplace, retornando um DTO comum. Tudo o que o agente vê é o DTO. Quando a Amazon migrar para a Creators API, você troca um adapter, não o agente.
{
"marketplace": "mercadolivre",
"external_id": "MLB123456789",
"title": "Apple iPhone 15 Pro 256GB Titânio Natural",
"brand": "Apple",
"gtin": "0194253433637",
"raw_attributes": { "...": "..." },
"price": 8499.00,
"currency": "BRL",
"shipping_options": [{ "type": "standard", "price": 0, "eta_days": 5 }],
"coupon_hint": "PRIMEIRACOMPRA10",
"url": "https://..."
}
Sem DTO comum, qualquer mudança de fornecedor vira refactor em cascata.
Camada 2 — Normalização e identidade do produto
Você tem três ofertas com títulos diferentes. Antes de comparar, precisa decidir se elas falam do mesmo produto.
Existe um identificador global pra isso: o GTIN, também chamado de EAN no Brasil. 13 dígitos, único por SKU. Quando o marketplace expõe o GTIN, sua vida fica simples: dois GTINs iguais = mesmo produto. Fim.
O problema é que nem sempre vem. E quando vem, vem sujo.
Pipeline de normalização que costuma resolver:
- Limpeza textual. Lowercase, strip de pontuação, normalização de unidades (
256gb,256 GBe256gigasviram a mesma coisa). - Extração de marca. Dicionário curado de fabricantes (Apple, Samsung, Xiaomi, LG, Sony) aplicado por regex tolerante.
- Extração de modelo. Regex específica por categoria. Em smartphones, algo como
iPhone\s*\d+(\s*Pro)?(\s*Max)?. - Extração de variante. Cor, capacidade, voltagem, geração.
- Validação de GTIN. Padding com zero à esquerda para 13 dígitos, validação do dígito verificador. E nunca confundir GTIN com MPN: esse é um dos erros mais comuns no Google Shopping.
Saída: um produto canônico estruturado, não um título livre. É esse objeto que vai pro próximo passo.
Camada 3 — Matching: o produto é mesmo o mesmo?
Aqui é onde a maior parte dos comparadores caseiros morre.
Três níveis de matching, em ordem de preferência:
Nível 1: regra dura (GTIN)
Se as duas ofertas têm GTIN e os GTINs batem, são o mesmo produto. Confiança máxima. Custo zero. É o caminho rápido. E o mais raro.
Nível 2: similaridade semântica
Quando GTIN não tem, você cai em embeddings. Geração de vetor para o produto canônico (marca + modelo + variante + atributos-chave), busca por similaridade de cosseno contra os candidatos.
Threshold típico: cosseno acima de 0.92 = forte candidato a match. Abaixo de 0.85 = não é o mesmo produto. A faixa entre os dois é zona cinza. E zona cinza não vira ranking sozinha.
Detalhe importante: pesquisas recentes em deduplicação multimodal mostram ganho real ao combinar embedding de texto com embedding de imagem do produto, comprimidos em vetores de 128 dimensões. Para celular, livro, eletrodoméstico, onde a foto é padronizada, o custo extra paga.
Nível 3: LLM-as-judge
Para a zona cinza, você não chuta. Você manda os dois títulos para um LLM com prompt específico:
Você é um comparador de produtos. Dadas duas ofertas:
A: {titulo_A} | atributos: {attrs_A}
B: {titulo_B} | atributos: {attrs_B}
Responda APENAS um JSON: {"same_product": bool, "reason": str}
Considere marca, modelo, capacidade, cor, geração e versão regional.
Por que isso funciona quando embedding sozinho não funciona? Porque o LLM aplica conhecimento semântico que o vetor não tem. Ele sabe que "iPhone 15 Pro" e "iPhone 15" são produtos diferentes, mesmo com cosseno alto.
A abordagem multi-agente Q2K, publicada em 2025, atinge 95,62% de acurácia em matching de SKU, justamente decompondo a comparação em perguntas verificáveis. Para um agente em produção, você não precisa do framework completo. Precisa da ideia: decompor a decisão de equivalência em perguntas explícitas.
Camada 4 — Custo total: frete e cupom não são detalhe
Preço de vitrine não decide compra. Custo total decide.
A função de ranking precisa olhar pelo menos três fatores:
custo_final = preco_produto
+ frete_para_o_cep
- cupom_aplicavel
- cashback_estimado
Frete é o mais difícil. Cada marketplace expõe de um jeito:
- Mercado Livre: endpoint de calculadora de frete por item e CEP.
- Amazon: frete depende de Prime, FBA, do seller terceiro. Difícil prever sem login.
- Magalu: simulador no front, raramente em API pública aberta.
A consequência arquitetural: o frete é um sub-agente, com cache por CEP + SKU + dia, com fallback. Se a calculadora não responder em N milissegundos, você usa um valor estimado por categoria e marca a oferta como "frete aproximado". Nunca esconda do usuário.
Cupom é pior. Cupom é dado sujo, fora da API, divulgado em comunidade. Tratamento honesto:
- Detectar campo
coupon_hintquando o marketplace expõe. - Aplicar regra conhecida (ex: "primeira compra App Magalu = 10%").
- Marcar a oferta como "cupom condicionado" no ranking.
- Nunca descontar cupom incerto sem mostrar a condição.
Esconder a condição do cupom é o jeito rápido de o usuário chegar no checkout, não conseguir aplicar, e nunca mais voltar.
Camada 5 — Orquestração: por que isso é trabalho de agente
Por que um agente, e não um job em fila?
Porque a decisão é dinâmica. O usuário pergunta: "acha um iPhone 15 Pro com frete grátis pra 01310-100, mas só se chegar em 3 dias". Esse prompt vira:
- Intent extraction (
product=iPhone 15 Pro, cep=01310-100, max_eta=3, free_shipping=true). - Coleta paralela em três marketplaces.
- Normalização + matching.
- Cálculo de custo total com filtros.
- Resposta com top-N e link de carrinho.
LangGraph é forte aqui porque entrega paralelismo, checkpointing e gates de aprovação humana de fábrica. No Laravel, você consegue arquitetura equivalente com Prism + filas + uma máquina de estados simples. Não precisa importar Python pra parecer sério.
O ponto não é o framework. O ponto é a separação:
- O LLM decide o que buscar e como filtrar.
- Os adapters fazem a busca.
- O matching e o ranking são determinísticos. Saem do LLM.
Esse é o erro mais caro que vejo em demos: deixar o LLM "decidir o ranking". Ranking de preço com frete é matemática. Não terceirize raciocínio que sua linguagem já sabe fazer.
Limitações e pontos de atenção
Lista do que vai morder você:
- Bloqueio anti-bot. Scraping responsável de página pública existe, mas marketplace grande tem proteção pesada. Em escala, você vai ser bloqueado. Use API quando há, e respeite robots.txt e rate.
- TOS de afiliado. Comparador que não declara afiliado vira processo. Cada marketplace tem regra própria sobre exibição de preço, link e desambiguação.
- Cache estagnado. Preço muda em segundos no Mercado Livre. Cache de 30 minutos pode mostrar oferta que já não existe. Defina TTL por categoria.
- Match falso positivo. Vender "smartphone equivalente" achando que era o mesmo é o tipo de erro que destrói confiança. Quando o agente não tem certeza, diga que não tem certeza no output.
- Custos do LLM. LLM-as-judge para cada par candidato explode rápido. Faça o filtro com embedding antes, e só mande pro LLM o que ficou na zona cinza.
- Privacidade do CEP. CEP é dado pessoal sob a LGPD. Cache com TTL curto e nunca jogue em log.
Sem essas seis decisões, você tem demo. Não tem produto.
CTA
Construir agente de comparação de preço que aguenta produção é exatamente o tipo de feature que separa o dev que "usa IA" do dev que constrói produto com IA.
No Clã Beer & Code a gente discute esse tipo de arquitetura toda semana: tool use real, matching, ranking, agente em produção. Se você quer parar de fazer demo bonita e começar a entregar feature de IA que sobrevive a um boleto, o Clã é o ambiente.
FAQ rápido
Posso usar só o Mercado Livre, que tem API pública, e ignorar Amazon e Magalu? Pode, e é uma escolha legítima de MVP. Mas o valor do agente cresce com o número de fontes. Comece com um, abstraia o adapter, e vá adicionando.
Preciso mesmo de embeddings? Não dá pra comparar título com Levenshtein? Dá, e funciona pra produto simples. Mas Levenshtein não distingue "iPhone 15 Pro" de "iPhone 15 Pro Max" pelo que importa. A palavra "Max" tem peso semântico, não tipográfico. Em produção, embedding paga o custo.
O agente pode adicionar ao carrinho sozinho? Tecnicamente sim, via deep link com parâmetros. Funciona melhor como "abrir carrinho com produto pré-selecionado" do que "comprar autônomo". Compra autônoma sem confirmação humana é um problema de UX e de segurança que você não quer resolver no v1.
E quando a Amazon desligar a PA-API em abril de 2026? Você troca o adapter de Amazon pela Creators API e o resto do agente nem fica sabendo. Esse é o ROI real da camada de adapter: sobreviver à mudança de fornecedor sem reescrever produto.
Conclusão
Agente de comparação de preço não é prompt. É arquitetura.
Coleta com adapter por marketplace. Normalização com produto canônico. Matching em três níveis, com GTIN antes de embedding e LLM-as-judge só na zona cinza. Custo total que olha frete, cupom e tempo de entrega. Orquestração que mantém a decisão determinística onde precisa ser determinística.
O próximo passo dessa categoria de agente é ir além de preço: entrar em estoque, em variação regional, em recomendação personalizada por histórico. Mas só chega lá quem montou a fundação direito.
Já que você ficou até aqui, vale ver também como implementar Agent Builder e Chatkit da OpenAI com Laravel e como construir recomendação semântica com embeddings em Laravel. Mesma família de problema, ângulos complementares.
{AI Engineer} — apaixonado por Laravel, arquitetura de software e construir produtos com impacto. Compartilho aqui tutoriais, descobertas e reflexões sobre o dia a dia de engenharia.
Você também pode gostar
LLM-as-a-Judge: avaliação automatizada do seu agente de ofertas sem abrir planilha
Como montar um juiz LLM que pontua cada resposta do agente contra uma rubrica objetiva: preço correto, link válido, sentimento de review coerente. Você sai do achismo e transforma iteração em ciclo mensurável.
RAG ou Web Search? Como decidir entre indexar, buscar ao vivo e combinar os dois
Quando usar RAG sobre catálogo interno, quando disparar busca na web ao vivo e quando combinar os dois? Matriz de decisão prática aplicada ao caso real de um agente de ofertas, com Claude API, Pinecone e LangChain. Trade-offs de custo, latência e controle sem hype.
Chatbot não é agente: o teste dos 3 turnos que separa brinquedo de produto
Três perguntas simples sobre um produto real — preço hoje, reviews recentes, disponibilidade no CEP — quebram qualquer chatbot cru. O que separa brinquedo de produto não é o modelo. É o harness: a camada que transforma um LLM em agente confiável, com tool use, estado e validação contra o mundo real.
Seu LLM não sabe o preço de nada: o problema do conhecimento congelado em apps de compra
Seu modelo foi treinado há meses, mas o mercado muda em horas. O LLM responde com a mesma confiança de sempre — só que com preço errado, produto descontinuado e estoque do ano passado. Esse é o conhecimento congelado, e ele mata qualquer app sério de recomendação. Veja por que perguntar "qual o melhor notebook até 5 mil?" direto pro LLM é receita pra demo bonita e cliente bravo — e como a arquitetura certa (tool use + RAG) resolve em Laravel.