Agent失败的常见原因

重试设计:指数退避

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]}"

幂等性保证

重试时要确保操作是幂等的(重复执行不产生副作用):

重试是必要的,但重试本身也要有边界:超过最大次数就应该优雅降级,而不是无限重试卡住整个流程。