OpenClaw模型配置全解析:从openclaw.json到生产级回退链
1. OpenClaw不是黑盒:为什么必须手动添加非官方LLM模型
OpenClaw作为一款面向开发者与技术决策者的LLM应用编排平台,其设计哲学从一开始就拒绝“开箱即用”的幻觉。它不预装GPT-4、Claude-3或Qwen-Max这类商业闭源模型的调用凭证,也不内置Llama-3-70B-Instruct、DeepSeek-V2.5等主流开源大模型的完整推理服务——它只提供一个可插拔的模型抽象层。这个抽象层的核心载体,就是那个被高频搜索却极少被真正读懂的文件:openclaw.json。
你在网上搜到的“OpenClaw安装教程”“OpenClaw本地部署工具”“OpenClaw配置”等热词,90%都止步于docker run -p 8080:8080 openclaw/openclaw这行命令。但真正决定OpenClaw能力边界的,从来不是容器镜像版本号,而是你亲手编辑的那几百行JSON。当你的业务需要接入内部微调的Qwen2-7B-Chat(部署在10.10.20.5:8001)、或是私有化部署的Phi-3-mini-128K(运行在k8s servicephi3-inference.svc.cluster.local:8080),又或是想让OpenClaw在公网API不可用时自动回退到本地Ollama实例——这些需求,官方列表里永远不会有答案。
我第一次遇到这个问题,是在给某省级政务知识库做POC时。客户明确要求所有LLM调用必须100%走内网,且模型需满足信创适配清单。我翻遍了OpenClaw GitHub Wiki、Discord频道和所有中文社区帖子,得到的回复清一色是:“请等待官方支持”。等了三周,连个RFC提案都没看到。最后我打开openclaw.json,对照着/usr/local/share/openclaw/schemas/model-config.schema.json,花了不到两小时就完成了qwen2-7b-intranet和phi3-mini-intranet两个自定义模型配置。上线后,模型响应延迟比调用公有云API低42%,且完全规避了数据出境审计风险。
这不是什么高深技巧,而是OpenClaw架构设计的必然结果:它把模型注册、路由、重试、回退、指标上报全部解耦为配置驱动。openclaw.json不是“设置文件”,它是OpenClaw的模型服务注册中心,是整个LLM工作流的控制平面入口。理解这一点,才能真正掌握OpenClaw的扩展性本质。
提示:不要被“官方列表”这个词迷惑。OpenClaw官方列表(通常位于
/app/config/models/default.json)仅用于演示和快速启动,它不参与生产环境的模型调度决策。所有生产级模型配置,必须通过openclaw.json显式声明。
2. 模型配置的四层结构:从协议到元数据的完整映射
OpenClaw对LLM的抽象并非简单封装API URL,而是构建了一个四层语义模型。每一层都对应openclaw.json中一个关键字段,缺失任一层,模型都无法被正确识别、调度或监控。我将这四层称为“协议层→连接层→能力层→策略层”,它们共同构成一个LLM服务的完整数字孪生。
2.1 协议层:决定OpenClaw如何与模型“对话”
这是最基础也最容易出错的一层。OpenClaw目前原生支持三种协议:
- OpenAI兼容协议(
protocol: "openai"):适用于vLLM、Ollama、Text Generation Inference(TGI)、FastChat等主流推理框架。它要求模型端点返回标准OpenAI格式的/v1/chat/completions响应。 - Anthropic兼容协议(
protocol: "anthropic"):专为Claude系列模型设计,需处理x-api-key认证头和/v1/messages路径。 - 自定义HTTP协议(
protocol: "http"):适用于任何能返回JSON格式响应的私有API,但必须配合response_mapping字段手动定义字段提取逻辑。
很多人卡在第一步,是因为误以为“只要URL能curl通就行”。实测发现,一个部署在Nginx反向代理后的vLLM服务,如果Nginx未正确透传Content-Type: application/json头,OpenClaw会直接报invalid response format错误,而非网络超时。这是因为OpenClaw在协议层做了严格的MIME类型校验。
{ "name": "qwen2-7b-intranet", "protocol": "openai", "endpoint": "http://10.10.20.5:8001/v1" }注意:
endpoint字段值必须以/v1结尾(对OpenAI协议),且不能包含/chat/completions。OpenClaw会自动拼接完整路径。若填成http://10.10.20.5:8001/v1/chat/completions,会导致404。
2.2 连接层:解决网络可达性与安全认证
协议确定后,OpenClaw需要知道“怎么连上它”。这一层由auth、timeout、tls三个子字段构成:
auth支持api_key(明文)、bearer_token(JWT)、basic_auth(Base64编码)三种方式。对于企业级部署,我强烈建议使用basic_auth,因为它的凭证可由OpenClaw的Secret Manager统一管理,避免在配置文件中硬编码敏感信息。timeout不是单一数值,而是对象:{"connect": 5000, "read": 30000, "write": 30000},单位毫秒。很多用户抱怨“OpenClaw为什么会延迟”,根源常在此——他们把read超时设为5000ms,而实际模型生成需要8秒,导致OpenClaw反复重试。tls字段控制SSL验证行为。内网部署时,若使用自签名证书,必须设为{"verify": false},否则连接直接失败。但切记:此配置仅限内网,公网环境必须设为true。
{ "auth": { "type": "basic_auth", "username": "claw-service", "password": "secret-123" }, "timeout": { "connect": 3000, "read": 60000, "write": 60000 }, "tls": { "verify": false } }2.3 能力层:告诉OpenClaw“这个模型能做什么”
这是区分“能连上”和“能用好”的关键。OpenClaw通过capabilities字段声明模型的实际能力边界,包括:
max_context_length:模型最大上下文长度(如Qwen2-7B为131072,Phi-3-mini为128K)。OpenClaw据此决定是否截断过长输入。max_output_tokens:单次响应最大token数。若设为null,OpenClaw将使用默认值(通常为2048),可能导致长文本生成被意外截断。supports_streaming:是否支持SSE流式响应。若模型支持但未声明为true,OpenClaw将禁用流式输出,影响用户体验。input_token_cost/output_token_cost:用于成本核算。即使不启用计费功能,也建议填写合理估值(如Qwen2-7B按0.0001元/千token估算),这对后续资源调度至关重要。
{ "capabilities": { "max_context_length": 131072, "max_output_tokens": 8192, "supports_streaming": true, "input_token_cost": 0.0001, "output_token_cost": 0.0002 } }2.4 策略层:定义模型在复杂场景下的行为逻辑
这才是OpenClaw真正体现“智能编排”价值的地方。strategy字段决定了模型如何融入整体工作流:
fallback_to:模型回退链的核心。可指定一个或多个备用模型名(如["phi3-mini-intranet", "ollama-qwen2-7b"])。当主模型超时或返回错误码时,OpenClaw会按顺序尝试回退,而非直接报错。retry_policy:精细化重试控制。max_retries: 2是基础,但更重要的是backoff_factor: 1.5(指数退避)和retry_on_status_codes: [429, 503, 504](仅对特定HTTP状态码重试)。load_balancing:当同一模型有多个实例时(如K8s Deployment的3个Pod),可配置round_robin或least_connections策略。我们实测发现,在高并发场景下,least_connections比round_robin降低平均延迟23%。
{ "strategy": { "fallback_to": ["phi3-mini-intranet", "ollama-qwen2-7b"], "retry_policy": { "max_retries": 2, "backoff_factor": 1.5, "retry_on_status_codes": [429, 503, 504] }, "load_balancing": "least_connections" } }这四层结构不是并列关系,而是严格依赖的栈式结构。协议层错误,连接层无意义;连接层不通,能力层无法探测;能力层缺失,策略层无法生效。我在调试一个客户环境时,发现模型始终无法触发回退,最终定位到是capabilities.max_context_length未设置,导致OpenClaw在初始化阶段就将该模型标记为“不可用”,自然跳过了所有策略逻辑。
3. 模型回退链的实战设计:从故障隔离到体验兜底
“模型回退”在OpenClaw文档中常被简化为fallback_to字段的配置示例,但真实生产环境中的回退设计,是一门融合了SRE原则、用户体验心理学和成本控制的综合艺术。我见过太多团队把回退链做成“GPT-4 → Claude-3 → Llama-3”,结果在GPT-4限流时,所有流量瞬间涌向Claude-3,导致其API Key被封禁——这不是回退,这是雪崩。
3.1 回退链的本质:故障域隔离与能力降级
一个健壮的回退链,首要目标不是“总有一个模型能用”,而是“当A故障时,B能接管且不放大故障”。这意味着回退链上的每个模型,必须部署在独立的基础设施故障域中。例如:
- 主模型:
qwen2-7b-intranet(部署在客户IDC的GPU服务器集群) - 第一回退:
phi3-mini-intranet(部署在同一IDC的CPU服务器集群,与GPU集群物理隔离) - 第二回退:
ollama-qwen2-7b(部署在本地开发机,仅用于紧急兜底)
这个设计确保:GPU集群断电,不影响CPU集群;IDC网络中断,不影响本地机。而如果把两个回退都设为不同厂商的公有云API,一旦该厂商区域发生故障,回退链就彻底失效。
更关键的是能力降级。回退不是简单切换,而是主动接受质量妥协。比如,主模型支持128K上下文和函数调用,第一回退仅支持32K上下文但支持函数调用,第二回退仅支持8K上下文且不支持函数调用。OpenClaw会根据当前激活的模型,动态调整请求体——当回退到第二模型时,自动截断历史消息、移除tools字段。这需要你在openclaw.json中为每个模型精确声明其capabilities,否则OpenClaw无法做出正确决策。
3.2 回退触发的七种真实场景与配置对策
回退不是只在“504 Gateway Timeout”时才发生。根据我们监控的200+个OpenClaw生产实例,回退触发原因分布如下:
| 触发场景 | 占比 | OpenClaw配置要点 | 实操经验 |
|---|---|---|---|
| 网络层超时(TCP连接失败/握手超时) | 38% | timeout.connect必须小于基础设施健康检查间隔(如K8s readiness probe) | 我们将connect设为3000ms,而K8s probe设为5000ms,确保OpenClaw先感知故障 |
| 协议层错误(401/403认证失败) | 12% | auth配置需与模型服务端严格一致;建议在auth中增加"refresh_interval": "24h"自动轮换密钥 | 曾因模型服务端密钥轮换,导致OpenClaw持续401达2小时 |
| 应用层错误(429速率限制/503服务繁忙) | 25% | retry_policy.retry_on_status_codes必须包含429和503;backoff_factor设为1.8以上 | backoff_factor: 1.5在429场景下重试过于激进,易加剧限流 |
| 响应格式错误(非JSON/字段缺失) | 9% | 使用protocol: "http"+response_mapping自定义解析;或升级模型服务端至标准协议 | 遇到过某定制模型返回{data: {...}}而非标准OpenAI格式,必须用response_mapping |
| 内容安全拦截(400含敏感词) | 8% | 在strategy中配置"content_safety_fallback": true,启用OpenClaw内置安全过滤器 | 此功能需提前在openclaw.json全局security块中启用 |
模型输出空(200但choices[0].message.content为空) | 5% | 设置"empty_response_fallback": true,并确保回退模型capabilities.supports_streaming为false(避免流式空响应) | 流式模型空响应检测逻辑不同,需单独配置 |
| 自定义健康检查失败(/healthz返回非200) | 3% | 在health_check字段中定义path、method、expected_status | 建议为每个模型部署独立的/healthz端点,返回模型加载状态 |
提示:OpenClaw的回退是逐请求(per-request)而非逐会话(per-session)。这意味着同一个用户连续两次提问,可能第一次走主模型,第二次因主模型临时过载而回退到备用模型。这是设计使然,确保每次请求都获得当时最优资源。
3.3 回退链的可观测性:如何证明它真的有效
配置完回退链,90%的团队就认为万事大吉。但真正的工程实践要求你用数据验证。OpenClaw提供了三层可观测性支撑:
日志层:在
openclaw.json的logging块中,开启"model_fallback_events": true。每次回退都会记录类似:INFO model-router: fallback triggered for qwen2-7b-intranet -> phi3-mini-intranet, reason=timeout_read, duration_ms=32400指标层:OpenClaw暴露Prometheus指标
openclaw_model_fallback_total{model="qwen2-7b-intranet",fallback_to="phi3-mini-intranet"}。我们用Grafana搭建了回退率看板,当qwen2-7b-intranet的回退率超过5%,立即触发告警。追踪层:在Jaeger中,每个请求的Span会标注
model_used标签。你可以轻松查询“所有回退到phi3-mini-intranet的请求”,分析其输入特征(如平均上下文长度、是否含代码块),进而优化回退策略。
我曾帮一个金融客户优化回退链。初始配置是qwen2-7b-intranet→ollama-qwen2-7b,但监控显示回退率高达18%。深入追踪发现,92%的回退请求都含SQL代码块,而ollama-qwen2-7b在本地CPU上执行SQL生成耗时超30秒。于是我们将第二回退改为phi3-mini-intranet(专为代码生成优化),回退率降至1.2%,且平均响应时间下降67%。
4. 从零开始:手把手完成一个私有Qwen2-7B模型的全链路接入
理论讲完,现在进入最硬核的实操环节。我将以一个真实案例——将客户IDC内网部署的Qwen2-7B-Chat模型接入OpenClaw,并配置双回退链——为例,带你走完从环境准备到线上验证的每一步。所有命令、配置、参数均来自我们已上线的生产环境,非Demo模拟。
4.1 前置条件检查:确认模型服务已就绪
在编辑openclaw.json前,必须确保Qwen2-7B服务本身符合OpenClaw要求。我们使用vLLM 0.6.3部署,启动命令如下:
# 启动vLLM服务(关键参数说明见后) python -m vllm.entrypoints.openai.api_server \ --model Qwen/Qwen2-7B-Instruct \ --tensor-parallel-size 2 \ --gpu-memory-utilization 0.9 \ --max-model-len 131072 \ --port 8001 \ --host 0.0.0.0 \ --enable-chunked-prefill \ --disable-log-requests \ --trust-remote-code关键参数解读:
--max-model-len 131072:必须与openclaw.json中capabilities.max_context_length严格一致,否则OpenClaw会拒绝调度。--enable-chunked-prefill:启用分块预填充,对长上下文(>32K)性能提升显著,实测在128K上下文下,首token延迟降低58%。--trust-remote-code:Qwen2模型需此参数,否则vLLM加载失败。
验证服务可用性:
# 测试基础连通性 curl -X GET http://10.10.20.5:8001/health # 测试OpenAI兼容性(标准请求体) curl -X POST http://10.10.20.5:8001/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen/Qwen2-7B-Instruct", "messages": [{"role": "user", "content": "你好"}], "temperature": 0.1 }'注意:vLLM的
/health端点返回{"healthy": true},而OpenClaw的健康检查默认期望{"status": "ok"}。因此,我们必须在openclaw.json中自定义健康检查路径。
4.2 编写openclaw.json:逐字段配置详解
以下是一个完整的、可直接部署的qwen2-7b-intranet配置。我将逐字段解释其设计意图:
{ "models": [ { "name": "qwen2-7b-intranet", "display_name": "Qwen2-7B 内网版", "description": "IDC GPU集群部署,支持128K上下文与函数调用", "protocol": "openai", "endpoint": "http://10.10.20.5:8001/v1", "auth": { "type": "api_key", "api_key": "sk-qwen2-intranet-1234567890abcdef" }, "timeout": { "connect": 3000, "read": 120000, "write": 120000 }, "tls": { "verify": false }, "health_check": { "path": "/health", "method": "GET", "expected_status": 200, "timeout_ms": 2000 }, "capabilities": { "max_context_length": 131072, "max_output_tokens": 8192, "supports_streaming": true, "input_token_cost": 0.0001, "output_token_cost": 0.0002, "supports_function_calling": true }, "strategy": { "fallback_to": ["phi3-mini-intranet", "ollama-qwen2-7b"], "retry_policy": { "max_retries": 1, "backoff_factor": 2.0, "retry_on_status_codes": [429, 503, 504] }, "load_balancing": "least_connections" } }, { "name": "phi3-mini-intranet", "display_name": "Phi-3-mini 内网版", "description": "IDC CPU集群部署,轻量级代码生成专用", "protocol": "openai", "endpoint": "http://10.10.20.6:8002/v1", "auth": { "type": "basic_auth", "username": "phi3-service", "password": "phi3-secret-123" }, "timeout": { "connect": 5000, "read": 60000, "write": 60000 }, "tls": { "verify": false }, "health_check": { "path": "/healthz", "method": "GET", "expected_status": 200, "timeout_ms": 3000 }, "capabilities": { "max_context_length": 131072, "max_output_tokens": 4096, "supports_streaming": false, "input_token_cost": 0.00005, "output_token_cost": 0.0001, "supports_function_calling": false }, "strategy": { "fallback_to": ["ollama-qwen2-7b"], "retry_policy": { "max_retries": 0 } } }, { "name": "ollama-qwen2-7b", "display_name": "Ollama Qwen2-7B", "description": "本地开发机部署,紧急兜底使用", "protocol": "openai", "endpoint": "http://host.docker.internal:11434/v1", "auth": { "type": "none" }, "timeout": { "connect": 10000, "read": 300000, "write": 300000 }, "tls": { "verify": true }, "health_check": { "path": "/api/tags", "method": "GET", "expected_status": 200, "timeout_ms": 5000 }, "capabilities": { "max_context_length": 32768, "max_output_tokens": 2048, "supports_streaming": true, "input_token_cost": 0.00001, "output_token_cost": 0.00002, "supports_function_calling": false } } ], "global": { "default_model": "qwen2-7b-intranet", "logging": { "level": "INFO", "model_fallback_events": true } } }配置要点深度解析:
host.docker.internal:Docker Desktop for Mac/Windows的特殊DNS,指向宿主机。Linux需替换为宿主机真实IP或配置--add-host=host.docker.internal:host-gateway。phi3-mini-intranet的retry_policy.max_retries: 0:因为它是CPU集群,资源有限,我们选择不重试,直接回退到Ollama,避免压垮CPU节点。ollama-qwen2-7b的tls.verify: true:本地Ollama通常用HTTPS,必须验证证书。health_check.path差异化:vLLM用/health,Phi-3服务用/healthz,Ollama用/api/tags,体现不同服务的健康检查约定。
4.3 部署与验证:三步确认接入成功
步骤1:挂载配置并启动OpenClaw
# 创建配置目录 mkdir -p /opt/openclaw/config cp openclaw.json /opt/openclaw/config/ # 启动容器(关键:挂载配置且开放端口) docker run -d \ --name openclaw-prod \ -p 8080:8080 \ -v /opt/openclaw/config:/app/config \ -e OPENCLAW_CONFIG_PATH=/app/config/openclaw.json \ --restart=unless-stopped \ openclaw/openclaw:latest步骤2:验证模型注册状态
访问http://localhost:8080/api/v1/models,应返回包含三个模型的JSON数组。重点检查:
status字段是否为"ready"health_status是否为"healthy"fallback_chain字段是否正确显示回退路径
若health_status为"unhealthy",查看容器日志:
docker logs openclaw-prod | grep "health check" # 常见错误:health check timeout,检查网络连通性和health_check.timeout_ms设置步骤3:端到端功能测试
使用OpenClaw提供的CLI工具(或直接curl)发起测试请求:
# 发送标准请求(应命中qwen2-7b-intranet) curl -X POST http://localhost:8080/api/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2-7b-intranet", "messages": [{"role": "user", "content": "用Python写一个快速排序"}], "stream": true }' # 故意触发回退:停掉vLLM服务,再发相同请求,应看到响应头中`X-Model-Used: phi3-mini-intranet` curl -I http://localhost:8080/api/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model": "qwen2-7b-intranet", "messages": [{"role": "user", "content": "hi"}]}'经验:首次部署后,务必用
curl -I检查响应头。X-Model-Used头会明确告诉你本次请求实际调用的模型,这是验证回退链最直接的方式。
5. 高阶技巧与避坑指南:那些文档里不会写的实战细节
经过上百次OpenClaw模型接入实战,我总结出一些文档从未提及、但能让你少踩80%坑的关键技巧。这些不是“最佳实践”,而是血泪教训凝结的生存法则。
5.1 模型名称的隐藏陷阱:大小写、下划线与保留字
OpenClaw对模型名称(name字段)的解析有严格规则,违反会导致配置加载失败或路由错乱:
- 禁止使用大写字母:
"name": "Qwen2-7B"会被OpenClaw内部转换为qwen2-7b,但display_name仍显示为Qwen2-7B,造成运维困惑。必须统一用小写:"qwen2-7b-intranet"。 - 禁止以数字开头:
"name": "7b-qwen2"会导致JSON Schema校验失败,报错invalid model name format。 - 避免常见保留字:
"name": "default"、"name": "fallback"、"name": "system"会被OpenClaw内部占用,导致不可预测行为。我们曾用"system"作为模型名,结果所有请求都被路由到一个不存在的内部模型,日志里全是model not found。 - 下划线是安全的:
"qwen2_7b_intranet"完全合法,且比连字符更不易与OpenClaw内部命名冲突。
提示:在
openclaw.json中,所有模型名必须全局唯一。若存在同名模型,OpenClaw会静默忽略后出现的配置,只加载第一个。建议在名称后加环境标识:qwen2-7b-intranet-prod、qwen2-7b-intranet-staging。
5.2 配置热更新:无需重启的模型增删改
OpenClaw支持配置热更新,但必须满足三个条件,缺一不可:
- 文件系统监听启用:启动时必须添加环境变量
OPENCLAW_CONFIG_WATCH=true。 - 配置文件权限正确:容器内进程需有读取
openclaw.json的权限。若用root用户启动容器,而配置文件属主为1001,则监听失败。 - JSON语法严格正确:多一个逗号、少一个引号,OpenClaw会停止监听并回退到旧配置,且不报错!日志中只有
WARN config-watcher: invalid json, skipping reload。
热更新流程:
# 1. 编辑配置(确保语法正确!) vim /opt/openclaw/config/openclaw.json # 2. 保存后,OpenClaw自动检测并重载 # 3. 查看日志确认 docker logs openclaw-prod | tail -5 # 应看到:INFO config-watcher: configuration reloaded successfully实操心得:我们为所有生产环境配置了inotifywait监控脚本,一旦openclaw.json修改,自动执行语法检查:
# 安装jq(JSON处理器) apt-get install -y jq # 检查语法 jq empty /opt/openclaw/config/openclaw.json >/dev/null 2>&1 && echo "Valid JSON" || echo "Invalid JSON"5.3 模型能力探测:如何让OpenClaw自动识别未知模型
对于新接入的模型,你可能不确定其max_context_length或是否支持流式。OpenClaw提供/api/v1/models/probe端点进行自动探测:
# 探测qwen2-7b-intranet的能力 curl -X POST http://localhost:8080/api/v1/models/probe \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2-7b-intranet", "probe_type": "context_length" }' # 返回:{"max_context_length": 131072, "detected_by": "auto"}支持的probe_type包括:
context_length:发送超长文本,探测最大上下文streaming:发送stream: true请求,检查是否返回SSEfunction_calling:发送含tools字段的请求,检查是否返回tool_calls
注意:探测过程会产生真实API调用,消耗token和计算资源。生产环境慎用,建议在预发布环境完成探测后,将结果固化到openclaw.json中。
5.4 日志分析:从海量日志中定位模型问题
OpenClaw日志量巨大,但关键信息都带有结构化标签。善用grep和awk能快速定位问题:
# 查看所有模型回退事件(最近1000行) docker logs openclaw-prod | grep "fallback triggered" | tail -20 # 统计各模型的调用次数 docker logs openclaw-prod | grep "model_router" | awk '{print $5}' | sort | uniq -c | sort -nr # 查看qwen2-7b-intranet的平均延迟(单位ms) docker logs openclaw-prod | grep "qwen2-7b-intranet" | awk '{print $NF}' | sed 's/duration_ms=//' | awk '{sum+=$1; count++} END {print "avg:", sum/count}' # 查看超时最多的模型 docker logs openclaw-prod | grep "timeout" | awk '{print $5}' | sort | uniq -c | sort -nr最后一个技巧:当OpenClaw出现“随机延迟”时,90%的情况是某个模型的
read超时设置过短,导致OpenClaw频繁重试。用上述命令找出超时最多的模型,然后检查其timeout.read配置和实际P95延迟,通常就能定位根因。
我在给一家电商公司做支持时,客户抱怨“OpenClaw为什么会延迟”,日志显示qwen2-7b-intranet超时率高达40%。但curl测试显示服务响应很快。最终用awk分析发现,所有超时请求的duration_ms都集中在30000-30500ms区间——正好是timeout.read的默认值。原来客户在openclaw.json中漏写了timeout块,OpenClaw用了30秒默认值,而他们的Qwen2服务在高负载下P95延迟是28秒。将read超时调至35秒后,超时率归零。
模型接入不是一次性的配置任务,而是一个持续观测、度量、优化的闭环。当你能从日志中一眼看出哪个模型在拖慢整体SLA,当你能用一行命令验证回退链是否真正在工作,当你能在客户提出“为什么不用GPT-4”时,从容展示内网Qwen2-7B的TPS和成本优势——那一刻,你才真正掌握了OpenClaw。