Skip to main content
Os hooks de fronteira de execução interceptam as bordas mais externas de uma execução — antes de qualquer trabalho começar, quando as entradas são resolvidas, quando o resultado final está pronto e quando a execução termina. Eles disparam tanto para crews quanto para flows e são o lugar certo para verificações de política no nível da execução, reescrita de entradas e sanitização de saídas.

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

Hooks de fronteira seguem o contrato padrão: prosseguir (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:
Os contextos de cada ponto adicionam um alias nomeado para o payload:
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 um crew.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

Entradas reescritas fluem para a interpolação de tasks, então a execução se comporta como se tivesse sido iniciada com o dict modificado. Prefira 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:
Duas ressalvas: 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 é:
Para uma execução de flow, os hooks de fronteira resolvem as entradas antes de os eventos de ciclo de vida começarem:
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.

Gerenciando Hooks em Testes

Documentação Relacionada