乐于分享
好东西不私藏

〖OpenClaw系列〗模型故障切换与多模型策略

〖OpenClaw系列〗模型故障切换与多模型策略

上篇回顾

〖OpenClaw系列〗模型配置完整指南

第11篇我们深入讲解了 OpenClaw 的模型配置体系:从 providers 配置到模型别名,从参数控制到多提供商接入。但生产环境充满不确定性——API 限流、服务过载、认证失效、网络超时——单一模型就像单点故障的命门。

本文将解决一个关键问题:当主模型不可用时,如何确保 AI 助手依然可用?


为什么需要 Fallback

单点故障的现实风险

故障场景
发生频率
影响程度
API 限流 (rate_limit)
请求被拒绝
服务过载 (overloaded)
响应缓慢或超时
认证过期 (auth)
全部请求失败
余额不足 (billing)
服务暂停
网络超时 (timeout)
连接中断
模型下线 (model_not_found)
配置失效

Fallback 的价值

无 Fallback:  主模型故障 → 服务完全中断 → 用户流失
有 Fallback:  主模型故障 → 自动切换备用 → 服务持续

核心收益

  • 高可用性:消除单点故障
  • 成本优化:优先使用高性价比模型,故障时降级
  • 用户体验:无感知切换,对话不中断
  • 灵活策略:按错误类型选择不同备用模型

多模型架构总览

后面所有配置和策略,都可以回到这张图上对照——每条 Fallback 路径都是图中的一条降级箭头。


Fallback 配置基础

基础配置结构

Fallback 在 OpenClaw 中通过 fallbacks 数组配置:

{
  agents: {
    defaults: {
      // 主模型 + 备用链
      model: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: [
          "anthropic/claude-sonnet-4-6",  // 第一备用:同厂商降级
          "openai/gpt-5.2",                // 第二备用:跨厂商
          "ollama/llama3.1"                // 最终备用:本地模型
        ]
      },
      // 允许使用的模型白名单
      models: {
        "anthropic/claude-opus-4-6": {},
        "anthropic/claude-sonnet-4-6": {},
        "openai/gpt-5.2": {},
        "ollama/llama3.1": {}
      }
    }
  }
}

配置验证

# 验证配置语法
openclaw config validate

# 查看解析后的模型链
openclaw config get agents.defaults.model

# 预期输出
# {
#   "primary": "anthropic/claude-opus-4-6",
#   "fallbacks": ["anthropic/claude-sonnet-4-6", "openai/gpt-5.2", "ollama/llama3.1"]
# }

故障检测机制

OpenClaw 的故障检测基于 FailoverReason 分类系统:

错误类型对照表

FailoverReason
HTTP 状态
触发场景
是否触发 Fallback
rate_limit
429
请求频率超限
overloaded
503
服务商过载
timeout
408
连接/请求超时
auth
401
认证失效
auth_permanent
403
永久禁止访问
billing
402
余额不足
model_not_found
404
模型不存在
format
400
请求格式错误
session_expired
410
会话过期
unknown
未知错误

把这 10 种错误按”流量类 / 认证类 / 请求类”分组,得到下面这棵决策树:

特殊处理:上下文溢出

// 来自源码 model-fallback.ts
if (isLikelyContextOverflowError(errMessage)) {
throw err;  // 上下文溢出不触发 Fallback
}

原因:上下文溢出是输入问题,切换模型无法解决(其他模型可能上下文更小)。

网络层错误识别

// 以下错误码自动识别为 timeout
[
"ETIMEDOUT""ESOCKETTIMEDOUT""ECONNRESET",
"ECONNABORTED""ECONNREFUSED""ENETUNREACH",
"EHOSTUNREACH""EHOSTDOWN""ENETRESET",
"EPIPE""EAI_AGAIN"
]

多层级 Fallback 策略

下面四种策略,本质都是同一张流程图的不同分支。先把这张图记在脑子里,后面再看每段 JSON 就不会迷路:

策略一:同厂商降级

{
  model: {
    primary: "anthropic/claude-opus-4-6",
    fallbacks: [
      "anthropic/claude-sonnet-4-6",   // 能力接近,成本更低
      "anthropic/claude-haiku-4-5"     // 快速响应
    ]
  }
}

优势

  • 保持一致的输出风格
  • 减少跨厂商兼容问题
  • API 格式完全一致

策略二:跨厂商备份

{
  model: {
    primary: "anthropic/claude-opus-4-6",
    fallbacks: [
      "openai/gpt-5.2",           // 跨厂商备份
      "google/gemini-2.5-pro"     // 第三选择
    ]
  }
}

优势

  • 规避单一厂商全局故障
  • 利用不同厂商的定价策略
  • 覆盖更多地域/网络环境

策略三:本地模型兜底

{
  model: {
    primary: "anthropic/claude-opus-4-6",
    fallbacks: [
      "openai/gpt-5.2",
      "ollama/llama3.1"           // 本地模型,零网络依赖
    ]
  }
}

优势

  • 完全离线可用
  • 数据隐私保障
  • 零外部 API 成本

三种策略并排对比,特点一目了然:


Cooldown 冷却机制

机制原理

当某个 provider 连续失败时,OpenClaw 会将其放入”冷却”状态,避免反复尝试无效的 provider:

请求 Primary (Anthropic) → 失败 (rate_limit)
   ↓
标记 Anthropic 进入 cooldown
   ↓
直接尝试 Fallback 1 (OpenAI)
   ↓
后续请求跳过 Anthropic,直到冷却结束

把上面这段文字流抽出来,就是下面这条时间轴:

图中底部的波动曲线表示该 provider 的可用性随时间变化:触发失败时陡降,进入 Cooldown 期间持续低位(被屏蔽),探测成功后回升至正常水平。

探测策略

// 来自源码 model-fallback.ts
const MIN_PROBE_INTERVAL_MS = 30_000;     // 最小探测间隔 30 秒
const PROBE_MARGIN_MS = 2 * 60 * 1000;      // 探测余量 2 分钟
const PROBE_STATE_TTL_MS = 24 * 60 * 60 * 1000;  // 状态保留 24 小时

探测规则

  1. 主模型:冷却即将结束前(2分钟内)尝试探测
  2. 备用模型:仅在 rate_limit/overloaded/unknown 时探测
  3. 认证/计费问题:跳过探测,直接切换

配置影响

{
  // 单 provider 配置(无 fallback)
  model: "anthropic/claude-opus-4-6"
  // 行为:即使 cooldown 也会持续重试,因为无其他选择

  // 多 provider 配置(有 fallback)
  model: {
    primary: "anthropic/claude-opus-4-6",
    fallbacks: ["openai/gpt-5.2"]
  }
  // 行为:Anthropic cooldown 期间优先使用 OpenAI
}

按 Agent 配置 Fallback

场景:不同 Agent 使用不同策略

{
  agents: {
    defaults: {
      model: {
        primary: "anthropic/claude-sonnet-4-6",
        fallbacks: ["openai/gpt-5.2"]
      }
    },
    list: [
      {
        id: "coding",
        name: "编程助手",
        model: {
          primary: "anthropic/claude-opus-4-6",
          fallbacks: [
            "anthropic/claude-sonnet-4-6",
            "openai/gpt-5.2"
          ]
        }
      },
      {
        id: "quick",
        name: "快速问答",
        model: {
          primary: "openai/gpt-5.2",
          fallbacks: ["ollama/llama3.1"]
        }
      }
    ]
  }
}

三个 Agent 三种 Fallback 链,一张图看完:

禁用 Fallback

{
  agents: {
    list: [
      {
        id: "strict",
        model: {
          primary: "anthropic/claude-opus-4-6",
          fallbacks: []  // 空数组 = 禁用 fallback
        }
      }
    ]
  }
}

图片模型的 Fallback

图片生成模型同样支持 Fallback:

{
  agents: {
    defaults: {
      imageModel: {
        primary: "openai/dall-e-3",
        fallbacks: [
          "stability/sd-xl",
          "ollama/stable-diffusion"
        ]
      }
    }
  }
}

区别:图片模型的 fallback 链独立配置,不与文本模型共享。


成本优化策略

智能降级策略

{
  agents: {
    defaults: {
      model: {
        // 默认使用性价比模型
        primary: "anthropic/claude-sonnet-4-6",
        // 高价值场景才使用旗舰模型
        fallbacks: ["anthropic/claude-opus-4-6"]
      }
    }
  }
}

运行时模型选择

# 高价值会话使用旗舰模型
openclaw chat --model "anthropic/claude-opus-4-6" --session-id important

# 普通会话使用默认配置
openclaw chat --session-id normal

踩坑

坑1:Fallback 链过长导致延迟

现象:用户反馈 AI 回复很慢,日志显示多次模型切换。

排查

# 查看详细日志
OPENCLAW_LOG_LEVEL=debug openclaw logs -f | grep fallback

# 预期输出
# [DEBUG] model-fallback: candidate_failed (attempt 1/4)
# [DEBUG] model-fallback: candidate_failed (attempt 2/4)
# [DEBUG] model-fallback: candidate_succeeded (attempt 3/4)

解决

{
  agents: {
    defaults: {
      model: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: [
          "anthropic/claude-sonnet-4-6"
          // 移除不可靠的备用,缩短链条
        ]
      }
    }
  }
}

坑2:模型白名单限制 Fallback

现象:配置了 fallback 但切换时提示 “model not allowed”。

原因agents.defaults.models 白名单未包含 fallback 模型。

解决

{
  agents: {
    defaults: {
      model: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: ["openai/gpt-5.2"]
      },
      models: {
        // 必须包含所有可能使用的模型
        "anthropic/claude-opus-4-6": {},
        "openai/gpt-5.2": {}  // 遗漏此项导致错误
      }
    }
  }
}

坑3:跨厂商切换导致输出风格不一致

现象:同一会话中,前面回复很详细,后面突然变简短。

原因:从 Claude 切换到 GPT 时,模型特性差异导致输出风格变化。

缓解

<!-- 在 SOUL.md 中强化风格定义 -->
## Output Style

无论使用何种模型,你必须:
保持回复长度一致(200-300字)
使用中文回复
包含至少一个具体例子

坑4:Cooldown 期间无法强制使用主模型

现象:明知主模型已恢复,但请求仍走 fallback。

解决:重启 Gateway 清除 cooldown 状态

openclaw gateway restart

或等待探测间隔(默认 30 秒)。


FAQ

Q1: Fallback 切换时用户能感知吗?

默认情况下无感知。但日志会记录:

[WARN] Model "anthropic/claude-opus-4-6" not found. 
       Fell back to "openai/gpt-5.2".

如需显式通知,可在客户端监听 fallbackNotice 事件(需自定义开发)。

Q2: 可以配置按错误类型选择 Fallback 吗?

目前不支持细粒度路由。但可通过以下方式间接实现:

{
  // 方案:为不同场景创建不同 Agent
  agents: {
    list: [
      {
        id: "rate-limit-agent",
        // 使用本地模型规避限流
        model: { primary: "ollama/llama3.1" }
      },
      {
        id: "quality-agent",
        // 优先保证质量
        model: {
          primary: "anthropic/claude-opus-4-6",
          fallbacks: ["openai/gpt-5.2"]
        }
      }
    ]
  }
}

Q3: 如何监控 Fallback 频率?

# 统计 fallback 次数
openclaw logs | grep -c "candidate_failed"

# 查看最近 fallback 记录
openclaw logs | grep "Fell back" | tail -20

Q4: Session 级别的模型覆盖会影响 Fallback 吗?

会。Session 指定的模型优先级最高:

Session 覆盖模型 > Agent 配置 > 全局默认值

但 fallback 链仍遵循配置层级:

// 来自源码 agent-scope.ts
exportfunctionresolveEffectiveModelFallbacks(params: {
  cfg: OpenClawConfig;
  agentId: string;
  hasSessionModelOverride: boolean;
}
): string[] | undefined
{
const agentFallbacksOverride = resolveAgentModelFallbacksOverride(params.cfg, params.agentId);
if (!params.hasSessionModelOverride) {
return agentFallbacksOverride;
  }
// Session 覆盖模型时,使用全局 fallback
const defaultFallbacks = resolveAgentModelFallbackValues(params.cfg.agents?.defaults?.model);
return agentFallbacksOverride ?? defaultFallbacks;
}

完整配置示例

生产环境推荐配置

{
  agents: {
    defaults: {
      model: {
        primary: "anthropic/claude-sonnet-4-6",
        fallbacks: [
          "anthropic/claude-opus-4-6",     // 同厂商升级(特殊场景)
          "openai/gpt-5.2",                 // 跨厂商备份
          "ollama/llama3.1"                 // 本地兜底
        ]
      },
      models: {
        "anthropic/claude-sonnet-4-6": {
          alias: "fast"
        },
        "anthropic/claude-opus-4-6": {
          alias: "power"
        },
        "openai/gpt-5.2": {
          alias: "backup"
        },
        "ollama/llama3.1": {
          alias: "local"
        }
      }
    }
  },
  models: {
    providers: {
      anthropic: {
        baseUrl: "https://api.anthropic.com",
        apiKey: "${ANTHROPIC_API_KEY}"
      },
      openai: {
        baseUrl: "https://api.openai.com",
        apiKey: "${OPENAI_API_KEY}"
      },
      ollama: {
        baseUrl: "http://localhost:11434"
      }
    }
  }
}

总结

本文深入讲解了 OpenClaw 的 Fallback 机制:

能力
要点
配置语法 model: { primary, fallbacks: [] }
故障检测
10 种 FailoverReason 自动分类
冷却机制
30s 探测间隔,避免无效重试
策略选择
同厂商降级 / 跨厂商备份 / 本地兜底
Agent 隔离
每个 Agent 可独立配置 fallback

关键认知:Fallback 不是简单的”备用”,而是一套完整的故障自愈系统——自动检测、智能切换、渐进恢复。


下一篇预告

第13篇:接入本地模型:Ollama/LM Studio

将 Fallback 链的最后一环落地:

  • Ollama 安装与模型下载
  • LM Studio 配置与 OpenClaw 集成

延伸阅读:Fallback 策略在生产环境中如何与监控告警联动?后面会有(高可用架构:多区域部署与故障转移)和(监控告警与 SRE 实践)。想了解不同模型在 OpenClaw 上的真实性能数据,(性能基准测试与优化指南)。

  • 本地模型的性能优化与资源管理
  • 纯离线环境的完整部署方案

本文是系列第12篇。你已掌握 OpenClaw 的高可用模型配置策略。


📌 觉得有用?点个「在看」 👇 👨‍💻 关注「敏叔侃技术」,每周更新 OpenClaw 实战干货 ⭐ 收藏这篇文章,作为生产环境 Fallback 配置的参考手册