Este e o exercicio final da Trilha 4. Tudo que voce aprendeu nos modulos anteriores (agentes, skills, MCP, memoria, orquestracao) converge aqui. O objetivo: construir um sistema multiagente funcional, integrado e demonstravel. Ao completar este exercicio, voce tera um artefato concreto para incluir no seu portfolio e uma base solida para os agentes do seu SaaS.
Revisao: Agentes + Skills + MCP + Memoria
Recap dos conceitos, diagrama de arquitetura, como as pecas se conectam
Antes de construir, vamos rever como todos os componentes se encaixam num sistema coerente. Cada peca que voce aprendeu nos modulos 4.1 a 4.6 tem um papel especifico na arquitetura final. O diagrama abaixo mostra o fluxo completo de uma mensagem do usuario passando por todas as camadas.
Arquitetura Completa do Sistema
βββββββββββββββββββββββββββ
β Usuario (Telegram, β
β Web, API) β
βββββββββββββ¬ββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Router / Dispatcher β β Classifica intencao
β (LLM leve ou regras) β e roteia pro agente certo
βββββββββββββ¬ββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββ
βΌ βΌ βΌ
ββββββββββββββ ββββββββββββββ ββββββββββββββ
β Agent A β β Agent B β β Agent C β
β (Research) β β (Writer) β β (Code) β
β β β β β β
β Tools: β β Tools: β β Tools: β
β - search β β - write β β - exec β
β - scrape β β - format β β - test β
ββββββββ¬ββββββ ββββββββ¬ββββββ ββββββββ¬ββββββ
β β β
ββββββββββββββββΌβββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββ
βΌ βΌ βΌ
ββββββββββββββ ββββββββββββββ ββββββββββββββ
β MCP Server β β Memory β β Skills β
β (GitHub, β β (SQLite, β β (JSON β
β FS, DB) β β Vector) β β Schema) β
ββββββββββββββ ββββββββββββββ ββββββββββββββ
Agentes (4.1 - 4.2)
LLM + system prompt + loop ReAct. Cada agente tem um papel, um set de tools e um escopo de atuacao. O orquestrador coordena multiplos agentes.
Skills e Tools (4.3 - 4.4)
Funcoes com JSON Schema que o LLM pode chamar. Skills sao pacotes de tools + logica. Function calling e o mecanismo de execucao.
MCP (4.5)
Protocolo padrao para conectar agentes a dados e ferramentas externas. Host/Client/Server. Resources, tools e prompts expostos de forma uniforme.
Memoria (4.6)
Short/long-term, episodica, semantica. SQLite ou vector store. Compactacao de conversas longas. Isolamento por tenant. Handoff estruturado.
π‘ Dica
Se algum conceito nao esta claro, volte ao modulo correspondente antes de prosseguir. Este exercicio integra tudo. Tentar implementar sem entender os fundamentos vai gerar frustacao. Dedicar 10 minutos revisando agora economiza 1 hora debugando depois.
Definir Agentes do seu SaaS
Escolha 2-3 agentes, defina roles, tools, memoria e protocolo de comunicacao
O primeiro passo e decidir quais agentes seu SaaS precisa. Nao tente fazer tudo de uma vez. Escolha 2-3 agentes que cobrem as funcoes mais criticas do seu produto. Cada agente precisa de um papel claro, um set de tools definido, estrategia de memoria e um protocolo de comunicacao com os outros agentes.
Template de Definicao de Agente
Preencha este template para cada agente do seu sistema. Seja especifico: quanto mais claro o papel, melhor o agente funciona.
// Definicao de um agente
interface AgentDefinition {
id: string // Ex: 'research-agent'
name: string // Ex: 'Agente de Pesquisa'
role: string // 1 frase descrevendo o que ele faz
model: string // Ex: 'claude-sonnet-4-20250514', 'gpt-4o', 'qwen2.5:14b'
systemPrompt: string // Prompt que define personalidade e restricoes
tools: ToolDefinition[] // Quais tools esse agente pode usar
mcpServers: string[] // Quais MCP servers tem acesso
memory: {
shortTerm: boolean // Mantem historico da conversa atual?
longTerm: boolean // Persiste preferencias entre sessoes?
knowledge: boolean // Acessa knowledge base?
}
communication: {
canReceiveFrom: string[] // Quais agentes podem delegar pra ele
canDelegateTo: string[] // Pra quais agentes ele pode delegar
handoffFormat: 'structured' | 'summary' | 'full'
}
constraints: {
maxIterations: number // Limite do loop ReAct
timeout: number // Timeout em ms
requiresApproval: boolean // Precisa de confirmacao humana?
}
}
Exemplo: 3 Agentes para SaaS de Content
Pesquisa informacoes na web, coleta dados, analisa concorrentes. Usa tools de web search e scraping.
Gera conteudo baseado nos dados da pesquisa. Escreve artigos, posts, emails. Acessa memoria de preferencias de tom e estilo.
Revisa output do Writer. Checa fatos, consistencia, tom. Aprova ou devolve com feedback especifico.
Fazer
- ●Definir cada agente com uma responsabilidade unica e clara
- ●Escolher modelos diferentes por custo e capacidade de cada role
- ●Documentar o fluxo de comunicacao entre agentes antes de codar
Evitar
- ●Criar mais de 3 agentes no primeiro prototipo
- ●Agentes com responsabilidades sobrepostas (ambiguidade no routing)
- ●Usar o mesmo modelo caro para todos os agentes
Implementar Router/Dispatcher
Receber input, classificar intencao, despachar para o agente correto
O Router e o cerebro do sistema: recebe a mensagem do usuario, decide qual agente deve processar e despacha com o contexto correto. Pode ser tao simples quanto keywords (se contem "pesquisa" vai pro Research Agent) ou tao sofisticado quanto um LLM classifier. A abordagem certa depende da variedade de inputs que seu SaaS recebe.
Abordagem 1: Router por Regras (Simples)
Rapido, previsivel, sem custo de tokens. Ideal para comeco e quando as categorias sao bem definidas.
function routeMessage(message: string): string {
const lower = message.toLowerCase()
// Comandos explicitos (maior prioridade)
if (lower.startsWith('/research')) return 'research-agent'
if (lower.startsWith('/write')) return 'writer-agent'
if (lower.startsWith('/review')) return 'review-agent'
// Keywords
const researchKeywords = ['pesquise', 'busque', 'encontre', 'dados sobre']
const writeKeywords = ['escreva', 'crie', 'gere', 'redija', 'artigo']
const reviewKeywords = ['revise', 'avalie', 'corrija', 'feedback']
if (researchKeywords.some(k => lower.includes(k))) return 'research-agent'
if (writeKeywords.some(k => lower.includes(k))) return 'writer-agent'
if (reviewKeywords.some(k => lower.includes(k))) return 'review-agent'
// Fallback: agente padrao
return 'writer-agent'
}
Abordagem 2: Router com LLM Classifier
Mais flexivel, entende nuances, nao depende de keywords exatas. Custa tokens mas classifica melhor. Use um modelo leve e rapido.
async function routeWithLLM(message: string): Promise<string> {
const classification = await llm.chat({
model: 'qwen2.5:14b', // Modelo local, rapido, gratis
messages: [{
role: 'system',
content: `Classifique a mensagem do usuario em UMA das categorias:
- research: usuario quer encontrar informacoes, dados, analises
- write: usuario quer criar conteudo, texto, documentacao
- review: usuario quer avaliar, corrigir ou melhorar algo existente
Responda APENAS com o nome da categoria, nada mais.`
}, {
role: 'user',
content: message
}],
temperature: 0 // Deterministico
})
const agentMap: Record<string, string> = {
'research': 'research-agent',
'write': 'writer-agent',
'review': 'review-agent'
}
const category = classification.trim().toLowerCase()
return agentMap[category] || 'writer-agent' // Fallback
}
Abordagem 3: Hibrida (Recomendada)
Comandos explicitos primeiro (sem custo), LLM classifier para mensagens ambiguas. O melhor dos dois mundos.
async function routeHybrid(message: string): Promise<string> {
// 1. Comandos explicitos (zero custo, alta confianca)
if (message.startsWith('/')) {
const command = message.split(' ')[0].toLowerCase()
const commandMap: Record<string, string> = {
'/research': 'research-agent',
'/write': 'writer-agent',
'/review': 'review-agent'
}
if (commandMap[command]) return commandMap[command]
}
// 2. Keywords de alta confianca
const rulesResult = routeByKeywords(message)
if (rulesResult.confidence > 0.8) return rulesResult.agent
// 3. LLM classifier para casos ambiguos
return routeWithLLM(message)
}
π‘ Dica
Logue cada decisao de routing: qual mensagem, qual agente foi escolhido, qual metodo decidiu (regra, keyword ou LLM). Isso permite analisar depois onde o router erra e melhorar. Um CSV simples com timestamp, mensagem, agente_escolhido, metodo ja e suficiente.
Fazer
- ●Sempre ter um fallback agent para mensagens nao classificaveis
- ●Testar o router com 20+ mensagens variadas antes de integrar
- ●Usar temperature 0 no LLM classifier para respostas deterministicas
Evitar
- ●Usar Claude Opus para classificacao (caro e lento para isso)
- ●Router que retorna erro em vez de fallback
- ●Classificacao com multiplas categorias possiveis (sem desempate)
Conectar Skills e MCP Servers
Wirar skills dos modulos anteriores, conectar MCP, testar tool calling end-to-end
Com agentes definidos e router funcionando, agora voce precisa conectar as ferramentas reais. As skills que voce criou no modulo 4.4 e o MCP Server do modulo 4.5 precisam ser registrados nos agentes corretos. O objetivo: quando o LLM decide chamar uma tool, a execucao acontece de verdade e o resultado volta pro agente.
Registrar Tools nos Agentes
Cada agente recebe apenas as tools que faz sentido para seu papel. Nao registre todas as tools em todos os agentes.
// Registro de tools por agente
const agents = {
'research-agent': {
model: 'gpt-4o-mini',
systemPrompt: researchPrompt,
tools: [
webSearchTool, // Busca na web
scrapeUrlTool, // Extrai conteudo de URL
analyzeDataTool // Analisa dados coletados
]
},
'writer-agent': {
model: 'claude-sonnet-4-20250514',
systemPrompt: writerPrompt,
tools: [
writeFileTool, // Escreve arquivo no filesystem
formatMarkdownTool, // Formata em markdown
readFileTool // Le arquivo existente (via MCP)
]
},
'review-agent': {
model: 'gpt-4o',
systemPrompt: reviewPrompt,
tools: [
factCheckTool, // Verifica fatos online
scoreQualityTool, // Da nota de qualidade
suggestEditsTool // Sugere edicoes especificas
]
}
}
// Executar agente com suas tools
async function runAgent(agentId: string, input: string) {
const agent = agents[agentId]
const response = await llm.chat({
model: agent.model,
messages: [
{ role: 'system', content: agent.systemPrompt },
{ role: 'user', content: input }
],
tools: agent.tools.map(t => t.schema) // JSON Schemas
})
// Se o LLM pediu tool call, executar
if (response.tool_calls) {
for (const call of response.tool_calls) {
const tool = agent.tools.find(t => t.name === call.function.name)
const result = await tool.execute(call.function.arguments)
// Retornar resultado ao LLM para continuar
}
}
}
Conectar MCP Servers
Os MCP Servers rodam como processos separados. Seu agente se conecta via Client e usa as tools/resources expostas pelo Server.
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { StdioClientTransport } from
'@modelcontextprotocol/sdk/client/stdio.js'
// Conectar ao MCP Server de filesystem
const transport = new StdioClientTransport({
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-filesystem',
'/home/user/projetos']
})
const mcpClient = new Client({ name: 'my-saas', version: '1.0' })
await mcpClient.connect(transport)
// Listar tools disponiveis
const { tools } = await mcpClient.listTools()
console.log('MCP tools:', tools.map(t => t.name))
// ['read_file', 'write_file', 'list_directory', ...]
// Usar uma tool do MCP
const result = await mcpClient.callTool({
name: 'read_file',
arguments: { path: '/home/user/projetos/meu-saas/README.md' }
})
// Combinar tools locais + MCP tools no agente
const allTools = [...localTools, ...mcpTools]
Teste Isolado de Tool Calling
Antes de integrar tudo, teste cada tool individualmente. Crie um script de teste simples:
// test-tools.ts - Teste individual de cada tool
async function testTools() {
console.log('=== Testando web_search ===')
const searchResult = await webSearchTool.execute({
query: 'MCP Model Context Protocol'
})
console.log('Resultado:', searchResult.slice(0, 200))
assert(searchResult.length > 0, 'web_search deve retornar resultados')
console.log('=== Testando write_file (MCP) ===')
const writeResult = await mcpClient.callTool({
name: 'write_file',
arguments: {
path: '/tmp/test-output.md',
content: '# Teste\nConteudo de teste.'
}
})
assert(writeResult.content, 'write_file deve confirmar escrita')
console.log('=== Testando score_quality ===')
const scoreResult = await scoreQualityTool.execute({
text: 'Este e um artigo de teste sobre inteligencia artificial.'
})
assert(scoreResult.score >= 0 && scoreResult.score <= 10)
console.log('Todos os testes passaram!')
}
testTools().catch(console.error)
π‘ Dica
Se uma tool falha no teste isolado, nao integre no agente. Debugar uma tool dentro de um loop ReAct multiagente e 10x mais dificil do que debugar isolada. Cada tool deve ter um teste unitario que rode em menos de 5 segundos.
Fazer
- ●Testar cada tool isolada antes de registrar no agente
- ●Registrar apenas tools relevantes em cada agente (principio do minimo privilegio)
- ●Tratar erros de tool execution gracefully (nao crashar o agente)
Evitar
- ●Registrar 10+ tools num unico agente (LLM confunde)
- ●Tools que modificam dados sem confirmacao em producao
- ●Pular teste do MCP Server (problemas de conexao sao comuns)
Testar Fluxo Completo
End-to-end: mensagem entra, router classifica, agente executa, memoria atualiza, resposta sai
Agora que cada peca funciona isolada, e hora de testar o fluxo completo end-to-end. Uma mensagem do usuario entra, passa pelo router, chega no agente correto, o agente usa tools, a memoria e atualizada, e a resposta volta. Este e o momento da verdade: tudo precisa funcionar junto, na ordem certa, sem perder dados no caminho.
O Fluxo Completo
Usuario envia mensagem
Router classifica e despacha
Agente processa com tools
Atualiza memoria
Se multi-step, passa pro proximo agente
Resposta final ao usuario
async function processMessage(userId: string, message: string) {
const startTime = Date.now()
const memory = new MemoryManager(db, userId)
// 1. Carregar contexto do usuario
const context = await memory.loadForPrompt()
// 2. Classificar e rotear
const agentId = await routeHybrid(message)
console.log(`[ROUTE] "${message}" -> ${agentId}`)
// 3. Executar agente com tools + contexto
const agent = agents[agentId]
const response = await runAgentLoop(agent, message, context)
console.log(`[EXECUTE] ${agentId} completed in ${Date.now()-startTime}ms`)
// 4. Atualizar memoria
await memory.saveMessages([
{ role: 'user', content: message },
{ role: 'assistant', content: response.text }
])
// 5. Extrair fatos para long-term memory
const facts = await memory.extractFacts([
{ role: 'user', content: message },
{ role: 'assistant', content: response.text }
])
if (facts.length > 0) {
for (const fact of facts) {
await memory.addKnowledge(fact.content, fact.type)
}
}
// 6. Compactar se necessario
await memory.compactIfNeeded()
// 7. Retornar resposta
console.log(`[DONE] Total: ${Date.now()-startTime}ms, ` +
`tokens: ${response.tokensUsed}`)
return response.text
}
Cenarios de Teste
Teste estes cenarios sistematicamente. Cada um valida uma parte diferente do sistema.
Cenario 1: Routing correto
Envie 10 mensagens diferentes e verifique que cada uma foi pro agente correto. Inclua casos ambiguos.
"Pesquise tendencias de SaaS em 2026" -> research-agent? "Me ajude a escrever um post" -> writer-agent?
Cenario 2: Tool execution
Envie mensagem que force o agente a usar uma tool. Verifique que a tool foi chamada e o resultado integrado na resposta.
"Pesquise e salve os resultados em /tmp/pesquisa.md" -> web_search + write_file
Cenario 3: Memoria persiste
Diga sua preferencia na sessao 1, feche, abra sessao 2 e verifique que o agente lembra.
Sessao 1: "Prefiro respostas curtas" | Sessao 2: "Me explique MCP" -> resposta deve ser curta
Cenario 4: Handoff entre agentes
Envie tarefa que requer 2 agentes em sequencia. Verifique que o contexto foi passado corretamente.
"Pesquise sobre MCP e escreva um artigo" -> research-agent passa resultados pro writer-agent
Cenario 5: Isolamento multi-tenant
Envie mensagens como 2 usuarios diferentes. Verifique que memorias nao vazam entre eles.
User A: "Sou dev Python" | User B: "Quais sao minhas preferencias?" -> nao deve mencionar Python
β οΈ Debugging Multiagentes
Quando algo falha num sistema multiagente, o bug pode estar em qualquer camada: router, agente, tool, memoria ou handoff. Logue tudo: cada decisao do router, cada tool call, cada handoff, cada escrita de memoria. Sem logs, voce vai passar horas tentando reproduzir problemas intermitentes.
Fazer
- ●Testar cada cenario individualmente antes de combinΓ‘-los
- ●Logar tempo de execucao de cada etapa (router, agent, tools)
- ●Incluir cenario de erro (tool falha, agente timeout)
- ●Medir custo total por request (tokens de todas as chamadas)
Evitar
- ●Testar so o "happy path" (cenarios de erro sao onde bugs vivem)
- ●Ignorar latencia acumulada (5 chamadas de LLM = 10-30 segundos)
- ●Declarar "funciona" apos 1 teste (teste com pelo menos 10 inputs variados)
- ●Esquecer de testar isolamento entre usuarios
Exercicio: Demo de Agentes Integrados
Full working demo: 2+ agentes, 3+ skills, MCP conectado, memoria persistindo
Este e o entregavel final da Trilha 4. Construa um sistema multiagente funcional e grave um walkthrough demonstrando que tudo funciona. Nao precisa ser perfeito. Precisa funcionar end-to-end: usuario envia mensagem, sistema processa com agentes, tools e memoria, e retorna uma resposta util.
O walkthrough e importante porque te forca a explicar o que construiu. Se voce nao consegue explicar como funciona, provavelmente nao entendeu o suficiente. A gravacao pode ser um Loom de 5 minutos ou ate um video de terminal com asciinema.
Requisitos Minimos da Demo
2+ Agentes com roles distintos
Cada agente com system prompt especifico, model definido e set de tools proprio. Demonstre que cada um faz algo diferente e complementar.
3+ Skills funcionais
Pelo menos 3 tools com JSON Schema registradas e funcionando via function calling. Mostre o LLM decidindo chamar a tool e o resultado sendo usado.
MCP Server conectado
Pelo menos 1 MCP Server rodando e sendo usado por um agente. Mostre o agente lendo ou escrevendo via MCP (filesystem, GitHub ou outro).
Memoria persistindo entre sessoes
Demonstre: diga uma preferencia na sessao 1, feche, abra sessao 2, e o agente lembra. Pode ser SQLite, markdown ou qualquer storage.
Router funcional
Mostre mensagens diferentes sendo roteadas para agentes diferentes. Demonstre que o router classifica corretamente pelo menos 3 tipos de input.
Walkthrough gravado
Video de 3-5 minutos mostrando o sistema em acao. Explique a arquitetura brevemente e demonstre cada feature. Loom, asciinema ou screen recording.
Estrutura do Projeto Final
meu-saas-agentes/
src/
agents/
research.ts // Agente de pesquisa + tools
writer.ts // Agente de escrita + tools
review.ts // Agente de revisao + tools (opcional)
skills/
web-search.ts // Tool: busca web
file-ops.ts // Tool: operacoes de arquivo
data-analysis.ts // Tool: analise de dados
memory/
manager.ts // MemoryManager unificado
conversation.ts // Historico de conversas
preferences.ts // Preferencias do usuario
knowledge.ts // Knowledge base
router.ts // Classificacao e dispatch
orchestrator.ts // Coordenacao entre agentes
main.ts // Entry point
mcp-config.json // Config dos MCP Servers
schema.sql // DDL das tabelas
test-scenarios.ts // Testes end-to-end
.env // API keys
README.md // Como rodar o projeto
Checklist Final de Validacao
π‘ Dica
Use Vibe Coding para acelerar: descreva cada modulo com um prompt detalhado, gere o codigo, revise e itere. O Claude Code ou Copilot podem gerar 80% do scaffold em minutos. Seu trabalho e validar, conectar as pecas e garantir que funciona end-to-end. Este exercicio e sobre entender a arquitetura, nao sobre digitar mais rapido.
π Bonus (Para ir Alem)
Dashboard de monitoramento: Pagina web mostrando status dos agentes, ultimas requests, custo por agente e latencia media.
Processamento paralelo: Dois agentes executando ao mesmo tempo (Research busca enquanto Writer prepara template).
Human-in-the-loop: Agente para e pede confirmacao antes de acoes criticas (publicar, deletar, enviar email).
Multi-model routing: Cada agente usa modelo diferente otimizado pro seu role. Mostre comparacao de custo.
Fazer
- ●Construir incremental: router primeiro, depois 1 agente, depois o segundo
- ●Gravar o walkthrough mostrando o terminal/logs (transparencia)
- ●Incluir README explicando como rodar o projeto
- ●Celebrar o resultado: voce construiu um sistema multiagente funcional
Evitar
- ●Tentar fazer tudo de uma vez (construa peca por peca)
- ●Pular o walkthrough (a explicacao consolida o aprendizado)
- ●Copiar codigo sem entender o que faz (o objetivo e aprender o padrao)
- ●Desistir no primeiro erro: debug e parte do processo
π Resumo do Modulo 4.7
Revisao completa: agentes, skills, MCP e memoria se conectam num sistema coerente com fluxo definido.
Definicao de agentes: 2-3 agentes com roles claros, models otimizados por custo e tools especificas por funcao.
Router hibrido: comandos + keywords + LLM classifier. Fallback sempre. Logs de toda decisao.
Skills + MCP: tools registradas por agente, MCP Server conectado, teste isolado antes de integrar.
Teste end-to-end: 5 cenarios sistematicos cobrindo routing, tools, memoria, handoff e isolamento.
Demo final: sistema funcional com 2+ agentes, 3+ skills, MCP, memoria e walkthrough gravado.
Trilha 4 Completa!
Voce dominou agentes de IA, multiagentes, skills, MCP, memoria e orquestracao. Na proxima trilha, vamos criar assistentes pessoais e sistemas multi-bot em producao.
Seguir para Trilha 5: Assistentes e Multibots