该技能为 Strands harness 的工具调用提供拦截与审批机制,通过 interventions 参数配置。
用途
当需要让 agent 在执行危险工具前先询问人工、自动分类风险,或遵循 Cedar 策略时使用。与普通 hook 拦截不同,处理器返回带类型的决策:Proceed、Deny、Guide、Interrupt、Transform;注册表按优先级合并:Deny > Interrupt > Transform > Guide > Proceed。Deny 会截断后续链,Guide 会累积反馈,并共享审计日志。
主要能力
字符串语法是确定性的,不猜测内容(harness-py/src/strands_harness/interventions.py):
- "off" / None:无处理器
- "ask":HumanInTheLoop(ask=...),每次调用都询问人工
- "smart":HumanInTheLoop(classifier=True),由 LLM 分类风险,仅对标记的调用询问
- 以 .cedar 结尾的字符串:CedarAuthorization(policies=<file>),需 pip install 'strands-agents[cedar]'
- 其他字符串:作为风险分类器的文字提示
- InterventionHandler 实例:直接使用,不做转换
可叠加多个不同类别的层:
create_harness(interventions=["policies/tools.cedar", "smart"])
使用方式
通过 create_harness 的 interventions 参数传入上述值。错误行为示例(测量于 2026-09-28,rc 0):
create_harness(session=False, memory=False, interventions=["ask", "ask"])
ValueError: Two interventions share the handler name 'strands:human-in-the-loop' ...
create_harness(session=False, memory=False, interventions=123)
ValueError: Invalid interventions value 123; expected a preset name, ...
规则
- 两个同类型处理器会抛出异常(SDK 每个 name 只保留一个处理器);不同类别可组合(如 Cedar + 一个人工审批预设)。
- 内联编写的 Cedar 策略不会被自动识别(看起来像普通文本),需直接传 CedarAuthorization(policies=...)。
- 子代理继承父级的 interventions;programmatic_tool_caller 内部的工具调用同样经过 interventions,无法通过间接调用绕过。
- 将开销低的处理器放在前面(Cedar → 服务 → LLM),因为 Deny 会截断后续链。
- "ask" 在 ask=None 时使用 stdio;在 headless/CI 环境会阻塞等待输入,应传入回调或使用 interrupt/resume。
适用场景
需要人工审批危险工具调用、按风险自动分级审批、或按 Cedar 策略授权工具调用的 agent 工作流。
限制
同类型处理器重复会报错;内联 Cedar 策略需显式传入;"ask" 在无回调的 headless 环境会阻塞。