Enlaces de agente en Azure SRE Agent

Los hooks son puntos de control personalizados que interceptan y controlan el comportamiento del agente en momentos clave. Use enlaces para aplicar puertas de calidad en las respuestas del agente, auditar y controlar el uso de herramientas, bloquear operaciones peligrosas con la aplicación de directivas y evitar la finalización temprana de tareas mediante la validación de la salida del agente.

El problema.

El agente ejecuta tareas de forma autónoma, investigando incidentes, ejecutando herramientas y generando respuestas. Pero la autonomía sin supervisión crea riesgos:

  • Respuestas incompletas: el agente dice "listo" antes de abordar todo lo que solicitó.
  • Uso de herramientas no estudiados: no tiene visibilidad sobre qué herramientas llama el agente o qué resultados obtiene.
  • Sin aplicación de directivas: las operaciones peligrosas (comandos destructivos, cambios no autorizados) continúan sin control.
  • Brechas de calidad: las respuestas pierden información crítica porque no hay ningún paso de validación.

Necesita una manera de interceptar el comportamiento del agente en momentos clave sin ralentizarlo ni quitar completamente su autonomía.

Funcionamiento de los enlaces de agente

Los enlaces son puntos de control personalizados que se adjuntan a eventos específicos de un agente. Cuando se desencadena un evento, el enlace evalúa la situación y decide si se debe permitir o bloquear la acción.

Agent about to stop → Stop hook evaluates response → Allow or reject
Agent uses a tool   → PostToolUse hook checks result → Allow, block, or inject context

Actualmente se admiten dos eventos de enlace:

Event Se activa cuando Qué puede hacer
Parar El agente está a punto de devolver una respuesta final Validar la completitud, rechazar y obligar al agente a continuar
PostToolUse Una herramienta termina de ejecutarse correctamente Auditar el uso, bloquear los resultados, insertar contexto adicional

Dos niveles de ganchos

Los ganchos operan en dos niveles:

Level Dónde configurar Ámbito
Nivel de agente Generador → enlaces en el portal Se aplica a todo el agente, incluidos todos los subprocesos y todos los agentes personalizados.
Nivel de agente personalizado Agent Canvas → Agente personalizado → Administrar enlaces o a través de la API REST v2 Solo se aplica cuando se ejecuta ese agente personalizado específico.

Ambos niveles pueden coexistir. Si un enlace de nivel de agente y un enlace de nivel de agente personalizado coinciden con el mismo evento, ambos se ejecutan. Los enlaces de nivel de agente se activan primero.

Tipos de ejecución

Puede implementar ganchos mediante un LLM o un script de shell.

Tipo Cómo funciona Más adecuado para
Aviso Un LLM evalúa el mensaje y devuelve una decisión JSON. Validación matizada ("¿Está completa esta respuesta?")
Comando Un script de Bash o Python se ejecuta en un entorno de espacio aislado Comprobaciones deterministas, aplicación de directivas, auditoría

Los enlaces de solicitud son eficaces para la evaluación subjetiva, como comprobar si una respuesta aborda todos los problemas del usuario o comprueba que una investigación era lo suficientemente exhaustiva. Usan el marcador de posición $ARGUMENTS para recibir el contexto completo del hook. Si $ARGUMENTS no está presente en la indicación, el contexto se anexa automáticamente. Cuando hay una transcripción de la conversación disponible, los enlaces de solicitud también reciben herramientas ReadFile y GrepSearch, lo que permite al LLM razonar acerca del historial completo de la conversación.

Los enlaces de comandos son mejores para las comprobaciones deterministas, como validar que una respuesta contiene marcadores necesarios, bloquear comandos peligrosos o usar herramientas de registro en un sistema externo.

Lo que hace que este enfoque sea diferente

En la siguiente tabla se compara el comportamiento del agente con y sin ganchos.

Sin ganchos Con ganchos
El agente decide cuándo está "terminado" Tú defines lo que significa "hecho"
El uso de herramientas es invisible Todas las llamadas a herramientas se pueden auditar
Los comandos peligrosos continúan silenciosamente La aplicación de directivas las bloquea automáticamente
La calidad depende de la ingeniería de solicitudes por sí sola Puertas de calidad automatizadas detectan huecos

Los ganchos no reemplazan los controles de seguridad del modo de ejecución. Ellos los complementan. Los modos de ejecución controlan lo que el agente puede hacer. Los hooks controlan qué tan bien lo hace y lo que sucede con los resultados.

Antes y después

Escenario antes de después de
Calidad de respuesta El agente se detiene cuando cree que ha terminado El gancho Stop valida la completitud antes de que la respuesta llegue a los usuarios.
Visibilidad de herramientas No hay registro de auditoría de la ejecución de herramientas Los enlaces PostToolUse registran y verifican cada llamada a una herramienta
Aplicación de directivas Los comandos peligrosos se ejecutan sin supervisión Los scripts bloquean rm -rf, sudoy otros patrones de riesgo automáticamente
Control de calidad La ingeniería de solicitudes es su única herramienta Los ganchos basados en LLM evalúan matices; los scripts imponen reglas deterministas

Configuración de enlaces

La manera más fácil de crear enlaces es a través de la interfaz de usuario del portal:

  1. Enlaces de nivel de agente: Vaya a GeneradorEnlaces → seleccione Crear enlace.
  2. Ganchos de nivel de agente personalizados: Ir a Lienzo del agente → seleccione un agente personalizado → Administrar ganchos.

Sugerencia

También puede configurar enlaces a través de la API REST v2 mediante PUT /api/v2/extendedAgent/agents/{agentName}. El formato YAML de la sección siguiente muestra el esquema de configuración completo. Para más información, consulte el tutorial de API.

La pestaña YAML del Lienzo del agente muestra el formato v1 y no incluye enlaces. Use la página Enlaces en Generador para ver y administrar enlaces.

En el ejemplo siguiente se muestra una configuración de enlace completa:

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 respuesta del enlace

Los enlaces deben generar JSON. Se admiten dos formatos.

Formato simple (recomendado para enlaces de solicitud):

{"ok": true}
{"ok": false, "reason": "Please include more details."}

Formato expandido (recomendado para enlaces de comandos):

{"decision": "allow"}
{"decision": "block", "reason": "Dangerous command detected."}
{"decision": "allow", "hookSpecificOutput": {"additionalContext": "Tool audit logged."}}

Los enlaces de comandos también pueden usar códigos de salida en lugar de la salida JSON:

Código de salida Comportamiento
0 sin salida Permitir (sin objeción)
0 con JSON Análisis de JSON para la decisión
2 Bloquea siempre. stderr se convierte en la causa
Otros Usa la configuración failMode (allow o block)

Precaución

En el caso de los enlaces de detención, un rechazo sin motivo se trata como aprobación y el agente se detiene normalmente. Proporcione siempre un reason campo al rechazar.

Nota:

Puede definir varios ganchos para el mismo evento. Para PostToolUse, cada gancho con un patrón coincidente matcher se ejecuta de manera independiente. Si varios hooks proporcionan additionalContext, el contexto del último hook se inserta en la conversación.

Referencia de configuración

En la tabla siguiente se describen todas las opciones de configuración de enlace disponibles.

Opción Tipo Predeterminado Descripción
type cuerda / cadena prompt prompt o command
prompt cuerda / cadena Texto de la solicitud del LLM (necesario para los enlaces de solicitud). Se usa $ARGUMENTS para la inyección de contexto.
command cuerda / cadena Comando de shell insertado (para enlaces de comandos, mutuamente excluyente con script).
script cuerda / cadena Script de varias líneas (para enlaces de comandos, mutuamente excluyente con command).
matcher cuerda / cadena Patrón regex para los nombres de herramientas (necesario para los ganchos de PostToolUse). * es compatible con todas las herramientas. Los patrones se anclan como ^(pattern)$ y coinciden teniendo en cuenta las mayúsculas y minúsculas. Vacío o nulo no coincide con nada.
timeout int 30 Tiempo de espera de ejecución en segundos (debe ser positivo; los valores superiores a 300 se marcan durante la validación de la CLI).
failMode cuerda / cadena allow Cómo controlar errores de enlace: allow o block.
model cuerda / cadena ReasoningFast Modelo para enlaces de solicitud (nombre de escenario o nombre de implementación).
maxRejections int 3 (valor predeterminado del agente) Número máximo de rechazos antes de forzar la detención. Intervalo: 1–25. Se aplica únicamente a los enlaces de detención de tipo de solicitud. Los enlaces de detención de tipo de comando no tienen límite implícito. Cuando varios enlaces de solicitud especifican valores diferentes, se usa el máximo.

Esquema de contexto del enlace

Los enlaces reciben contexto JSON estructurado sobre el evento actual. Los enlaces de solicitud reciben contexto a través del marcador de posición $ARGUMENTS en el texto de la solicitud. Los enlaces de comandos reciben contexto como JSON en stdin.

Para ambos tipos de enlace, el campo execution_summary contiene una ruta de acceso de archivo a la transcripción de conversación (no contenido insertado). Para los enlaces de solicitud, el LLM obtiene las herramientas ReadFile y GrepSearch para acceder a este archivo. Para los enlaces de comandos, el archivo está disponible en la ruta de acceso especificada en el espacio aislado.

Campos comunes

Todos los ganchos reciben los siguientes campos:

{
  "hook_event_name": "Stop",
  "agent_name": "my_agent",
  "current_turn": 5,
  "max_turns": 50,
  "execution_summary": "/path/to/transcript.txt"
}

Campos de enlace de detención

Los enlaces de detención reciben campos adicionales referentes a la salida final del agente.

{
  "final_output": "Here is my response...",
  "stop_hook_active": false,
  "stop_rejection_count": 0
}

Campos de enlace PostToolUse

Los ganchos de PostToolUse reciben campos adicionales sobre la ejecución de la herramienta.

{
  "tool_name": "ExecutePythonCode",
  "tool_input": { "code": "print(2+2)" },
  "tool_result": "4",
  "tool_succeeded": true
}

Límites

Los siguientes límites se aplican a los enlaces del agente.

Limit Importancia
Tamaño del script Máximo de 64 KB
Tiempo de espera De 1 a 300 segundos
Máximo de rechazos (enlaces de detención de solicitud) 1–25 (valor predeterminado: 3)
Shebangs de script admitidos #!/bin/bash, #!/usr/bin/env python3
Entorno de ejecución de scripts Intérprete de código aislado

Ejemplo: Auditar todo el uso de herramientas

El siguiente enlace PostToolUse registra cada llamada de herramienta y agrega un mensaje de contexto de auditoría:

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))

El additionalContext campo se agrega como mensaje de usuario a la conversación, lo que proporciona al agente visibilidad de la pista de auditoría.

Ejemplo: Requerir un marcador de finalización

El siguiente gancho Stop rechaza las respuestas que no terminan con "Task complete."

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

procedimientos recomendados

Siga estas instrucciones al configurar enlaces de agente:

  1. Proporcione siempre un motivo al rechazar. Trate los rechazos sin razones como aprobaciones.
  2. Usar tiempos de espera adecuados: los enlaces de larga duración ralentizan la ejecución del agente.
  3. Controlar los errores de manera correcta: use failMode: allow a menos que se requiera una aplicación estricta.
  4. Ser específico con los emparejadores: los emparejadores de postToolUse demasiado amplios pueden causar problemas de rendimiento.
  5. Probar los enlaces exhaustivamente: los enlaces que siempre rechazan pueden provocar bucles (mitigados por maxRejections).
  6. Registrar en stderr: use stderr para la salida de depuración. El sistema analiza sintácticamente stdout como el resultado del enlace.

Pruebe por sí mismo

En la captura de pantalla siguiente se muestra un gancho de detención en acción. El agente responde inicialmente con solo "4", pero el enlace rechaza la respuesta porque falta el marcador de finalización. A continuación, el agente continúa y agrega el marcador.

Captura de pantalla que muestra un enlace de detención en acción donde la respuesta del agente está decorada con un marcador de finalización después del rechazo del enlace.

Empieza ahora

Recurso Qué aprenderá:
Configuración de enlaces de agente (API) Configuración de enlaces mediante la API REST v2 y YAML
Capacidad Cómo se relaciona
Modos de ejecución Los enlaces complementan los controles de seguridad del modo de ejecución. Los modos controlan qué se ejecuta, los enlaces controlan cómo se ejecuta.
Herramientas de Python ** Cree herramientas personalizadas que los hooks puedan auditar y validar.