Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Agent Hooks é uma capacidade de Agent Framework de primeira classe para aplicar governação e controlos em tempo de execução em pontos bem definidos da execução de um agente. Implementa o contrato AGENT-HOOKS-0.1, neutro em relação ao framework, pelo que motores de políticas, gateways de aprovação, guardas de orçamento, filtros de conteúdo e controlos de saída podem direcionar uma superfície de controlo comum.
Importante
O Agente Hooks é um plano de controlo, não um plano de telemetria. Cada interceptor dá um veredicto. No enforce modo, o quadro atua com base nesse veredicto; no evaluate_only modo, regista o veredicto sem alterar a execução. Use observabilidade para rastreamento passivo, métricas e logs.
O Agent Hooks ainda não está disponível para .NET. Use middleware de agentes, aprovação de ferramentas e segurança de agentes para adicionar controlos de runtime aos agentes .NET.
O Agent Hooks é experimental em Python. A fábrica emite um ExperimentalWarning quando é usada pela primeira vez, e a sua API pode mudar antes da disponibilidade geral.
Quando usar Ganchos de Agente
Use Ganchos de Agente quando os controlos desenvolvidos de forma independente necessitam de um contrato partilhado e executável entre a entrada do agente, chamadas de modelo, chamadas de ferramentas e saída final.
| Capacidade | Usa-o para |
|---|---|
| Agente Hooks | Decisões de política padronizadas, transformações, aprovações, orçamentos e controlos de saída ao longo do ciclo de vida do agente. |
| Middleware de agente | Comportamento transversal específico da aplicação que não precisa do contrato Agent Hooks nem das suas garantias de execução principais. |
| Segurança de Agentes com FIDES | Etiquetas e políticas determinísticas de fluxo de informação para conteúdo não confiável ou confidencial. |
| Aprovação de ferramentas | Confirmação humana das chamadas de ferramentas funcionais individuais. |
| Observabilidade | Rastreios passivos, métricas e registos que não controlam a execução. |
O que o Agent Framework aplica
Quando adiciona Ganchos de Agente a um agente, o Quadro de Agentes aplica uma fronteira de aplicação coordenada entre execuções de agentes, chamadas de modelo e chamadas de ferramentas. O tempo de execução oferece as seguintes garantias:
- Falha encerrada: Uma negação bloqueia a ação defensiva. Contextos inválidos, veredictos inválidos, falhas de interceptores e falhas de aplicação não contornam silenciosamente os controlos.
- Escrita por transformação: Uma transformação altera as mensagens nativas, argumentos da ferramenta, resultados da ferramenta ou resposta final que a execução realmente utiliza. Se uma transformação não puder ser aplicada, a execução falha fechada.
- Streaming com buffer: Nenhuma atualização de resposta chega ao chamador até que a resposta completa do modelo e a saída final ultrapassem os seus pontos de interceção.
-
Persistência limitada ao veredicto: A persistência espera pelo veredito que a cobre. A persistência pós-execução padrão espera por
output; a persistência do histórico de chamadas de serviço espera para cadapost_model_call. - Instalação completa do pacote: O agente, o chat e as partes funcionais são instalados como uma só unidade, por isso não se pode configurar acidentalmente um limite de fiscalização incompleto.
O contrato é cooperativo e não uma fronteira de isolamento de processo. Os interceptores correm no processo anfitrião e recebem o conteúdo necessário para tomar decisões. Regista apenas interceptores em quem confies.
Ganchos de Agente de Instalação
Instale o extra opcional agent-hooks para o pacote base:
pip install "agent-framework-core[agent-hooks]"
Caso utilize uv:
uv add "agent-framework-core[agent-hooks]"
A agent-hooks-sdk dependência é importada de forma preguiçosa. Importar agent_framework não carrega o SDK a menos que crie um bundle de middleware Agent Hooks.
Note
O agent-hooks extra não está intencionalmente incluído em agent-framework-core[all]. Instale-o explicitamente quando quiser ativar esta superfície de controlo experimental.
Adicionar um interceptor
Um interceptor recebe um agent_hooks.AgentContext (o mapeamento de contexto da especificação, não o agent_framework.AgentContext middleware usado pelo agente) e devolve um veredito. O interceptor seguinte bloqueia a saída final contendo a palavra secret. O exemplo assume client que é um cliente de chat Agent Framework já configurado.
from agent_framework import Agent, create_agent_hooks_middleware
from agent_hooks import ALLOW, AgentContext, InterceptionBlocked, Verdict
class SecretEgressGuard:
def intercept(self, context: AgentContext) -> Verdict:
if (
context["interception_point"] == "output"
and "secret" in str(context["target"]).lower()
):
return Verdict.deny(
reason="secret_in_output",
message="The final response contains restricted content.",
)
return ALLOW
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
)
agent = Agent(
client=client,
instructions="You are a helpful assistant.",
middleware=[hooks],
)
try:
response = await agent.run("Summarize the account details.")
except InterceptionBlocked as exc:
print(f"Blocked: {exc.result.verdict.reason}")
Passe o pacote como um elemento da lista do middleware agente. Instale exatamente um pacote Agent Hooks em cada agente.
Pontos de interceção
O Agent Framework emite automaticamente os pontos de interceção aplicáveis:
| Ponto de interceção | Quando é emitido | Alvo de transformação |
|---|---|---|
agent_startup |
Antes da primeira entrada numa sessão de Agent Hooks | Não transformável |
input |
Quando um pedido externo entra no agente | Conteúdo de entrada e função |
pre_model_call |
Antes de cada pedido de modelo | Mensagens enviadas ao modelo |
post_model_call |
Após cada resposta completa do modelo | Conteúdo de resposta, chamadas de ferramentas executadas pelo framework e razão final |
pre_tool_call |
Antes de cada invocação de ferramenta executada pelo framework | Argumentos da ferramenta |
post_tool_call |
Depois de uma ferramenta ter sucesso ou falhar | Resultado da ferramenta |
output |
Antes de a resposta final chegar ao interlocutor | Conteúdo da resposta final |
agent_shutdown |
Quando a sessão Agent Hooks termina, falha ou é cancelada | Não transformável |
Uma execução que chama uma ferramenta normalmente emite:
agent_startup → input → pre_model_call → post_model_call → pre_tool_call → post_tool_call → pre_model_call → post_model_call → output → agent_shutdown
Vereditos
O contrato tem três decisões: allow, deny, e transform. O SDK Python também fornece ajudantes para avisos e recusas levantáveis.
| Result | API Python | Comportamento |
|---|---|---|
| Allow |
ALLOW ou Verdict(decision=Decision.ALLOW) |
Continue com o alvo inalterado. |
| Permitir com aviso | Verdict.warn(...) |
Continue e inclua o aviso no registo de interceção. |
| Deny | Verdict.deny(...) |
Bloqueia a ação de guarda. |
| Negar aguardando aprovação | Verdict.escalate(...) |
Bloquear a menos que o resolvedor de aprovação configurado devolva um veredicto de licença. |
| Transform | Verdict(decision=Decision.TRANSFORM, transform=Transform(...)) |
Reescreva um valor sob $target, e continue com o valor reescrito. |
As recusas ao nível de execução e ao nível do modelo aumentam InterceptionBlocked e impedem que o resultado guardado chegue ao chamador ou ao próximo estágio. Numa costura de ferramenta, uma recusa de política impede a ação da ferramenta ou descarta o seu resultado e devolve um erro de controlo contendo a razão da política, sem a carga útil alvo negada, ao modelo. Isto permite que o ciclo de agentes continue. Uma falha no host ou na aplicação da aplicação interrompe a corrida.
Aplicar uma transformação
Um caminho de transformação deve começar em $target. Por exemplo, um interceptor pode substituir o conteúdo da resposta final:
from agent_hooks import ALLOW, AgentContext, Decision, Transform, Verdict
class OutputRedactor:
def intercept(self, context: AgentContext) -> Verdict:
if context["interception_point"] != "output":
return ALLOW
return Verdict(
decision=Decision.TRANSFORM,
reason="redacted_output",
transform=Transform(
path="$target.content",
value="[Response removed by policy]",
),
)
As transformações são aplicadas aos valores do Agent Framework Content , preservando o conteúdo rico suportado em vez de reduzir todos os valores a texto simples. Um caminho malformado ou substituição incompatível falha ao fechar em vez de continuar com o valor original.
Aprovação de ferramentas e transformações de argumentos
A aprovação da ferramenta Agent Framework e a junção de aprovação Agent Hooks são mecanismos separados. Para uma ferramenta de funções com approval_mode="always_require", o Agent Framework cria o pedido de aprovação humana antes de o middleware de funções ser executado. Uma pre_tool_call transformação pode, portanto, alterar argumentos depois de o utilizador aprovar os valores originais.
Warning
Não transforme argumentos em pre_tool_call para ferramentas que usam approval_mode="always_require". Transforme a chamada de ferramenta em post_model_call para que o pedido de aprovação do framework contenha os valores transformados, ou retorne Verdict.escalate(...) em pre_tool_call e resolva aprovação através dos Ganchos resolverde Agente.
Transmissão e persistência
O Agent Hooks mantém a API de streaming mas utiliza semântica de saída em buffer. O Agent Framework monta a resposta completa do modelo, emite post_model_call, monta a resposta final do agente e emite output antes de lançar quaisquer atualizações. Se qualquer um dos pontos negar a resposta, o chamador não recebe atualizações parciais.
Este comportamento troca a latência token a token pela aplicação de saída falha-fechada. Uma transformação de saída também se reflete nas atualizações eventualmente lançadas ao chamador.
A persistência é limitada pelo ponto de interceção que cobre a operação de persistência:
- Por defeito, o histórico e outros trabalhos de prestadores após a corrida aguardam pelo
outputveredicto. Uma saída negada não é persistida, e uma transformação de saída é mantida após a transformação. - Quando se define
require_per_service_call_history_persistence=TruenoAgentconstrutor ouclient.as_agent(...), cada troca de modelos é mantida após o seupost_model_callveredicto o permitir. Uma recusa posterioroutputnão reverte o que já permitiu a história. - Para persistência padrão após a corrida, as tentativas de retentativa permanecem atrás da decisão final
output. O modo por chamada de serviço persiste, em vez disso, cada resposta do modelo que passapost_model_callpor .
Importante
Se o conteúdo do modelo não tiver de se tornar durável, faça cumprir essa política quando post_model_callrequire_per_service_call_history_persistence=True. Uma política de saída apenas de saída protege o que chega ao chamador, mas não remove retroativamente as centrais modelo já permitidas e persistidas em post_model_call.
Sessões e registos de auditoria
Por defeito, cada execução de agente cria uma sessão de Ganchos de Agente.
agent_startup e agent_shutdown colocam a execução entre parênteses, e os registos recebem um ID de sessão com uma sequência monotonamente crescente.
Usar record_sink para receber cada InterceptionRecordum :
records = []
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
record_sink=records.append,
)
Os registos de interceção capturam a decisão, razão, resumo do interceptor, modo, identidade e sequência sem copiar a carga útil interceptada para o registo de auditoria. O próprio interceptor ainda recebe todo o contexto.
Abrange várias corridas numa só sessão
Use create_agent_hooks_middleware_from_emitter() quando a aplicação possui uma sessão de Agent Hooks de duração mais longa, como uma conversa com um registo de aprovação:
from agent_framework import Agent, create_agent_hooks_middleware_from_emitter
from agent_hooks import AgentContextBuilder, InterceptionEmitter
emitter = InterceptionEmitter().register(SecretEgressGuard())
builder = AgentContextBuilder(
agent_id="support-agent",
framework="agent-framework",
session_id="conversation-42",
)
hooks = create_agent_hooks_middleware_from_emitter(emitter, builder)
agent = Agent(client=client, middleware=[hooks])
await emitter.emit(builder.agent_startup(tools_registered=[]))
await agent.run("First turn")
await agent.run("Second turn")
await emitter.emit(builder.agent_shutdown(reason="completed"))
Nesta forma, a aplicação configura o emissor e é responsável pelo arranque, desligamento e limpeza de erros. O middleware emite os pontos por corrida de input através outputde .
Configurar a aplicação
create_agent_hooks_middleware() Aceita os seguintes controlos:
| Parameter | Purpose |
|---|---|
interceptors |
Uma sequência de interceptores ou um mapeamento nome-para-interceptor. Pelo menos um é necessário. |
resolver |
Resolve recusas levantáveis através de um canal de aprovação. Sem um resolvedor, a negação mantém-se em vigor. |
mode |
"enforce" Aplica-se aos veredictos.
"evaluate_only" regista o que aconteceria, mas permite todas as ações. |
composition |
Seleciona como os veredictos de múltiplos interceptores são combinados. |
identity_provider |
Produz identidades contextuais ligadas ao conteúdo. A predefinição é "jcs-sha256". |
timeout |
Tempo de espera para cada interceptor e resolução para chamadas aguardáveis. O padrão é cinco segundos. Um interceptor ou resolver síncrono que bloqueia o ciclo de eventos não pode ser preemptado por este timeout. |
record_sink |
Recebe cada registo de interceção sem carga útil. |
A composição padrão é sequencial first_deny , com aprovação configurada para parar a dobra. A ordem do interceptor importa, portanto: colocar os controlos que devem sempre funcionar antes dos controlos que podem pedir aprovação. Consulte a lista de verificação de produção do Agent Hooks antes de selecionar outro perfil de composição.
Implemente o modo apenas de avaliação
Utilização evaluate_only para medir o comportamento das políticas antes da aplicação:
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
mode="evaluate_only",
record_sink=records.append,
)
Neste modo, os interceptores correm e os registos incluem os seus veredictos, mas nenhuma ação é bloqueada ou transformada. Não descreva uma evaluate_only implantação como governação imposta.
Regras de composição
Coloque o pacote primeiro na lista de middleware do agente para que forme o limite de aplicação mais externo:
agent = Agent(
client=client,
middleware=[
create_agent_hooks_middleware([SecretEgressGuard()]),
application_middleware,
],
)
Siga estas regras:
- Instale exatamente um pacote Agent Hooks por agente. Os pacotes empilhados são rejeitados.
- Mantém o embrulho intacto. O seu agente, chat e middleware de funções não podem ser instalados separadamente.
- Instala o bundle,
Agentnão diretamente num cliente de chat ou através de um fornecedor de contexto. - O middleware colocado antes do pacote está fora do limite de fiscalização. Trate a posição exterior como confiança externa.
- Dê a cada agente aninhado o seu próprio bundle quando a sua atividade interna de modelo e ferramenta também precisa de interceção.
Limitações atuais
- Apenas Python: O Agent Hooks ainda não está implementado nos SDKs .NET ou Go.
- API Experimental: As assinaturas e comportamentos da fábrica podem mudar antes da disponibilidade geral.
- Streaming com buffer: As atualizações não são lançadas token a token porque a saída tem de estar completa antes de um veredito de falha fechada.
-
Ferramentas alojadas: Ferramentas executadas por um fornecedor de modelos não passam pela costura de invocação de funções do Agent Framework. As suas chamadas e saídas são apresentadas em
post_model_call, maspre_tool_callpost_tool_callnão podem bloquear a execução do servidor do fornecedor. - Fronteira cooperativa: O Agente Hooks não faz sandbox para interceptores nem protege contra um hospedeiro hostil. Caminhos de código que contornam o pipeline de agentes protegidos não são cobertos.
- A disponibilidade de interceptores afeta a disponibilidade dos agentes: No modo de imposição, uma falha ou timeout do interceptor bloqueia a ação guardada por design.
Para lançamento em produção, razões de falha e orientações de alerta, consulte o manual de operações do Agent Hooks.
O Agente Hooks ainda não está disponível para o Go. Use middleware de agentes, aprovação de ferramentas e segurança de agentes para adicionar controlos de execução aos agentes Go.