Entrar ou criar conta

ULC Lab · implementação reproduzível

Laboratório: Orquestração Multiagente com Claude Agent SDK, OpenAI Agents SDK e MCP em Python

Você implementará uma arquitetura multiagente local, com orquestrador em Python, agentes Claude e OpenAI, fila de tarefas, tracing e avaliação automatizada. Em cerca de 2 horas, será possível observar agentes especialistas cooperando, com logs, guardrails e revisão humana simulada.

Multiagentes e operação: a empresa operada por agentes, governança, custos, avaliação e segurança
Ligado ao treinamento Multiagentes e operação: a empresa operada por agentes, governança, custos, avaliação e segurança

Roteiro para estudo em ambiente de laboratório ou de teste. Execute apenas em equipamentos, redes e contas que você tenha autorização para usar, com backup e homologação próprios. Comandos podem causar indisponibilidade ou perda de dados. Software e marcas citados pertencem aos seus titulares. Termos de Uso.

Status de validaçãoNão validado pela Upnetix: roteiro derivado da documentação oficial, para você executar e validar
Duração estimada
120 min
Passos
12
Validações
5
Versões da documentação consultada
Python 3.10 ou superior · Claude Agent SDK a versão estável atual · OpenAI Agents SDK a versão estável atual · Redis a versão estável atual · FastAPI a versão estável atual · Pydantic a versão estável atual
Objetivo

Demonstrar, em ambiente controlado, como diferentes agentes LLM podem ser orquestrados para executar tarefas especializadas, com fila, tracing, testes automatizados, guardrails e pontos de intervenção humana. O laboratório foca em integração real dos SDKs Claude Agent e OpenAI Agents, uso de fila local (Redis), tracing via logs e avaliação automática de resultados, simulando um fluxo empresarial multiagente robusto.

Topologia

Um servidor Python central (orquestrador) recebe tarefas via API REST. Ele distribui para dois agentes: um Claude (via Claude Agent SDK) e um OpenAI (via OpenAI Agents SDK), cada um rodando localmente. As tarefas são enfileiradas em Redis. O orquestrador coleta os resultados, registra logs de tracing e executa testes automáticos. Um script simula revisão humana. Todos os componentes rodam em localhost, usando portas distintas (exemplo: 127.0.0.1:8000 para API, 6379 para Redis).


        [Usuário/API REST]
                |
         [Orquestrador Python]
           /           \
  [Claude Agent]   [OpenAI Agent]
           \           /
            [Fila Redis]
                |
         [Avaliação/Testes]
                |
       [Revisão Humana Simulada]

Equipamentos e software

ItemRequisito, licença ou versão
PC ou VM2 vCPU, 4GB RAM, 10GB livre, acesso à internet, portas 8000 e 6379 liberadas
PythonPSF · 3.10 ou superior
Claude Agent SDKApache-2.0 · a versão estável atual
OpenAI Agents SDKMIT · a versão estável atual
RedisBSD · a versão estável atual
FastAPIMIT · a versão estável atual
PydanticMIT · a versão estável atual

Roteiro

  1. Preparar ambiente Python e instalar dependências

    Isolar o ambiente evita conflitos. Instale SDKs, FastAPI, Redis client e utilitários.

    python3 -m venv multiagentes-lab
    source multiagentes-lab/bin/activate
    pip install fastapi uvicorn redis pydantic
    pip install claude-agent-sdk-python
    pip install openai-agents

    O que você deve ver: Ambiente virtual ativado e pacotes instalados sem erro.

  2. Instalar e iniciar Redis localmente

    A fila Redis permite desacoplar a orquestração dos agentes. Redis é leve e fácil de rodar local.

    sudo apt-get update && sudo apt-get install redis-server -y
    sudo systemctl start redis-server
    redis-cli ping

    O que você deve ver: Resposta 'PONG' no terminal.

  3. Configurar variáveis de ambiente para segredos

    Nunca exponha chaves no código. Use variáveis para as APIs Claude e OpenAI.

    export CLAUDE_API_KEY='sua-chave-anthropic'
    export OPENAI_API_KEY='sua-chave-openai'

    O que você deve ver: Variáveis setadas na sessão. Não aparece saída ao exportar.

  4. Criar API REST de entrada de tarefas com FastAPI

    A API recebe tarefas e as coloca na fila Redis. Use Pydantic para validação.

    cat > api.py <<'EOF'
    from fastapi import FastAPI
    from pydantic import BaseModel
    import redis
    import json
    
    app = FastAPI()
    r = redis.Redis(host='localhost', port=6379, db=0)
    
    class Tarefa(BaseModel):
        tipo: str
        dados: dict
    
    @app.post('/tarefa')
    def nova_tarefa(tarefa: Tarefa):
        r.lpush('tarefas', json.dumps(tarefa.dict()))
        return {'status': 'enfileirada'}
    EOF

    O que você deve ver: Arquivo api.py criado. Nenhum erro.

  5. Implementar o orquestrador Python

    O orquestrador lê da fila, decide qual agente executar e faz tracing. Separe funções para clareza.

    cat > orquestrador.py <<'EOF'
    import redis, json, logging, os
    from claude_agent_sdk import ClaudeAgent
    from openai_agents import Agent, Runner
    
    logging.basicConfig(filename='tracing.log', level=logging.INFO)
    r = redis.Redis(host='localhost', port=6379, db=0)
    
    # Exemplos de prompts versionados
    PROMPT_CLAUDE = 'v1: Responda como especialista em análise de sentimentos.'
    PROMPT_OPENAI = 'v1: Responda como especialista em resumo de texto.'
    
    while True:
        tarefa_raw = r.rpop('tarefas')
        if not tarefa_raw:
            continue
        tarefa = json.loads(tarefa_raw)
        tipo = tarefa['tipo']
        dados = tarefa['dados']
        if tipo == 'sentimento':
            agent = ClaudeAgent(api_key=os.environ['CLAUDE_API_KEY'], instructions=PROMPT_CLAUDE)
            resposta = agent.run_sync(dados['texto'])
        elif tipo == 'resumo':
            agent = Agent(name='openai-resumidor', instructions=PROMPT_OPENAI)
            resposta = Runner.run_sync(agent, dados['texto'])
        else:
            resposta = 'Tipo de tarefa não suportado.'
        logging.info(f"Tarefa: {tarefa} | Resposta: {resposta}")
        r.lpush('resultados', json.dumps({'tarefa': tarefa, 'resposta': resposta}))
    EOF

    O que você deve ver: Arquivo orquestrador.py criado. Nenhum erro.

  6. Adicionar guardrails de entrada e saída

    Valide tipos e tamanho dos dados antes de enviar ao agente. Rejeite entradas inválidas.

    cat >> orquestrador.py <<'EOF'
    # Após carregar tarefa, antes de rodar agente:
    if 'texto' not in dados or not isinstance(dados['texto'], str) or len(dados['texto']) > 1000:
        resposta = 'Entrada inválida.'
        logging.warning(f"Tarefa inválida: {tarefa}")
        r.lpush('resultados', json.dumps({'tarefa': tarefa, 'resposta': resposta}))
        continue
    EOF

    O que você deve ver: Arquivo orquestrador.py atualizado com validação. Nenhum erro.

  7. Implementar avaliação automática dos resultados

    Teste se a resposta do agente atende ao esperado. Use casos de teste simples.

    cat > avaliador.py <<'EOF'
    import redis, json
    r = redis.Redis(host='localhost', port=6379, db=0)
    # Exemplo de caso de teste
    casos = [
        {'tipo': 'sentimento', 'dados': {'texto': 'O produto é ótimo!'}, 'esperado': 'positivo'},
        {'tipo': 'resumo', 'dados': {'texto': 'Python é uma linguagem de programação.'}, 'esperado': 'linguagem de programação'}
    ]
    for caso in casos:
        r.lpush('tarefas', json.dumps(caso))
    
    print('Aguardando resultados...')
    for _ in casos:
        res_raw = r.brpop('resultados')[1]
        res = json.loads(res_raw)
        print(f"Tarefa: {res['tarefa']}, Resposta: {res['resposta']}")
    EOF

    O que você deve ver: Arquivo avaliador.py criado. Nenhum erro.

  8. Simular revisão humana para ações irreversíveis

    Antes de executar ações críticas, envie para revisão. Aqui, apenas registre e aguarde aprovação manual.

    cat > revisao.py <<'EOF'
    import redis, json
    r = redis.Redis(host='localhost', port=6379, db=0)
    while True:
        res_raw = r.brpop('resultados')[1]
        res = json.loads(res_raw)
        print(f"Revisão humana: {res}")
        # Simule aprovação
        r.lpush('aprovados', json.dumps(res))
    EOF

    O que você deve ver: Arquivo revisao.py criado. Nenhum erro.

  9. Rodar todos os serviços em paralelo

    Execute API, orquestrador, avaliador e revisão em terminais separados. Isso simula produção.

    uvicorn api:app --reload --port 8000
    # Em outro terminal
    python orquestrador.py
    # Em outro terminal
    python avaliador.py
    # Em outro terminal
    python revisao.py

    O que você deve ver: Todos os serviços rodando. API responde, orquestrador processa, avaliador testa, revisão imprime resultados.

  10. Enviar tarefas de teste via API

    Use curl ou httpie para testar entrada de tarefas.

    curl -X POST 'http://127.0.0.1:8000/tarefa' -H 'Content-Type: application/json' -d '{"tipo": "sentimento", "dados": {"texto": "O serviço foi ruim."}}'

    O que você deve ver: {"status":"enfileirada"}

  11. Verificar logs de tracing

    Confirme que cada passo foi registrado. O tracing é essencial para auditoria e depuração.

    tail -f tracing.log

    O que você deve ver: Linhas de log detalhando tarefas, respostas e avisos de entrada inválida.

  12. Revisar resultados aprovados

    Veja as respostas aprovadas pela revisão humana simulada.

    redis-cli LRANGE aprovados 0 -1

    O que você deve ver: Lista de respostas em JSON, aprovadas.

Como saber que funcionou

TesteComandoCritério
API aceita tarefas e responde corretamentecurl -X POST 'http://127.0.0.1:8000/tarefa' -H 'Content-Type: application/json' -d '{"tipo": "resumo", "dados": {"texto": "A IA está mudando o mundo."}}'Resposta JSON com status 'enfileirada'
Orquestrador processa tarefas e grava logstail -n 5 tracing.logLinhas mostrando tarefa recebida, resposta gerada e possíveis avisos
Avaliação automática compara resposta ao esperadopython avaliador.pySaída mostra tarefa, resposta e permite verificar se bate com o esperado
Revisão humana simula aprovação de resultadospython revisao.pyRespostas aparecem no console e são gravadas em Redis
Fila Redis contém tarefas e resultadosredis-cli LLEN tarefas redis-cli LLEN resultadosValores numéricos compatíveis com o fluxo de tarefas

Troubleshooting

SintomaCausa provávelCorreção
API retorna erro 500 ao enviar tarefaRedis não está rodando ou variável de ambiente ausenteVerifique se o Redis está ativo e se as variáveis de ambiente estão setadas
Orquestrador não processa tarefasFila vazia ou erro de importação de SDKConfirme se há tarefas na fila e se os SDKs estão instalados
Respostas inesperadas dos agentesPrompt mal definido ou entrada inválidaRevise os prompts versionados e valide os dados de entrada
Logs de tracing não aparecemPermissões de escrita no diretório ou erro de configuração do loggingGaranta permissão de escrita e revise a configuração do logging
Revisão humana não aprova resultadosScript revisao.py não está rodando ou erro de conexão RedisExecute o script e verifique a conexão com Redis

Segurança e hardening

  • Nunca exponha chaves de API em código ou logs
  • Restrinja acesso ao Redis para localhost
  • Limite tamanho e tipo dos dados aceitos na API
  • Registre todas as ações críticas para auditoria
  • Implemente revisão humana para tarefas sensíveis
  • Descarte dados pessoais após o uso, conforme LGPD

Checklist final

Referências

  1. Claude Agent SDK Documentation · Code.claude (code.claude.com)
  2. OpenAI Agents SDK (Python) · Openai.github (openai.github.io)
  3. FastAPI Documentation · FastAPI (fastapi.tiangolo.com)
  4. Pydantic Documentation · Docs.pydantic (docs.pydantic.dev)
  5. Model Context Protocol · Modelcontextprotocol (modelcontextprotocol.io)
Verificação editorial
Publicado
13/09/2026
Última revisão
13/09/2026
Versão do conteúdo
1.0
Referências
5 oficiais
Revisão técnica
redação e revisão por IA, URLs conferidas na publicação
Status
Atual
Encontrou um erro? Escreva para comercial@upnetix.com.br com o endereço da página. A revisão semestral por IA nunca altera comandos ou configurações sem passar pela fila de revisão.