asyncdefguarded_call(fn, *a, **kw): cb.allow() try: r = await tool_call(fn, *a, **kw) cb.report(True) return r except Exception: cb.report(False) raise
要点:在不可用窗口直接拒绝调用,保护下游与自身线程/协程池。
4) 幂等与去重(Idempotency Key)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
import hashlib from typing importDict
_seen: Dict[str, float] = {}
defidem_key(name: str, payload: dict) -> str: raw = name + ":" + str(sorted(payload.items())) return hashlib.sha256(raw.encode()).hexdigest()
defguard_idempotent(name: str, payload: dict, ttl=300): k = idem_key(name, payload) now = time.time() if k in _seen and now - _seen[k] < ttl: raise RuntimeError("duplicated operation") _seen[k] = now return k
要点:对“可重入但有副作用”的外部操作,强制使用幂等键;重复触发直接短路或走校验流程。
5) 编排层集成(Plan-Act-Observe)
1 2 3 4 5 6 7 8 9 10
asyncdefrun_plan(steps): asyncwith cancellation_scope() as tasks: results = [] for s in steps: guard_idempotent(s["tool"], s["args"]) # 幂等 asyncdefonce(): returnawait guarded_call(s["func"], **s["args"]) # 熔断+超时 res = await retry_with_backoff(lambda: once()) # 有界重试 results.append(res) return results
要点:每步强制“幂等 → 熔断/超时 → 有界重试”,父任务结束必然触发取消,杜绝“孤儿子任务”。
五、验证与监控
A/B 发布 3 天:成功率 72%→97.8%,P95 延迟 9s→1.6s;
超时任务占比 <1.5%,卡死(>60s 无事件)清零;
监控项:
工具层:请求数、成功率、超时率、平均重试次数、熔断打开时长;
编排层:并发任务数、队列长度、取消次数、孤儿子任务计数;
告警:连续 5 分钟超时率 >2%,或熔断时间占比 >10%。
预防清单
所有工具调用强制 deadline,父任务必须传播取消;
重试有上限并带抖动;
高风险操作启用幂等键与“只增不减”的副作用设计;
预设熔断与降级路径(返回缓存/默认值、异步补偿);
可观测性前置:把调用参数/返回、耗时、异常类型纳入结构化日志,并支持回放。
总结
AI Agent 的可靠性来自“工程化的失败治理”:把不可控等待变成可控失败,把一次性操作变成可重试/可校验的流程。以上骨架无需侵入模型推理逻辑,即可显著提升稳定性,适合逐步在生产中落地。