Pular para o conteudo
MODULO 4.2

🏒 Org graph Γ— work graph

Dois grafos convivem no mesmo sistema de agentes, e confundi-los e a causa mais comum de bagunca. Um fica β€” e o organograma. O outro passa β€” e o pedido de hoje. Este modulo separa os dois e mostra como eles se encontram: zone defense, fan-out/fan-in e roteamento por condicao.

6
Topicos
40
Minutos
Intermediario
Nivel
Pratica
Tipo
Progresso deste modulo
0%0 de 6
1

πŸ›οΈ Separe o organograma do trabalho

Dois grafos convivem no mesmo sistema de agentes, e eles nao sao o mesmo grafo. O org graph e a estrutura que fica: agentes de vida longa com papeis nomeados β€” pesquisador, escritor, validador, publicador β€” cada um dono de um dominio, com memoria acumulada e arestas estaveis que so mudam quando voce redeploya o sistema.

Pense nele como o organograma da empresa, so que cada caixa e um agente rodando o proprio loop. O org graph responde "quem existe e o que cada um faz" β€” nao "o que estamos fazendo agora". Essa segunda pergunta e outro grafo, que voce ve no proximo topico.

πŸ†• Novo aqui? Quatro palavras antes de seguir

  • Org graph: a estrutura estavel de agentes de vida longa β€” o organograma. So muda quando voce reimplanta o sistema.
  • Work graph: o grafo montado para uma tarefa especifica. Nasce, roda, e e descartado.
  • Redeploy: reimplantar β€” publicar uma nova versao do sistema no ar. E o unico momento em que o org graph muda de forma.
  • DeterminΓ­stico: mesmo input, sempre o mesmo output. O oposto de "depende da sorte do modelo naquele dia".
ORG GRAPH β€” o organograma pesquisador escritor validador publicador fica β€” muda so no redeploy WORK GRAPH β€” o pedido de hoje pesquisador validador fim passa β€” muda a cada pedido

O que olhar: a divisoria pontilhada no meio nao separa dois sistemas β€” separa duas perspectivas do mesmo sistema. Repare que "pesquisador" e "validador" aparecem dos dois lados: sao os mesmos agentes. A esquerda, voce ve todas as relacoes possiveis entre eles (o organograma). A direita, voce ve so o caminho fino que esta tarefa de hoje realmente percorreu β€” um subconjunto, montado na hora.

βœ“ E org graph quando

  • βœ“O agente tem nome e papel fixo, nao muda de tarefa em tarefa
  • βœ“Ele acumula memoria β€” sabe coisas que aprendeu em execucoes passadas
  • βœ“A aresta representa "pode pedir a" β€” uma relacao de longo prazo

βœ— Nao e org graph quando

  • βœ—Voce esta desenhando os passos de uma tarefa unica β€” isso e work graph
  • βœ—A "estrutura" muda toda vez que chega um pedido diferente
  • βœ—Nao ha memoria acumulada, so contexto daquela execucao

Conceitos-chave

Org graph

O organograma, estavel

Vida longa

Agente com papel nomeado

Memoria acumulada

Aprende entre execucoes

Muda no redeploy

Nao muda em runtime

2

πŸ“‹ Monte o work graph do pedido de hoje

O work graph e efemero: montado pra uma tarefa especifica e descartado depois. Ele muda a cada execucao β€” hoje pede pesquisador e validador, amanha pede so o escritor, depois pede os quatro em fila. Nao existe "o" work graph do sistema; existe um work graph novo pra cada pedido que chega.

πŸ’‘ A confusao mais comum de sistema bagunΓ§ado

Confundir os dois grafos e a causa mais comum de sistema bagunΓ§ado. Tem gente que recria a organizacao inteira a cada requisicao β€” instancia agente novo, redefine papeis, redesenha a estrutura toda vez que chega um pedido. E tem gente que faz o oposto: engessa a tarefa dentro do organograma, tratando cada variacao de pedido como se precisasse virar um agente novo e permanente.

  • β€’Recriar a organizacao a cada pedido = caro, lento, e voce perde a memoria acumulada que fazia o agente ser bom.
  • β€’Engessar a tarefa no organograma = o sistema fica rigido, incapaz de atender um pedido que nao seguiu o roteiro previsto.
1

Pedido chega

Um usuario ou sistema externo dispara uma tarefa. O work graph ainda nao existe.

2

Roteador escolhe quem participa

Olha o org graph disponivel e seleciona um subconjunto de agentes para essa tarefa especifica.

3

Work graph roda e termina

O caminho fino da tarefa e executado do inicio ao fim, entrega o resultado, e e descartado.

4

Org graph permanece intacto

Os agentes que participaram continuam existindo, prontos pro proximo work graph β€” com a memoria que acumularam.

Conceitos-chave

Work graph

Efemero, um por pedido

Descartavel

Nasce, roda, some

Subconjunto

Usa so parte do org graph

Erro comum

Confundir com o organograma

3

πŸ›‘οΈ Aplique zone defense

Zone defense e o padrao que faz o org graph valer a pena: cada agente dono de um dominio, com contexto persistente. O de seguranca cuida de autenticacao, permissoes e logs de auditoria. O de dados cuida de esquema, migracoes e padroes de query. O de API cuida de endpoints, limites de taxa e contratos. O de frontend cuida de componentes, estado e padroes de interface.

Cada um roda o proprio loop dentro da zona. Um pedido de uma zona pra outra passa pelo work graph β€” nunca direto. Nenhum agente vaza pro contexto do outro. E isso que faz o agente de vida longa acumular valor de verdade: um agente de seguranca que ja revisou 300 mudancas conhece o modelo de ameaca daquele codigo de forma implicita, sem precisar reexplicar nada a cada pedido.

πŸ“Š As quatro zonas classicas

  • Seguranca β€” autenticacao, permissoes, logs de auditoria
  • Dados β€” esquema, migracoes, padroes de query
  • API β€” endpoints, limites de taxa, contratos
  • Frontend β€” componentes, estado, padroes de interface

πŸ†• Novo aqui? Zone defense

Zone defense: termo emprestado do esporte β€” cada jogador cobre uma area do campo, nao uma pessoa especifica do time adversario. Em graph engineering, cada agente cobre um dominio do sistema, nao uma tarefa especifica. Ele defende a zona inteira, tarefa apos tarefa.

βœ“ Zone defense funciona quando

  • βœ“O dominio tem fronteira clara (dados nao e API, API nao e frontend)
  • βœ“Passagens entre zonas viram uma aresta explicita no work graph
  • βœ“Cada agente acumula contexto real (historico de decisoes, nao so instrucao)

βœ— Zone defense quebra quando

  • βœ—Um agente le ou escreve direto no contexto de outra zona (vazamento)
  • βœ—As zonas se sobrepoem β€” dois agentes "donos" do mesmo dominio
  • βœ—Uma zona fica sem dono e vira terra de ninguem

Conceitos-chave

Zone defense

Um dono por dominio

Contexto persistente

Nao reseta a cada tarefa

Sem vazamento

Passagem = aresta explicita

Valor implicito

Experiencia acumulada conta

4

πŸ”€ Faca fan-out e fan-in de verdade

Fan-out e abrir uma tarefa em N ramos que rodam ao mesmo tempo. Fan-in e juntar os N resultados de volta num so. E o movimento que um loop simplesmente nao faz, por ser sequencial de forma β€” um loop processa uma coisa de cada vez, sempre.

A juncao e onde mora o perigo. Um merge malfeito engole um ramo em silencio, e o resultado parece completo mesmo faltando pedaco. Por isso toda juncao precisa conferir cardinalidade: recebi os N que despachei?

πŸ†• Novo aqui? Fan-out, fan-in, cardinalidade

  • Fan-out: um no despacha trabalho para varios ramos paralelos ao mesmo tempo.
  • Fan-in: os ramos paralelos convergem de volta para um unico no de juncao.
  • Cardinalidade: a contagem β€” quantos itens saΓ­ram versus quantos voltaram. Se despachou 5 e recebeu 4, a cardinalidade nao bate.
origem βœ— juncao recebi 4 de 5 fan-out em 5 ramos Β· 1 ramo falha em silencio Β· fan-in sem checar cardinalidade nao percebe

O que olhar: quatro ramos pulsando chegam limpos na juncao; o quinto, marcado com X vermelho, nunca chega. Se a juncao nao contar quantos ramos despachou versus quantos recebeu, ela vai aceitar "recebi 4 de 5" como se fosse um resultado completo. Isso e o merge que engole uma fonte β€” o resultado parece pronto e ninguem percebe que faltou um pedaco.

⚠️ Atencao: juncao sem checagem de cardinalidade

Toda vez que voce escreve um fan-in, pergunte explicitamente "quantos eu esperava?" antes de seguir. Se a resposta nao bate com o que chegou, pare e trate o caso β€” nao deixe o work graph seguir como se estivesse completo. Um ramo que falhou em silencio e pior que um ramo que falhou gritando.

Conceitos-chave

Fan-out

Um no vira N ramos

Fan-in

N ramos viram um no

Cardinalidade

Recebi os N que despachei?

Perigo

Merge que engole em silencio

5

🚦 Roteie por condicao

No roteamento por condicao, a aresta escolhe o destino a partir do resultado do no anterior. E o mecanismo que faz o work graph "decidir" sem um agente ter que interpretar tudo de novo a cada passo. O exemplo classico e o suporte ao cliente.

Complexidade baixa vai pra base de respostas prontas (FAQ). Complexidade media vai pro agente de IA. Complexidade alta ou arriscada escalona direto pro humano. Existem ainda a aresta de "nao resolveu" (devolve pro proximo nivel) e a aresta de aprendizado (volta pro classificador com o feedback).

Diagrama de suporte ao cliente: o cliente manda uma mensagem, um no de classificacao roteia por complexidade β€” baixa vai para FAQ, media vai para o agente de IA, alta ou arriscada escalona direto para o humano em vermelho. Setas tracejadas de se-nao-resolvido descem de FAQ para o agente de IA e deste para o humano, todas convergindo em solucao. Uma seta verde tracejada de aprendizado volta do feedback para a classificacao.
O que olhar: a legenda distingue quatro tipos de aresta β€” fluxo principal (classificacao β†’ FAQ/IA/humano), se-nao-resolvido (tracejada, sobe um nivel), escalonamento (vermelha, direto pro humano) e aprendizado (verde, volta pro classificador). A seta verde de aprendizado e a unica que fecha ciclo β€” ela e o que faz o sistema melhorar com o tempo, em vez de so funcionar do mesmo jeito pra sempre.

🎯 Por que a aresta de aprendizado importa mais que parece

As tres primeiras arestas (principal, se-nao-resolvido, escalonamento) fazem o sistema funcionar hoje. So a aresta verde faz o sistema funcionar melhor amanha β€” porque ela e a unica que devolve informacao pro no que decide. Sem ela, o classificador erra do mesmo jeito pra sempre; com ela, cada correcao humana vira sinal pro proximo roteamento.

Conceitos-chave

Roteamento por condicao

Aresta escolhe pelo resultado

Escalonamento

Alto risco vai direto ao humano

Se-nao-resolvido

Sobe pro proximo nivel

Aprendizado

Unica aresta que fecha ciclo

6

βš™οΈ Deixe codigo decidir o que e previsivel

Modelo roteando o que um if resolve e caro, lento e nao determinΓ­stico. A divisao que funciona: codigo controla o roteamento previsivel; modelo cuida dos passos que exigem interpretacao ou julgamento. Cada aresta que voce consegue transformar em regra escrita e uma aresta que para de custar token e de variar entre execucoes.

βœ“ Deixe pro codigo

  • βœ“"Se complexidade == baixa, vai pra FAQ" β€” regra explicita, sem ambiguidade
  • βœ“"Se cardinalidade nao bate, para e alerta" β€” checagem mecΓ’nica
  • βœ“"Se categoria == pagamento, vai pro agente financeiro" β€” mapeamento fixo

βœ— Deixe pro modelo

  • βœ—"O tom da mensagem sugere frustracao?" β€” exige leitura, nao regra
  • βœ—"Essa resposta responde de verdade a pergunta?" β€” julgamento de qualidade
  • βœ—"Qual e a intencao real por tras dessa frase ambigua?" β€” interpretacao

πŸ§ͺ Exemplo pratico: grafo de roteamento de suporte em JSON

Objetivo: escrever o grafo de roteamento do suporte com arestas condicionais explicitas, aresta de escalonamento, de nao-resolvido, de aprendizado β€” e uma juncao que confere cardinalidade. Roda no console do navegador (F12 β†’ Console) ou no Node.

// 1) O grafo de roteamento: cada aresta tem uma condicao explicita
const roteador = {
  "classificacao": [
    { "para": "faq",         "quando": "complexidade == 'baixa'" },
    { "para": "agente_ia",   "quando": "complexidade == 'media'" },
    { "para": "humano",      "quando": "complexidade == 'alta' || risco == 'alto'" }
  ],
  "faq":        [ { "para": "agente_ia", "quando": "resolvido == false" } ],
  "agente_ia":  [ { "para": "humano",    "quando": "resolvido == false" } ],
  "humano":     [ { "para": "classificacao", "quando": "feedback_dado == true", "tipo": "aprendizado" } ]
};

// 2) Juncao com checagem de cardinalidade (fan-in de N tickets em lote)
function fanIn(despachados, recebidos) {
  if (recebidos.length !== despachados.length) {
    throw new Error(`cardinalidade nao bate: recebi ${recebidos.length} de ${despachados.length}`);
  }
  return recebidos;
}

// 3) Rota um ticket de exemplo
function roteia(no, ctx) {
  const arestas = roteador[no] || [];
  for (const a of arestas) {
    // avaliacao simplificada da condicao 'quando' contra o contexto
    if (eval(a.quando.replace(/complexidade/g, `'${ctx.complexidade}'`).replace(/risco/g, `'${ctx.risco}'`).replace(/resolvido/g, ctx.resolvido).replace(/feedback_dado/g, ctx.feedback_dado))) {
      return a.para;
    }
  }
  return null; // nenhuma condicao casou -- pedido some, ver "como verificar"
}

console.log(roteia("classificacao", { complexidade: "media", risco: "baixo" })); // "agente_ia"

Como verificar:

  • 1. Toda aresta que sai de um no de decisao (classificacao) tem quando β€” nenhuma aresta "muda" sem condicao escrita.
  • 2. As condicoes cobrem todos os casos β€” teste roteia("classificacao", <contexto sem match>); se retornar null, existe uma entrada que nao casa com nenhuma condicao e o pedido some em silencio.
  • 3. Existe caminho ate o humano a partir de qualquer no β€” siga as arestas de faq e agente_ia e confirme que ambas chegam em humano quando resolvido == false.

Agora troque pelo seu: substitua os nos por <etapas do seu suporte> e as condicoes por <campos reais do seu ticket>. Rode o teste do item 2 antes de subir pra producao.

Checagem rapida (nao bloqueia nada): um fan-in recebeu 3 respostas de um fan-out que despachou 5 ramos, e seguiu como se estivesse completo. Qual foi o erro?

Conceitos-chave

Codigo roteia

O que e regra, vira `if`

Modelo julga

O que exige interpretacao

Cobertura total

Toda entrada tem destino

Menos custo

Regra escrita nao gasta token

πŸ“Œ Resumo do Modulo

βœ“
Org graph = organograma β€” agentes de vida longa, papeis nomeados, muda so no redeploy.
βœ“
Work graph = tarefa de hoje β€” efemero, montado e descartado a cada pedido.
βœ“
Zone defense β€” cada agente dono de um dominio, com contexto persistente, sem vazar pro outro.
βœ“
Fan-out/fan-in β€” abrir em N ramos paralelos e juntar; toda juncao confere cardinalidade.
βœ“
Roteamento por condicao β€” a aresta escolhe pelo resultado do no; a aresta de aprendizado e a unica que fecha ciclo.
βœ“
Codigo x modelo β€” o que e regra, vira `if`; o que exige julgamento, fica com o modelo.

Proximo Modulo:

4.3 β€” Falhas, harness e observabilidade: merge que engole fonte, roteamento que nao converge, monitor de quem rodou o que.