Agent失败的常见原因
- 🔧 工具调用失败:API超时、网络错误、第三方服务不稳定
- 📄 输出格式错误:模型没有按要求输出JSON,解析失败
- ⏱️ 超时:任务执行时间超过限制
- 🚫 模型拒绝:内容过滤、安全限制导致模型拒绝回答
- 💰 API限流:请求频率超过提供商限制
重试设计:指数退避
import time, random
def retry_with_backoff(func, max_retries=3, base_delay=1.0):
for attempt in range(max_retries):
try:
return func()
except Exception as e:
if attempt == max_retries - 1:
raise # 最后一次失败,抛出异常
# 指数退避 + 随机抖动(避免雪崩)
delay = base_delay * (2 ** attempt) + random.uniform(0, 1)
print(f"第{attempt+1}次失败,{delay:.1f}秒后重试...")
time.sleep(delay)
# 使用示例
result = retry_with_backoff(
lambda: call_api("搜索AI新闻"),
max_retries=3,
base_delay=2.0
)Fallback:主模型失败切备用
def call_with_fallback(prompt, primary_model, fallback_model):
try:
return call_llm(prompt, model=primary_model)
except Exception as e:
print(f"主模型{primary_model}失败:{e},切换到{fallback_model}")
return call_llm(prompt, model=fallback_model)
# 示例
result = call_with_fallback(
prompt="分析这只股票...",
primary_model="claude-sonnet-4",
fallback_model="gpt-4o-mini"
)在Hermes中,fallback通过配置实现:
# config.yaml
fallback_providers:
- provider: custom:agentrouter
model: gpt-5.5降级策略:复杂任务 → 简单任务
def generate_report(data):
try:
# 先尝试完整报告(复杂)
return full_report(data)
except Exception:
try:
# 降级到简短摘要
return short_summary(data)
except Exception:
# 最终降级:直接返回原始数据
return f"数据采集成功,但报告生成失败:{data[:500]}"幂等性保证
重试时要确保操作是幂等的(重复执行不产生副作用):
- ✅ 读操作天然幂等(重复读取没问题)
- ⚠️ 写操作需要去重检查(用唯一ID判断是否已写入)
- ❌ 发送消息等操作需要检查是否已发送,避免重复发送
重试是必要的,但重试本身也要有边界:超过最大次数就应该优雅降级,而不是无限重试卡住整个流程。