🔀 OpenClaw 多模型路由与容灾策略

凌晨3点,当Claude挂了,你的Agent能自动切换到GPT吗?

"凌晨3点17分,Claude API突然返回503。

如果我的Agent只会傻等重试——那是我设计有问题。

真正的生产级Agent,应该像变色龙一样,环境变了,它自己就切换了。

多模型路由,就是Agent的变色能力。"

—— 妙趣AI,《Agent韧性设计》

🎯 为什么需要多模型路由?

3 AM Rule 的反面教材:
❌ 凌晨3点Claude API挂了 → Agent无限重试 → 任务失败
✅ 凌晨3点Claude API挂了 → 自动切换GPT-5 → 任务继续

结论:单一模型 = 单点故障。多模型路由 = 韧性系统。

🏗️ 路由架构

┌─────────────────────────────────────────────┐
│           OpenClaw Gateway                    │
│          模型路由器 (Model Router)               │
└──────────────┬────────────────────────────────┘
               │ 请求进来
               ▼
    ┌──────────────────────┐
    │  路由决策引擎         │
    │  - 成本最低优先       │
    │  - 性能最优优先       │
    │  - 特定任务指定       │
    └──────┬───────────────┘
           │
    ┌──────▼───────────────────────────┐
    │         模型池 (Model Pool)        │
    │  ┌─────────┐ ┌─────────┐        │
    │  │ Claude  │ │  GPT-5  │        │
    │  │ (主模型) │ │ (备用1) │        │
    │  └────┬────┘ └────┬────┘        │
    │       │            │              │
    │  ┌────▼────┐ ┌────▼────┐       │
    │  │DeepSeek │ │Gemini   │        │
    │  │ (备用2) │ │ (备用3) │        │
    │  └─────────┘ └─────────┘       │
    └──────┬──────────────────────────┘
           │ 如果主模型失败
           ▼
    ┌──────────────────────┐
    │   自动容灾 (Fallback) │
    │   按优先级自动切换    │
    └──────────────────────┘

🛠️ 配置多模型路由

Step 1: 配置多个Provider

# config.yaml
llm_providers:
  - name: anthropic-prod
    type: anthropic
    api_key: "${ANTHROPIC_KEY}"
    models:
      - claude-opus-4-7
      - claude-sonnet-4
    priority: 1
    timeout: 30

  - name: openai-prod
    type: openai
    api_key: "${OPENAI_KEY}"
    models:
      - gpt-5-turbo
      - gpt-55
    priority: 2
    timeout: 30

  - name: deepseek-prod
    type: deepseek
    api_key: "${DEEPSEEK_KEY}"
    models:
      - deepseek-v3
    priority: 3
    timeout: 30

  - name: gemini-prod
    type: google
    api_key: "${GEMINI_KEY}"
    models:
      - gemini-2.5-pro
    priority: 4
    timeout: 30

Step 2: 配置路由规则

model_routing:
  # 默认路由策略
  default:
    strategy: "priority"  # priority | cost | performance
    fallback_enabled: true
    max_retries: 3
    retry_delay: 5

  # 特定任务路由
  tasks:
    - pattern: "code.*"
      provider: "anthropic-prod"
      model: "claude-opus-4-7"
      fallback_providers:
        - "deepseek-prod"

    - pattern: "seo.*|content.*"
      provider: "openai-prod"
      model: "gpt-5-turbo"
      fallback_providers:
        - "gemini-prod"
        - "deepseek-prod"

    - pattern: ".*"
      provider: "anthropic-prod"
      fallback_providers:
        - "openai-prod"
        - "deepseek-prod"
        - "gemini-prod"

Step 3: 成本优化策略

cost_optimization:
  enabled: true
  max_cost_per_day: 50.0  # 每天最多花50美元
  strategy: "cheapest_until_fail"  # cheapest | round_robin
  
  # 成本阈值自动切换
  cost_thresholds:
    - limit: 10.0
      action: "switch_to"
      provider: "deepseek-prod"  # 超过10刀切换到便宜的
  
  # 含虾率保护(不为了省钱牺牲质量)
  shrimp_rate_floor: 70  # 含虾率低于70%不切换

💡 实战:凌晨3点容灾测试

3 AM Rule 验证: 模拟主模型故障,验证自动切换
# 在凌晨3点执行容灾测试
openclaw cron add \
  --name "3AM容灾测试" \
  --schedule "0 3 * * *" \
  --task "
    1. 临时禁用Claude API(模拟故障)
       export ANTHROPIC_API_KEY=invalid_key
    
    2. 执行RSS聚合任务
       openclaw task run rss-aggregation
    
    3. 验证是否自动切换到GPT-5
       grep 'Using fallback provider: openai-prod' /var/log/openclaw.log
    
    4. 恢复Claude API
       export ANTHROPIC_API_KEY=valid_key
    
    5. 验证是否自动切回
       grep 'Switching back to primary' /var/log/openclaw.log
  " \
  --notify-on-success feishu://group/oc_c942dfd09730eb94bf838c6519c115e9

📊 妙趣AI实际路由数据

模型 使用占比 平均响应时间 含虾率 成本/1k tokens
Claude Opus 4.7 60% 2.3s 82% $0.015
GPT-5 Turbo 25% 1.8s 79% $0.012
DeepSeek V3 10% 1.5s 75% $0.002
Gemini 2.5 Pro 5% 2.1s 76% $0.008

成本节省:通过智能路由,相比全部使用Claude节省约35%成本。

⚠️ 常见坑

⚠️ 坑1:切换后输出格式不兼容
不同模型的输出格式可能有差异
✅ 解决:使用结构化输出(JSON Mode),并在Fallback时验证格式

⚠️ 坑2:成本失控
自动切换后可能一直用贵的模型
✅ 解决:设置每日成本上限,超过后强制切换到便宜模型

⚠️ 坑3:含虾率下降
备用模型质量不如主模型
✅ 解决:设置含虾率底线,低于阈值即使贵也要切回主模型

🔗 相关组件