Visão Geral
Quatro pontos de interceptação cobrem as fronteiras:
Para uma crew, o payload de saída é um
CrewOutput. Para um flow, é o
resultado final do método do flow.
Assinatura do Hook
return None), mutar
in place, substituir retornando um valor, ou abortar lançando HookAborted.
Um abort em qualquer fronteira propaga para fora do kickoff() com seu
motivo.
Esquema de Contexto
Cada ponto recebe um contexto tipado. Todos os contextos compartilham os campos base:ctx.inputs é um alias para o dict de entradas original, então edições in
place por qualquer um dos nomes são equivalentes. Se um hook anterior
substituiu o payload retornando um novo dict, apenas ctx.payload é
reassociado — sempre leia e escreva ctx.payload quando hooks puderem
encadear.Execuções de Crew vs. Execuções de Flow
Hooks de fronteira disparam em ambos os runtimes, e a execução de uma crew roda internamente sobre um runtime de flow. Durante umcrew.kickoff(), um
hook de fronteira global portanto dispara para a fronteira da crew
(ctx.crew definido, ctx.flow None) e para o flow interno
(ctx.flow definido, ctx.crew None). Discrimine pelo runtime:
Casos de Uso Comuns
Verificação de Política no Início
Reescrita de Entradas
INPUT para reescrita e trate EXECUTION_START como o gate de
allow/deny. Reescritas em EXECUTION_START continuam sendo honradas — em
crews elas também alimentam os callbacks de before_kickoff; em flows elas
se aplicam exatamente como uma reescrita de INPUT.
Sanitização de Saída
OUTPUT roda antes de EXECUTION_END, e ambos veem o payload (possivelmente
substituído) de hooks anteriores; o valor final reescrito é o que kickoff()
retorna.
Observando Falhas
EXECUTION_END dispara exatamente uma vez por execução, tanto em sucesso
quanto em falha. Quando a execução lança uma exceção — um erro de task, uma
exceção de método de flow ou um HookAborted de um ponto anterior — o hook
recebe status="failed" com a exceção em ctx.error, e a exceção original
ainda propaga para fora do kickoff() sem alterações:
EXECUTION_END não dispara quando EXECUTION_START nunca foi
despachado (um abort no início significa que a fronteira nunca abriu, então
não há fim para parear), e lançar HookAborted de um dispatch de
EXECUTION_END no caminho de falha é ignorado — não resta nada para abortar,
e o erro original prevalece.
Ordenação
Para uma execução de crew, a ordem de fronteira é:FlowStartedEvent carrega as entradas resolvidas pelos hooks, e reescrever
inputs["id"] em um hook de fronteira redireciona a restauração de estado.
Um abort em EXECUTION_START ainda aparece como FlowStartedEvent seguido
de FlowFailedEvent, emitidos no momento do abort com o payload como
resolvido pelos hooks que rodaram antes dele.
Hooks no mesmo ponto rodam em ordem de registro, hooks globais primeiro,
depois hooks com escopo de crew. A telemetria (HookDispatchedEvent) é
emitida por dispatch.
