Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Tips/Råd
Föredrar du portalgränssnittet? Nu kan du skapa och hantera krokar direkt i portalen utan att använda REST-API:et. Portalen innehåller ett visuellt formulär och en kodredigerare. Inga curl kommandon krävs.
I den här handledningen skapar du en anpassad agent med en stophook som tvingar agenten att infoga en kompletteringsmarkör för varje svar. Du konfigurerar kroken via REST-API:et och testar den sedan i portalens lekplats.
Uppskattad tid: 15 minuter
Anmärkning
Agentnivå jämfört med anpassade agentnivåkrokar: I den här självstudien skapas hooks på en anpassad agent (anpassade krokar på agentnivå). Dessa triggers utlöses bara när den specifika anpassade agenten körs.
Om du vill skapa krokar på agentnivå som gäller för hela agenten (alla trådar, alla anpassade agenter) använder du Builder>Hooks i portalen.
| Nivå | Så här skapar du | Scope |
|---|---|---|
| Agentnivå | Portal: Builder > Hooks | Gäller för alla trådar och anpassade agenter |
| Anpassad agentnivå | REST API (den här självstudien) eller Portal: Anpassad agent för agentarbetsyta >> – Hantera krokar | Gäller endast för en anpassad agent |
I den här tutorialen lär du dig följande:
- Skapa en anpassad agent med en stoppkrok med hjälp av REST-API:et
- Testa krokbeteende i portalens testmiljö
- Lägg till en PostToolUse hook för att granska verktygsanvändning
- Blockera farliga kommandon med en policiespärr
Förutsättningar
- En Azure SRE-agent i körningstillstånd
- curl för att anropa REST-API:et
-
Azure CLI loggade in (
az login) för att hämta en åtkomsttoken
Förstå hook-API-formatet
I den här självstudien används REST API v2 för att skapa hookar på en anpassad agent. Portalens YAML-redigerarflik visar v1-format och visar inte krokar som konfigurerats via API:et, men krokarna är fortfarande aktiva. Du kan verifiera dem på sidan Builder>Hooks eller testlekplatsen.
Tips/Råd
När du ska använda API:et jämfört med portalen:
- Portal (Builder > Hooks): Bäst för krokar på agentnivå i visuell form. Ingen kod krävs.
- API (den här självstudien): Bäst för hookar på anpassad agentnivå, CI/CD-pipelines eller programmatisk hantering.
Hitta agentens API-URL
Agentens API-bas-URL följer det här mönstret:
https://{agent-name}--{hash}.{hash}.{region}.azuresre.ai
Så här hittar du den:
- Öppna sre.azure.com och välj din agent.
- I det vänstra sidofältet väljer du Builder>Agent Canvas.
- Öppna webbläsarens utvecklarverktyg (F12 eller högerklicka på > Inspektera).
- Gå till fliken Nätverk , filtrera efter "api" och leta efter begäranden till en URL som slutar på
.azuresre.ai. - Bas-URL:en är allt före
/api/....
Du kan också kontrollera src attributet på fliken Element . Leta efter en <iframe> vars src börjar med https://{agent-name}--.
Hämta en åtkomsttoken
Kör följande kommando för att hämta en åtkomsttoken för SRE-agent-API:et:
TOKEN=$(az account get-access-token \
--resource <RESOURCE_ID> \
--query accessToken -o tsv)
Skapa en anpassad agent med en stoppkrok
Det här steget skapar en anpassad agent med namnet my_hooked_agent med en stoppkrok som kontrollerar om svaret slutar med === RESPONSE COMPLETE ===. Om markören saknas avvisar kroken svaret och uppmanar agenten att lägga till markören.
AGENT_URL="https://your-agent--xxxxxxxx.yyyyyyyy.region.azuresre.ai"
curl -X PUT "${AGENT_URL}/api/v2/extendedAgent/agents/my_hooked_agent" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d @- << 'EOF'
{
"name": "my_hooked_agent",
"properties": {
"instructions": "You are a helpful assistant. Be concise.",
"handoffDescription": "",
"handoffs": [],
"enableVanillaMode": true,
"hooks": {
"Stop": [
{
"type": "prompt",
"prompt": "Check the agent response below.\n\n$ARGUMENTS\n\nDoes it end with === RESPONSE COMPLETE ===?\nIf yes: {\"ok\": true}\nIf no: {\"ok\": false, \"reason\": \"Add === RESPONSE COMPLETE === at the end.\"}",
"timeout": 30
}
]
}
}
}
EOF
Du får HTTP 202 Godkänd med den fullständiga agentkonfigurationen i svarstexten.
I följande exempel visas samma konfiguration i YAML-format v2 som referens:
api_version: azuresre.ai/v2
kind: ExtendedAgent
metadata:
name: my_hooked_agent
spec:
instructions: |
You are a helpful assistant. Be concise.
handoffDescription: ""
enableVanillaMode: true
hooks:
Stop:
- type: prompt
prompt: |
Check the agent response below.
$ARGUMENTS
Does it end with === RESPONSE COMPLETE ===?
If yes: {"ok": true}
If no: {"ok": false, "reason": "Add === RESPONSE COMPLETE === at the end."}
timeout: 30
Så här fungerar stoppkroken
Stoppkroken utvärderar agentens svar innan det återgår till användaren:
- Ersätter
$ARGUMENTSmed hook-kontexten JSON, som inkluderar agentens slutliga svar. - LLM utvärderar prompten och returnerar
{"ok": true}eller{"ok": false, "reason": "..."}. - Om den avvisas fortsätter agenten att fungera efter att orsaken har matats in som ett användarmeddelande.
- Efter tre avslag (standardvärdet) stoppas agenten.
Testa kroken i portalen
Följ dessa steg för att testa stoppkroken:
Gå till agenten i portalen och välj Builder>Agent Canvas.
Välj alternativknappen Testa lekplats .
Välj listrutan Underagent/Verktyg , leta upp my_hooked_agent och välj Använd.
Skriv
What is 2+2?in chatten och välj Skicka.
Se vad som händer:
- Agenten svarar först med 4.
- Stoppkroken utvärderar och avvisar svaret (ingen kompletteringsmarkör).
- Ett steg i tankeprocessen visas där agenten fortsätter.
- Det slutliga svaret visas: 4 === RESPONSE COMPLETE ===.
Kroken fungerade. Det tvingade agenten att lägga till markören innan den stoppades.
Lägga till en PostToolAnvänd krok för granskning
Lägg till en PostToolUse hook som loggar vilket verktyg agenten använder. Uppdatera samma agent genom att skicka en ny PUT förfrågan inklusive båda hooks:
curl -X PUT "${AGENT_URL}/api/v2/extendedAgent/agents/my_hooked_agent" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d @- << 'EOF'
{
"name": "my_hooked_agent",
"properties": {
"instructions": "You are a helpful assistant. Be concise.",
"handoffDescription": "",
"handoffs": [],
"enableVanillaMode": true,
"hooks": {
"Stop": [
{
"type": "prompt",
"prompt": "Check the agent response below.\n\n$ARGUMENTS\n\nDoes it end with === RESPONSE COMPLETE ===?\nIf yes: {\"ok\": true}\nIf no: {\"ok\": false, \"reason\": \"Add === RESPONSE COMPLETE === at the end.\"}",
"timeout": 30
}
],
"PostToolUse": [
{
"type": "command",
"matcher": "*",
"timeout": 30,
"failMode": "allow",
"script": "#!/usr/bin/env python3\nimport sys, json\ncontext = json.load(sys.stdin)\ntool = context.get('tool_name', 'unknown')\nprint(json.dumps({'decision': 'allow', 'hookSpecificOutput': {'additionalContext': f'[AUDIT] {tool} executed.'}}))"
}
]
}
}
}
EOF
matcher: "*" betyder att denna hook körs för varje verktygsanrop. Skriptet loggar verktygsnamnet och matar in ett [AUDIT] meddelande i konversationen.
Om du vill testa kroken ställer du en fråga till agenten som utlöser ett verktyg (till exempel "Kör echo hello").
Blockera farliga kommandon
Lägg till en andra PostToolUse-hook som blockerar rm -rf, sudo, och chmod 777:
PostToolUse:
# Audit hook (runs for all tools)
- type: command
matcher: "*"
timeout: 30
failMode: allow
script: |
#!/usr/bin/env python3
import sys, json
context = json.load(sys.stdin)
tool = context.get('tool_name', 'unknown')
print(json.dumps({"decision": "allow",
"hookSpecificOutput": {"additionalContext": f"[AUDIT] {tool} executed."}}))
# Policy hook (only for shell tools)
- 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', '')
for pattern in [r'\brm\s+-rf\b', r'\bsudo\b', r'\bchmod\s+777\b']:
if re.search(pattern, command):
print(json.dumps({"decision": "block", "reason": f"Blocked: {pattern}"}))
sys.exit(0)
print(json.dumps({"decision": "allow"}))
Viktiga skillnader från revisionstillknytningen:
-
matcher: "Bash|ExecuteShellCommand"körs endast för shell-verktyg (mönstret är förankrat som^(Bash|ExecuteShellCommand)$). -
failMode: blockblockerar verktygets resultat om själva skriptet kraschar (strikt läge). - Returnerar
"block"med en orsak när ett farligt mönster hittas.
Hook-svarformat
Promptkrokar och kommandokrokar använder olika svarsformat.
Utlösarhakar för prompt
Prompt hooks returnerar enkel JSON:
{"ok": true}
{"ok": false, "reason": "Please fix X."}
Kommandokrokar
Kommandokrokar returnerar expanderad JSON:
{"decision": "allow"}
{"decision": "block", "reason": "Dangerous command."}
{"decision": "allow", "hookSpecificOutput": {"additionalContext": "Audit note."}}
Kommandokrokar kan också använda slutkoder i stället för JSON:
| Slutkod | Beteende |
|---|---|
0 utan utdata |
Tillåt |
0 med JSON |
Parsa JSON |
2 |
Blockera (stderr blir orsaken) |
| Other | Faller tillbaka till failMode |
Försiktighet
Ett avvisande utan orsak behandlas som godkännande. Inkludera reason alltid när du avvisar.
Kontrollera
När du har konfigurerat och testat krokarna bekräftar du följande villkor:
- Du konfigurerar anpassade krokar på agentnivå med hjälp av REST API v2. De gäller endast för den anpassade agenten.
- Du skapar krokar på agentnivå i Builder > Hooks. De gäller för hela agenten.
- Stoppkroken gör att agenten lägger till
=== RESPONSE COMPLETE ===-markören innan den stoppas. - PostToolUse audit hook loggar meddelanden för
[AUDIT]verktygsanrop. - Principkroken blockerar farliga kommandon som
rm -rfochsudo.
Felsökning
I följande tabell listas vanliga problem och lösningar för agent hooks.
| Problem | Lösning |
|---|---|
| Hooks visas inte på YAML-fliken i portalen | Förväntat – fliken YAML visar endast v1. Anpassade krokar på agentnivå som skapats via API:et är aktiva och synliga i Builder>Hooks eller på lekplatsen. |
Unsupported kind: ExtendedAgent |
Använd v2-slutpunkten: PUT /api/v2/extendedAgent/agents/{name}. |
Handoffs cannot be null |
Lägg till "handoffs": [] i JSON-payloaden. |
| Kroken har ingen effekt | Inkludera ett reason fält när du avvisar. Utan den behandlas avvisande som godkännande. |
| Agenten loopar för alltid | Lägre maxRejections (standard: 3, intervall: 1–25). |