Skip to content

Pipeline de AI

O que acontece entre "um alerta chega" e "um veredito é gravado". A camada de triagem da SocTalk é uma máquina de estados LangGraph — um supervisor que roteia o trabalho para nós de trabalho especializados, seguido por um nó de veredito que decide se o caso precisa de revisão humana.

Esta página é o modelo mental. O código vive em src/soctalk/graph/, src/soctalk/supervisor/ e src/soctalk/workers/.

Nós

FinalidadeModelo usado
supervisorDecide o que fazer em seguida. Roteamento puro — não realiza nenhum trabalho de domínio por conta própria.modelo rápido
wazuh_workerPuxa o alerta em contexto, extrai observáveis (IPs, hashes, usuários, processos), correlaciona com alertas recentes no mesmo tenant.modelo rápido
cortex_workerEnvia observáveis aos analisadores do Cortex (VirusTotal, AbuseIPDB, etc.) para reputação/enriquecimento.modelo rápido
misp_workerConsulta observáveis contra feeds de inteligência de ameaças do MISP em busca de contexto conhecido de campanha / ator.modelo rápido
verdictRaciocina sobre tudo o que os workers coletaram. Produz `escalateclose
human_reviewPausa a execução; emite uma solicitação de revisão para a fila do dashboard e/ou Slack. Aguarda uma HumanDecision (`approvereject
closeGera o relatório de encerramento e grava a disposição (`close_fpescalate

Roteamento do supervisor

O único trabalho do supervisor é escolher o próximo nó. Seu espaço de decisão é um enum fixo de 5 elementos:

DecisãoSignifica
INVESTIGATEAinda não sei o suficiente sobre este alerta. Execute o worker do Wazuh.
ENRICHTenho observáveis cuja reputação não verifiquei. Execute o Cortex.
CONTEXTUALIZEOs observáveis parecem interessantes; verifique se há campanhas/atores conhecidos. Execute o MISP.
VERDICTTenho o suficiente. Passe para o nó de veredito.
CLOSEEste é um caso evidente (ex.: falso positivo óbvio ou alerta já resolvido). Pule o nó de veredito.

O supervisor nunca invoca ferramentas externas por conta própria. Ele lê o SecOpsState acumulado (alertas, observáveis, saídas anteriores dos workers, veredictos) e produz uma das cinco decisões. A maioria dos casos percorre supervisor → worker → supervisor → worker → supervisor → VERDICT, de três a seis saltos no total.

Nó de veredito

O modelo de raciocínio recebe todo o estado acumulado — alerta original, descobertas de cada worker, todos os observáveis com seu enriquecimento, tentativas anteriores de veredito (se houve loop de NEEDS_MORE_INFO). Ele produz:

CampoTipo
decision`escalate
confidenceenum: `low
rationalemarkdown curto
evidence_strength`weak
verdict`benign
impact`low

escalate sempre passa por human_review. close pula a revisão humana e vai direto para close. needs_more_info retorna ao supervisor com um prompt sugerindo o que ainda está faltando.

Portão de revisão humana

human_review pausa a execução. O caso aparece na fila de Revisão no dashboard e (se o Slack estiver configurado) no HIL bidirecional do Slack. O humano escolhe:

DecisãoEfeito no caso
approveRevisão pendente marcada como concluída + feedback auditado. Não é retomada automaticamente; acompanhamento pelo analista.
rejectO caso é encerrado como auto_closed_fp. Terminal — o grafo não é reinvocado.
more_infoRevisão marcada como info_requested com a lista de perguntas. Não é retomada automaticamente; acompanhamento pelo analista.

A identidade, o timestamp e a justificativa do humano são anexados ao log case_events do caso, que é somente-acréscimo.

Ciclo de vida da execução

Uma "execução" (run) é uma execução do grafo contra um caso. Enum de status:

StatusSignifica
activeO grafo está em execução.
waiting_on_gatePausado em human_review.
pausedPausado manualmente por um admin MSSP.
halted_budgetAtingiu o orçamento de tokens por execução. Execuções normais da V1 assumem tokens_budget = 200,000 da linha case_runs (padrão do modelo). O env SOCTALK_CASE_RUN_TOKEN_BUDGET (padrão 15,000) é usado apenas como fallback quando a linha não tem valor definido.
completedO grafo chegou ao close e gravou uma disposição.
failedO grafo apresentou erro ou uma ferramenta externa ficou inacessível.

Os orçamentos de tokens são rastreados por execução, por tenant e para toda a instalação. Consulte Observabilidade para as métricas, e Provedores de LLM para os controles de custo.

O processo runs-worker

Cada tenant tem seu próprio pod runs-worker (no namespace tenant-<slug>) que consome a fila:

  1. Chama POST /api/internal/worker/runs/claim para uma execução atribuída ao seu tenant.
  2. Constrói o LangGraph a partir do chart de nós.
  3. ainvoke() contra o grafo, publicando POST /api/internal/worker/runs/{run_id}/heartbeat a cada 20 s.
  4. Ao concluir, publica o estado final e a disposição em POST /api/internal/worker/runs/{run_id}/complete.

O runs-worker é o único pod de computação por tenant — mantê-lo no namespace do tenant significa que um tenant acima do orçamento não pode privar o restante da instalação de computação. A própria lógica de supervisor + worker + veredito é sem estado; o trabalho pesado são as chamadas de LLM (fora do cluster, faturadas ao provedor configurado do tenant).

Ponteiros de código-fonte

ConceitoArquivo
Construtor de grafo + roteamentosrc/soctalk/graph/builder.py
Lógica do supervisorsrc/soctalk/supervisor/node.py
Nó de vereditosrc/soctalk/supervisor/verdict.py
Nós de trabalhosrc/soctalk/workers/
Encerramento / disposiçãosrc/soctalk/graph/close.py
Loop do runs workersrc/soctalk/runs_worker/main.py
Schema de estadosrc/soctalk/models/state.py

Publicado sob a Licença Apache 2.0.