Lab 22 學習導引與技術解析#
本 Lab 探討如何在執行期(Runtime)限制 Agent 對敏感/高風險工具(如刪除學生紀錄、更新學費)的操作,實施「權限最小化原則」與「動態安全攔截網」。
💡 核心學習重點#
1. 執行期工具攔截 (PreToolCallDecideHook)#
- 概念:在 Agent 推理思考出需要呼叫某個 Tool,但還沒有真正發送參數並執行該 Tool 之前,系統可以掛載攔截網對其進行審計。
- 實作技術:
繼承
PreToolCallDecideHook。在async def run(self, context, data)中,data為types.ToolCall對象。- 對於
delete_student_record操作,安全 Hook 回傳allow=False與詳細的拒絕原因(Permission Denied)。 - 對於
update_tuition_fee操作,安全 Hook 回傳allow=True(核准執行)。
- 對於
2. 最小權限與安全降級 (Graceful Fallback)#
- 概念:當 Agent 面臨安全網阻斷並回傳
Permission Denied時,它在 Thoughts 中能主動捕獲此異常,更新其心智模型,改為尋求替代的、符合權限的安全方案(在本 Lab 中為改調整新學費)。這展示了軟體工程級別的安全性與穩健性。
🛠️ 本地背景測試無阻塞設計 (HITL Terminal Prompt Bypass)#
- 工程痛點:
在 SDK 原生的
ToolConfirmationHook中,它是透過input("Allow execution? y/n")來讓人類進行確認(Human-in-the-loop, HITL)。 然而,在自動化 CI/CD、測試腳本、或是 Antigravity 的背景任務(Task Running)中,標準輸入是非互動式的,調用input()會直接引發EOFError或卡死程序。 - 解決方案:
我們在自訂的
StudioSecurityHook內部引入了「狀態機邏輯判定」,動態對特定高風險工具給予allow=False(拒絕)與allow=True(接受)的回應。這完美模擬了人機協同審核的兩種分支,又保證了背景自動化指令能無阻塞地流暢跑完。