05-04-04 — Desafio: diagrama Mermaid de agente comparador de preços
TL;DR
Desafio prático: desenhe em Mermaid um agente que pesquisa o preço de um produto em 3 sites diferentes, compara e recomenda. O objetivo é consolidar os conceitos do módulo — tool calling, parallelization, terminação — num diagrama concreto.
O cenário
Você precisa construir um agente que recebe o nome de um produto e:
- Busca o preço em 3 sites (Amazon, Mercado Livre, Magazine Luiza)
- Compara os preços encontrados
- Verifica disponibilidade e prazo de entrega
- Recomenda a melhor opção com justificativa
Diagrama da solução — versão paralela
Este é o diagrama completo do agente usando o padrão de parallelization (pesquisa em paralelo) + aggregation:
graph TD
U[👤 Usuário\n'Preço iPhone 16 256GB'] --> ORCH
ORCH["🤖 ORCHESTRATOR\nGPT-4o\n\nPlaneja buscas em paralelo"]
ORCH --> T1["🛒 Tool: scrape_amazon\nInput: 'iPhone 16 256GB'"]
ORCH --> T2["🛒 Tool: scrape_mercadolivre\nInput: 'iPhone 16 256GB'"]
ORCH --> T3["🛒 Tool: scrape_magazineluiza\nInput: 'iPhone 16 256GB'"]
T1 --> R1["📦 Resultado Amazon\n{\n price: 6799,\n availability: true,\n delivery_days: 2,\n seller_rating: 4.8\n}"]
T2 --> R2["📦 Resultado MercadoLivre\n{\n price: 6499,\n availability: true,\n delivery_days: 5,\n seller_rating: 4.2\n}"]
T3 --> R3["📦 Resultado Mag. Luiza\n{\n price: 6699,\n availability: false,\n delivery_days: null,\n seller_rating: 4.6\n}"]
R1 --> AGG["📊 AGGREGATOR\nLLM analisa:\n- Filtra indisponíveis\n- Pondera preço + prazo\n- Calcula score"]
R2 --> AGG
R3 --> AGG
AGG --> CHK{Todos os\nsites OK?}
CHK -->|"Algum falhou"| RETRY["🔄 Retry\n(max 1 vez)"]
RETRY --> T1
CHK -->|"Dados suficientes"| REC
REC["💡 RECOMMENDER\nGera recomendação:\n'Amazon: R$6.799 em 2 dias'\nJustificativa: melhor custo-benefício\nconsiderando entrega"]
REC --> OUT["📱 Output para usuário\ncom comparação formatada"]
style ORCH fill:#1e40af,color:#fff
style AGG fill:#4c1d95,color:#fff
style REC fill:#065f46,color:#fff
style CHK fill:#7c2d12,color:#fff
style OUT fill:#374151,color:#fff
Template para você completar
Use este template como ponto de partida para adaptar ao seu caso de uso:
graph TD
%% ===== ENTRADA =====
U["👤 Usuário\n'{produto}'"] --> ORCH
%% ===== ORQUESTRADOR =====
ORCH["🤖 ORCHESTRATOR\n{modelo}\n\n{responsabilidade}"]
%% ===== TOOL CALLS PARALELOS =====
ORCH --> T1["🛒 Tool: {tool_1}\nInput: '{query}'"]
ORCH --> T2["🛒 Tool: {tool_2}\nInput: '{query}'"]
ORCH --> T3["🛒 Tool: {tool_3}\nInput: '{query}'"]
%% ===== RESULTADOS =====
T1 --> R1["📦 Resultado {fonte_1}\n{campos_relevantes}"]
T2 --> R2["📦 Resultado {fonte_2}\n{campos_relevantes}"]
T3 --> R3["📦 Resultado {fonte_3}\n{campos_relevantes}"]
%% ===== AGREGAÇÃO =====
R1 --> AGG["📊 AGGREGATOR\n{lógica de agregação}"]
R2 --> AGG
R3 --> AGG
%% ===== GUARDRAIL =====
AGG --> CHK{"{critério de\ncontinuação}"}
CHK -->|"Falha"| RETRY["🔄 {ação de fallback}"]
CHK -->|"Sucesso"| REC
%% ===== OUTPUT =====
REC["{output final}"]
REC --> OUT["📱 Output para usuário"]
%% ===== ESTILOS =====
style ORCH fill:#1e40af,color:#fff
style AGG fill:#4c1d95,color:#fff
style REC fill:#065f46,color:#fff
Variações para explorar
Exercício adicional: Tente redesenhar o diagrama usando o padrão sequential (um site por vez) ao invés de paralelo. Quais são os trade-offs em latência e custo? Quando faria sentido a versão sequencial?
Implementação simplificada em Python
import asyncio
import openai
import json
client = openai.AsyncOpenAI()
# Simula tools de scraping
async def scrape_amazon(product: str) -> dict:
# Na vida real: Playwright, ScraperAPI, ou API de preços
return {"price": 6799, "availability": True, "delivery_days": 2, "site": "Amazon"}
async def scrape_mercadolivre(product: str) -> dict:
return {"price": 6499, "availability": True, "delivery_days": 5, "site": "MercadoLivre"}
async def scrape_magazineluiza(product: str) -> dict:
return {"price": 6699, "availability": False, "delivery_days": None, "site": "MagLuiza"}
async def price_comparison_agent(product: str) -> str:
# Executa buscas em paralelo (parallelization pattern)
results = await asyncio.gather(
scrape_amazon(product),
scrape_mercadolivre(product),
scrape_magazineluiza(product),
return_exceptions=True
)
# Filtra falhas e indisponíveis
valid = [r for r in results
if not isinstance(r, Exception) and r.get("availability")]
if not valid:
return "Produto não encontrado disponível em nenhum site."
# LLM faz a recomendação final
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": "Você é um comparador de preços. Analise os resultados e recomende a melhor opção considerando preço e prazo de entrega. Seja conciso."
}, {
"role": "user",
"content": f"Produto: {product}\nResultados: {json.dumps(valid, ensure_ascii=False)}"
}]
)
return response.choices[0].message.content
# Executa
result = asyncio.run(price_comparison_agent("iPhone 16 256GB"))
print(result)
Conectando com o módulo: Este desafio usa — Tool calling (scraping tools), Parallelization pattern (Anthropic), Graceful degradation (filtra falhas), e resultado via ReAct-style synthesis.
Próximos passos: Módulo 06
Você aprendeu os conceitos e a arquitetura de agentes. No Módulo 06 você vai implementar isso com frameworks reais: LangChain, LangGraph, Semantic Kernel e AutoGen.
Como isso se conecta
Fontes
- Anthropic — Building Effective Agents — parallelization pattern (seção relevante).
- Mermaid.js — Flowchart syntax — documentação oficial da sintaxe Mermaid.
- Python — asyncio docs — paralelismo assíncrono para tool calls simultâneos.