Desafio 001: Construa um Loop de Agente do Zero¶
Cenário¶
A OutdoorGear quer um pequeno agente assistente de produtos que raciocine sobre um catálogo local. A equipe não quer usar Semantic Kernel, LangGraph, AutoGen ou qualquer LLM hospedado ainda. Primeiro, ela quer provar que você entende o loop central:
perceber → decidir → agir → observar → responder
Sua tarefa é finalizar um pequeno loop de agente em Python que escolhe ferramentas, executa essas ferramentas, armazena observações e produz uma resposta final fundamentada.
Objetivo¶
Implemente a lógica faltante em starter_agent_loop.py para que o assistente local de produtos conclua as duas solicitações-alvo e gere um código de validação.
Ao final, seu agente deve conseguir:
- Buscar produtos usando categoria, palavras de consulta, orçamento e filtro de estoque
- Consultar detalhes de produto por SKU
- Recomendar um pequeno bundle de camping em estoque dentro de um orçamento
- Executar um loop que chama exatamente uma ferramenta antes de responder para requisições suportadas
- Retornar um trace mostrando o que o agente fez
Arquivos Iniciais¶
Salve estes arquivos em uma pasta chamada challenge-001/:
| Arquivo | Finalidade | Download |
|---|---|---|
products.json |
Catálogo mock da OutdoorGear | Download |
starter_agent_loop.py |
Implementação inicial com TODOs | Download |
test_agent_loop.py |
Testes de aceite | Download |
validate_agent_loop.py |
Gera o código final de conclusão | Download |
Briefing do Desafio¶
Você recebe um catálogo de produtos, uma implementação inicial e testes. Não há walkthrough: decida como interpretar a solicitação, escolher uma ferramenta, executá-la, armazenar a observação e produzir a resposta final.
Restrições¶
- Use apenas a biblioteca padrão do Python em
starter_agent_loop.py. - Não chame uma API de LLM.
- Não use um framework de agentes.
- Mantenha o loop legível: o objetivo é entender o fluxo de controle.
- Preserve o formato de retorno de
run_agent():
{
"final_answer": "...",
"trace": [
{"step": 1, "type": "tool", "tool": "...", "arguments": {...}},
{"step": 2, "type": "final"}
]
}
Critérios de Aceite¶
Sua solução está completa quando:
python -m pytest test_agent_loop.pypassa- A solicitação de jaqueta chama
search_productsantes de responder - A solicitação de bundle de camping chama
recommend_bundleantes de responder - A resposta final inclui nomes de produtos, preços e uma justificativa curta
- Produtos fora de estoque não são recomendados
- O loop para com uma resposta final antes de
max_steps
Validação¶
Quando sua implementação estiver pronta, execute:
Digite o código de conclusão impresso por validate_agent_loop.py:
Dicas¶
Dica 1 — Comece pelas ferramentas
O loop fica mais fácil de raciocinar quando cada ferramenta tem contrato claro e saída determinística.
Dica 2 — Mantenha o parsing simples
Você não precisa de NLP avançado. As solicitações-alvo são propositalmente estreitas.
Dica 3 — Use observações como memória
state.observations é a memória de curto prazo do loop. Depois que uma ferramenta roda, a resposta final deve se basear na observação mais recente, não no catálogo original.
Dica 4 — Decida de forma determinística
Uma boa solução toma a mesma decisão toda vez para o mesmo estado.
Rubrica¶
| Área | Pontos | Como fica bom |
|---|---|---|
| Correção das ferramentas | 30 | Filtros, consulta por SKU e seleção de bundle estão corretos |
| Loop de agente | 30 | Fluxo claro perceber → decidir → agir → observar → responder |
| Resposta fundamentada | 20 | A resposta usa observações das ferramentas e cita produtos concretos |
| Rastreabilidade | 10 | O trace mostra chamada de ferramenta e etapa final |
| Simplicidade | 10 | Sem framework, API ou over-engineering desnecessários |
Objetivos Extras¶
- Adicionar suporte para "comparar dois SKUs"
- Adicionar uma resposta de erro quando nenhum produto corresponder
- Adicionar uma segunda chamada de ferramenta antes da resposta final para pedidos ambíguos
- Criar um parser de
max_priceque aceite$150,150 dollarseunder 150