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.
Os ganchos são pontos de controlo personalizados que intercetam e controlam o comportamento dos agentes em momentos-chave. Use ganchos para impor portas de qualidade nas respostas dos agentes, auditar e controlar a utilização de ferramentas, bloquear operações perigosas aplicando políticas e impedir a conclusão antecipada da tarefa ao validar a saída do agente.
O problema
O seu agente executa tarefas de forma autónoma – investigar incidentes, executar ferramentas e gerar respostas. Mas autonomia sem supervisão cria risco:
- Respostas incompletas: O agente diz "feito" antes de responder a tudo o que pediu.
- Utilização de ferramentas não auditadas: Não tens visibilidade sobre quais ferramentas o agente chama ou que resultados obtém.
- Sem aplicação de políticas: Operações perigosas (comandos destrutivos, alterações não autorizadas) prosseguem sem controlo.
- Lacunas de qualidade: As respostas falham informação crítica porque não há passo de validação.
É preciso uma forma de intercetar o comportamento dos agentes em momentos-chave sem o abrandar ou retirar completamente a sua autonomia.
Como funcionam os ganchos de agente
Os ganchos são pontos de controlo personalizados que associas a eventos específicos de agentes. Quando um evento é disparado, o seu gancho de código avalia a situação e decide se permite ou bloqueia a ação.
Agent about to stop → Stop hook evaluates response → Allow or reject
Agent uses a tool → PostToolUse hook checks result → Allow, block, or inject context
Atualmente, são suportados dois hook events:
| Event | Aciona quando | O que pode fazer |
|---|---|---|
| Parar | O agente está prestes a dar uma resposta final | Validar a completude, rejeitar e forçar o agente a continuar |
| Após Uso da Ferramenta | Uma ferramenta termina de ser executada com sucesso | Auditoria de utilização, bloquear resultados, injetar contexto extra |
Dois níveis de ganchos
Os ganchos operam em dois níveis:
| Nível | Onde configurar | Scope |
|---|---|---|
| Nível de agente | Construtor → Ganchos no portal | Aplica-se a todo o agente, incluindo todos os tópicos e todos os agentes personalizados |
| Nível personalizado de agente | Agent Canvas → Agente personalizado → Manage Hooks, ou através da API REST v2 | Aplica-se apenas quando esse agente personalizado específico está a funcionar |
Ambos os níveis podem coexistir. Se um gancho ao nível de agente e um gancho ao nível de agente personalizado correspondem ao mesmo evento, ambos são executados. Os ganchos ao nível do agente disparam primeiro.
Tipos de execução
Podes implementar hooks usando um LLM ou um script shell:
| Tipo | Como funciona | Melhor para |
|---|---|---|
| Prompt | Um modelo de linguagem (LLM) avalia o seu pedido e devolve uma decisão em JSON | Validação nuançada ("Esta resposta está completa?") |
| Comando | Um script bash ou Python corre num ambiente sandbox | Verificações determinísticas, aplicação de políticas, auditoria |
Os ganchos de prompt são poderosos para avaliação subjetiva, como verificar se uma resposta aborda todas as preocupações dos utilizadores ou verificar se a investigação foi suficientemente minuciosa. Utilizam o marcador $ARGUMENTS para receber o contexto completo do hook. Se $ARGUMENTS não estiver presente no prompt, o contexto é adicionado automaticamente. Quando uma transcrição de conversa está disponível, os ganchos de prompt também têm acesso a ferramentas ReadFile e GrepSearch, que permitem ao LLM analisar o histórico completo da conversa.
Os ganchos de comando são melhores para verificações determinísticas, como validar que uma resposta contém marcadores necessários, bloquear comandos perigosos ou registar o uso de ferramentas num sistema externo.
O que torna esta abordagem diferente
A tabela seguinte compara o comportamento dos agentes com e sem ganchos.
| Sem ganchos | Com ganchos |
|---|---|
| O agente decide quando está "concluído" | Tu defines o que significa "feito" |
| O uso da ferramenta é invisível | Cada chamada de ferramenta pode ser auditada |
| Comandos perigosos prosseguem silenciosamente | A aplicação das políticas bloqueia-os automaticamente |
| A qualidade depende apenas da engenharia de prompts | Portas de qualidade automatizadas captam lacunas |
Os ganchos não substituem os controlos de segurança do modo de execução – eles complementam-nos. Os modos de execução controlam o que o agente pode fazer. Os ganchos controlam o desempenho e o que acontece com os resultados.
Antes e depois
| Scenario | Antes | Depois |
|---|---|---|
| Qualidade da resposta | O agente pára quando pensa que acabou | O seu gancho Stop valida a completude antes de a resposta chegar aos utilizadores |
| Visibilidade da ferramenta | Sem rasto de auditoria na execução da ferramenta | Os hooks do PostToolUse registam e verificam cada chamada de ferramenta |
| Aplicação de políticas | Comandos perigosos são executados sem verificação | Os scripts bloqueiam rm -rf, sudo e outros padrões arriscados automaticamente |
| Garantia de qualidade | A engenharia de prompts é a tua única alavanca | Os ganchos baseados em LLM avaliam a nuance; Os scripts aplicam regras determinísticas |
Configurar ganchos
A forma mais fácil de criar ganchos é através da interface do portal:
- Ganchos ao nível do agente: Vai a Builder → Hooks → seleciona Criar gancho.
- Ganchos ao nível de agente personalizado: Vá ao Agent Canvas → selecione um agente personalizado → Gerir Ganchos.
Sugestão
Também pode configurar hooks através da API REST v2 usando PUT /api/v2/extendedAgent/agents/{agentName}. O formato YAML na secção seguinte mostra o esquema de configuração completo. Para saber mais, consulte o tutorial da API.
O separador YAML do Agent Canvas mostra o formato v1 e não mostra ganchos. Use a página de Ganchos em Construtor para visualizar e gerir ganchos.
O exemplo seguinte mostra uma configuração completa do gancho:
api_version: azuresre.ai/v2
kind: ExtendedAgent
metadata:
name: my_hooked_agent
spec:
instructions: |
You are a helpful assistant.
handoffDescription: ""
enableVanillaMode: true
hooks:
Stop:
- type: prompt
prompt: |
Check if the response ends with "Task complete."
$ARGUMENTS
Respond with:
- {"ok": true} if it does
- {"ok": false, "reason": "End your response with 'Task complete.'"} if not
timeout: 30
PostToolUse:
- type: command
matcher: "Bash|ExecuteShellCommand"
timeout: 30
failMode: block
script: |
#!/usr/bin/env python3
import sys, json, re
context = json.load(sys.stdin)
command = context.get('tool_input', {}).get('command', '')
dangerous = [r'\brm\s+-rf\b', r'\bsudo\b', r'\bchmod\s+777\b']
for pattern in dangerous:
if re.search(pattern, command):
print(json.dumps({"decision": "block", "reason": f"Blocked: {pattern}"}))
sys.exit(0)
print(json.dumps({"decision": "allow"}))
Formato de resposta do gancho
Os ganchos têm de produzir JSON. São suportados dois formatos.
Formato simples (recomendado para ganchos de estímulo):
{"ok": true}
{"ok": false, "reason": "Please include more details."}
Formato expandido (recomendado para ganchos de comando):
{"decision": "allow"}
{"decision": "block", "reason": "Dangerous command detected."}
{"decision": "allow", "hookSpecificOutput": {"additionalContext": "Tool audit logged."}}
Os ganchos de comando também podem usar códigos de saída em vez de saída JSON:
| Código de saída | Comportamento |
|---|---|
0 sem saída |
Permitir (sem objeção) |
0 com JSON |
Analisar o JSON para decisão |
2 |
Bloqueia sempre. STDERR torna-se a razão |
| Outros | Usa failMode configuração (allow ou block) |
Atenção
Para ganchos Stop, uma rejeição sem motivo é tratada como aprovação, e o agente para normalmente. Fornece sempre um reason campo ao rejeitar.
Observação
Podes definir múltiplos ganchos para o mesmo evento. Para o PostToolUse, cada gancho com um padrão correspondente matcher executa de forma independente. Se múltiplos ganchos fornecerem additionalContext, o contexto do último gancho é injetado na conversa.
Referência de configuração
A tabela seguinte descreve todas as opções disponíveis de configuração de ganchos.
| Option | Tipo | Predefinição | Descrição |
|---|---|---|---|
type |
cadeia (de caracteres) | prompt |
prompt ou command |
prompt |
cadeia (de caracteres) | — | Texto de solicitação do LLM (obrigatório para ganchos de solicitação). Use $ARGUMENTS para injeção de contexto. |
command |
cadeia (de caracteres) | — | Comando shell em linha (para ganchos de comandos, mutuamente exclusivo com script). |
script |
cadeia (de caracteres) | — | Script de múltiplas linhas (para hooks de comando, que são mutuamente exclusivos com command). |
matcher |
cadeia (de caracteres) | — | Padrão regex para nomes de ferramentas (necessário para ganchos PostToolUse).
* Combina com todas as ferramentas. Os padrões são ancorados como ^(pattern)$ e adaptados de forma sensível ao caso. Vazio ou nulo não corresponde a nada. |
timeout |
int | 30 |
Timeout de execução em segundos (deve ser positivo; valores acima de 300 são sinalizados durante a validação da CLI). |
failMode |
cadeia (de caracteres) | allow |
Como lidar com erros de gancho: allow ou block. |
model |
cadeia (de caracteres) | ReasoningFast |
Modelo para ganchos de prompt (nome do cenário ou nome da implementação). |
maxRejections |
int |
3 (padrão do agente) |
Rejeições máximas antes de forçar a interrupção. Intervalo: 1–25. Aplica-se apenas a ganchos Stop do tipo prompt. Os ganchos Stop do tipo comando não têm limite implícito. Quando múltiplos ganchos de prompt especificam valores diferentes, utiliza-se o máximo. |
Esquema de contexto de gancho
Os ganchos recebem contexto JSON estruturado sobre o evento atual.
Os hooks de prompt recebem contexto através do espaço reservado $ARGUMENTS no texto do prompt.
Os hooks de comando recebem contexto como JSON em stdin.
Para ambos os tipos de hooks, o campo execution_summary contém um caminho de ficheiro para a transcrição da conversa (não conteúdo inline). Para ganchos em prompts, o LLM recebe ReadFile e GrepSearch como ferramentas para aceder a este ficheiro. Para ganchos de comando, o ficheiro está disponível no caminho especificado no sandbox.
Campos comuns
Todos os ganchos recebem os seguintes campos:
{
"hook_event_name": "Stop",
"agent_name": "my_agent",
"current_turn": 5,
"max_turns": 50,
"execution_summary": "/path/to/transcript.txt"
}
Campos de gancho para parar
Os ganchos de paragem recebem informações adicionais sobre a saída final do agente.
{
"final_output": "Here is my response...",
"stop_hook_active": false,
"stop_rejection_count": 0
}
PostToolUse campos de ganchos
Os ganchos PostToolUse recebem campos extra sobre a execução da ferramenta.
{
"tool_name": "ExecutePythonCode",
"tool_input": { "code": "print(2+2)" },
"tool_result": "4",
"tool_succeeded": true
}
Limits
Os seguintes limites aplicam-se aos ganchos de agente.
| Limit | Valor |
|---|---|
| Tamanho do guião | 64 KB máximo |
| Timeout | 1–300 segundos |
| Máximo de rejeições (ganchos de parada do prompt) | 1–25 (padrão: 3) |
| Scripts shebangs suportados |
#!/bin/bash, #!/usr/bin/env python3 |
| Ambiente de execução de scripts | Interpretador de código em ambiente isolado |
Exemplo: Auditar toda a utilização de ferramentas
O seguinte gancho PostToolUse regista todas as chamadas de ferramenta e adiciona uma mensagem de contexto de auditoria:
hooks:
PostToolUse:
- type: command
matcher: "*"
timeout: 30
failMode: allow
script: |
#!/usr/bin/env python3
import sys, json
context = json.load(sys.stdin)
tool_name = context.get('tool_name', 'unknown')
print(f"Tool used: {tool_name}", file=sys.stderr)
output = {
"decision": "allow",
"hookSpecificOutput": {
"additionalContext": f"[AUDIT] Tool '{tool_name}' was executed."
}
}
print(json.dumps(output))
O additionalContext campo é adicionado como uma mensagem do utilizador à conversa, dando ao agente visibilidade sobre o registo de auditoria.
Exemplo: Exigir um marcador de conclusão
O seguinte gancho Stop rejeita respostas que não terminam em "Tarefa concluída.":
hooks:
Stop:
- type: command
timeout: 30
failMode: allow
script: |
#!/bin/bash
CONTEXT=$(cat)
FINAL_OUTPUT=$(echo "$CONTEXT" | jq -r '.final_output // empty')
if [[ "$FINAL_OUTPUT" == *"Task complete."* ]]; then
exit 0
else
echo "Please end your response with 'Task complete.'" >&2
exit 2
fi
Melhores práticas
Siga estas orientações ao configurar ganchos de agente:
- Dê sempre uma razão ao rejeitar. Trate as rejeições sem motivos como aprovações.
- Configure timeouts adequados: Hooks de longa duração desaceleram a execução do agente.
-
Lidar com erros com elegância: Usar
failMode: allowa menos que seja exigida uma aplicação rigorosa. - Seja específico com os matchers: O uso excessivo dos matchers PostTool pode causar problemas de desempenho.
-
Testar exaustivamente os ganchos: Ganchos que sempre rejeitam podem causar loops (mitigados por
maxRejections). - Log to stderr: Utilize o stderr para a saída de depuração. O sistema analisa o stdout como o resultado do gancho.
Experimente você mesmo
A captura de ecrã seguinte mostra um gancho Stop em ação. O agente responde inicialmente apenas com "4", mas o refrão rejeita a resposta porque falta o marcador de conclusão. Em seguida, o agente continua e adiciona o marcador.
Introdução
| Recurso | O que você vai aprender |
|---|---|
| Configurar ganchos do agente (API) | Configurar hooks usando a API REST v2 e o YAML |
Conteúdo relacionado
| Capacidade | Como se relaciona |
|---|---|
| Modos de execução | Os ganchos complementam os controlos de segurança do modo de corrida. Os modos controlam o que executa, os ganchos controlam o desempenho disso. |
| Ferramentas Python | Crie ferramentas personalizadas que os hooks possam auditar e validar. |