先说结论:OpenClaw的模型服务层是支持限流和熔断的,而且不是靠外面再套一层网关实现的旁路方案,而是在模型路由和请求代理这一层内置了完整的流量治理能力。我一开始也没注意到这点,直到有一次把OpenClaw接到微信群里,一个用户连发了二十条消息,模型服务直接被多条并发请求打满,上游API开始报429,然后整个agent像死了一样不回复。后来翻了配置文档才反应过来:限流熔断的开关其实就在openclaw.json的gateway段落里,只是默认值比较保守,很多部署教程不会特意讲。
这篇文章我就围绕“OpenClaw模型服务限流和熔断到底怎么配”这件事,把架构位置、配置项含义、参数计算公式、验证方法、还有我踩过的坑一次性讲清楚。无论你是用Docker部署在Mac mini上,还是跑在云服务器甚至昇腾910B这种国产加速卡环境,只要模型服务是走OpenClaw的gateway出去的,这套配置思路都适用。
1. 搞清楚限流熔断在OpenClaw里的管段边界
很多人一听到“模型服务”就默认指的是vLLM、Ollama或者某个云端API,但OpenClaw里的“模型服务”是一个完整链路:IM平台回调 → Agent调度 → 模型路由 → 上游模型API/本地推理服务。限流和熔断并不在IM平台那一端,也不在上游模型那一端,而是在OpenClaw自己的gateway层——也就是所有模型请求汇聚、转发、路由出去的那一层。这个位置非常关键,因为它决定了限流和熔断能做到什么粒度。
1.1 Gateway层到底管了哪些请求场景
OpenClaw的gateway本质是一个兼容OpenAI协议的服务端点,它对外暴露/v1/chat/completions这类接口,同时内部负责把请求路由到你配置的各个provider。也就是说,不管你是通过微信、飞书、钉钉触发的对话,还是用OpenClaw二次开发平台通过API直接调用模型,请求都要先打到gateway,再由gateway转发给实际的模型服务商或本地推理引擎。
这个架构带来的直接影响是:限流熔断配置放在gateway层,就能同时覆盖所有接入渠道。你不用在微信适配器、飞书适配器里分别做流控,只要在gateway统一管控就行。另外,如果你在OpenClaw里配置了多个模型,比如主模型用DeepSeek,嵌入模型用本地的BGE系列,reranker用本地的交叉编码器,这些不同模型的请求也都会从gateway统一经过,所以限流策略可以按模型维度单独设置。
1.2 哪些情况不在这个配置的管辖范围
必须说清楚边界,否则你会白折腾。gateway层的限流熔断管的是OpenClaw主动发出去的模型请求,管不了两件事:
一是IM平台侧的回调限流。微信、飞书、钉钉这些平台对机器人消息回调本身有频率限制,如果不注意控制发送频率,被IM平台封禁或者风控,那不是OpenClaw限流能救的。二是上游模型API本身的配额限制。比如你买的某个API套餐是每分钟10万token,OpenClaw网关层面的QPS限制和这个TPM配额是两套体系,不能互相替代,双层都要计算。
本地部署的场景也类似。如果你在昇腾910B服务器上用vLLM启动embedding和reranker模型给OpenClaw用,vLLM进程本身的并发限制和显存瓶颈,和OpenClaw网关的限流策略也是两回事。网关限流更像是给vLLM前面加一道“减速带”,防止突发流量把推理引擎打挂。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 限流策略配置:从参数含义到计算逻辑
OpenClaw的限流配置我习惯把它看成三层:全局限额、按用户(API Key)限额、按模型限额。三层是叠加关系,请求同时命中多个限制时,任何一个先到阈值都会触发限流。这种设计不是随便做的,而是模型网关最常见的分层思路——全局保护进程不被打爆,按用户保护单个调用方不饿死别人,按模型保护某个后端服务不因单一模型流量过大而崩溃。
2.1 一份可直接落地的gateway限流配置示例
我目前生产环境用的限流配置长这样,字段名在1.2.x版本上验证过,如果你用的版本很新或很旧,建议先用openclaw config --schema看一下自己版本支持的字段。
json复制{
"gateway": {
"host": "0.0.0.0",
"port": 7376,
"apiKeys": ["sk-local-admin"],
"rateLimit": {
"enabled": true,
"global": {
"qps": 30,
"burst": 60
},
"perUser": {
"qps": 5,
"burst": 10
},
"perModel": {
"deepseek-chat": {
"qps": 15,
"burst": 30
},
