OpenClaw 多代理和多模型是同一配置文件中的两个不同层级:多个代理是 agents.entries 下带密钥的条目,每个条目拥有自己的工作区、状态目录和会话存储;多个模型则是这些条目中的按代理 model 值。 另有两个与它们并列的层级——bindings 决定由哪个代理回答,而回退链决定一个代理的模型失败时如何处理。编辑错误层级,是修改看起来毫无作用的最常见原因。
运行更多代理不会产生软件费用。OpenClaw 的文档概览称其由“OpenClaw Foundation(一家独立的 501(c)(3) 组织)”以开放方式开发,并且“没有付费层级,默认不进行遥测(可关闭的版本检查除外),没有任何实验室拥有它”;openclaw.ai还写道:“没有订阅。没有托管层级。没有 token。” npm 包 openclaw 采用 MIT 许可证,其中 latest 为 2026.9.5,另有 extended-stable 通道为 2026.7.35,以及 engines.node 为 >=24.16.0 <25 || >=26.1.0(npm 注册表,已于 2026 年 9 月 21 日核查)。第二个代理增加到你账单上的,是 token 费用。
OpenClaw 多代理:四个层级,以及编辑错误层级时出现的症状
| 层级 | 配置键 | 它决定什么 | 如果实际需要的是这一层级,会出现什么症状 |
|---|---|---|---|
| 代理列表 | agents.entries.<id> | 独立的工作区、状态目录、会话存储、技能和工具策略 | 两个角色持续读取彼此的笔记和历史记录 |
| 通道路由 | bindings[] | 哪个代理通过哪个通道或账户回答入站消息 | 路由报告 AGENT_SELECTION_REQUIRED |
| 模型选择 | agents.entries.<id>.model | 该代理的轮次运行在哪个模型上 | 在一个聊天中更改 /model 后,其他所有聊天都没有变化 |
| 回退链 | model.fallbacks, agents.defaults.model | 提供商侧故障时由哪个模型接管 | 上下文溢出错误从未触发回退,因为它不是回退触发条件 |
四项内容均于 2026 年 9 月 21 日从 OpenClaw 自己的文档中查阅:条目和多代理、代理绑定以及模型故障转移。旧教程中的两种形式已经过时:agents.list 数组列表是 Doctor 会迁移的旧格式,而条目上的 default: true 标记已停用——条目页面明确写道“default 已停用”,并说明多代理操作需要绑定或显式目标。OpenClaw 还曾使用过另外两个名称,因此你找到的任何 Moltbot 或 Clawdbot 时代配置都早于这一配置结构。
OpenClaw 多代理设置:最小化的双代理、双模型配置
此片段假设你已经拥有一个可运行的 models.providers 块——适用于 OpenClaw 的最佳 API包含 Kunavo 配置,其中包括 api: "anthropic-messages" 以及在 Anthropic 基础 URL中发布的基础 URL。下面只有代理和路由层。
{
"agents": {
"defaults": {
"modelSelectionScope": "session",
"model": {
"primary": "kunavo/claude-haiku-4-5",
"fallbacks": [
"kunavo/claude-sonnet-5"
]
}
},
"entries": {
"ops": {
"name": "Ops",
"workspace": "~/.openclaw/workspace-ops",
"agentDir": "~/.openclaw/agents/ops/agent",
"model": "kunavo/claude-haiku-4-5",
"modelPolicy": {
"allow": [
"kunavo/claude-haiku-4-5"
]
}
},
"build": {
"name": "Build",
"workspace": "~/.openclaw/workspace-build",
"agentDir": "~/.openclaw/agents/build/agent",
"model": {
"primary": "kunavo/claude-opus-5",
"fallbacks": [
"kunavo/claude-sonnet-5"
]
},
"utilityModel": "kunavo/claude-haiku-4-5"
}
}
},
"bindings": [
{
"agentId": "build",
"match": {
"channel": "discord",
"accountId": "build"
}
},
{
"agentId": "ops",
"match": {
"channel": "discord",
"accountId": "*"
}
}
]
}该块中有四项内容至关重要。每个代理都有自己的 agentDir,因为多代理页面警告:“Never reuse agentDir across agents — it causes auth/session state collisions.” ops 代理使用 model 的字符串形式;条目页面将其定义为“a strict per-agent primary with no model fallback”,因此故障会直接显示,而不会悄然将常规工作转移到更昂贵的层级。build 代理使用带有显式 fallbacks 列表的对象形式,这正是启用代理回退的方式;故障转移页面补充说明,代理可以单独设置 model: { fallbacks: [...] },并继续继承共享主模型。具体 binding 位于通配符之上,因为在同一匹配层级中,“the first matching bindings entry wins.”
默认代理与其他代理的工作区默认值不同,值得显式设置:默认代理的工作区是 <stateDir>/workspace,而其他代理默认使用 <stateDir>/workspace-<agentId>。记忆跟随工作区,因为 OpenClaw 的内置引擎“通过在代理的工作区中写入普通 Markdown 文件来记住内容”——因此,隔离工作区就是隔离记忆。会话权限模式又是一个独立维度:read-only、guarded、workspace 和 full,其中“full 需要 operator.admin。其他模式需要 operator.write”(权限模式,2026 年 9 月 21 日)。代理即使使用廉价模型,只要权限宽松,仍然是权限宽松的代理。
独立代理能隔离什么——以及不能隔离什么
| 项目 | 按代理? | 存储位置 |
|---|---|---|
| 工作区文件和 Markdown 记忆 | 是 | agents.entries.*.workspace |
| 聊天历史 | 是 | <agentDir>/openclaw-agent.sqlite |
| 存储的认证配置文件 | 是 | agentDir;认证变更需要 --agent |
| 技能 | 是 | 显式的 agents.entries.*.skills 列表会替换默认值,而不是与其合并 |
| 工具、沙箱、提升权限 | 是 | 按代理的密钥确实存在,但不同密钥的优先级规则不同——例如,tools.elevated“can only further restrict” |
| 模型主模型、回退模型、允许列表 | 是 | agents.entries.*.model, .modelPolicy.allow |
提供商 baseUrl、apiKey、方言 | 否 | models.providers 是 Gateway 级别的 |
| 来自环境的提供商密钥 | 否 | 一个 Gateway 进程,一个环境 |
openclaw models set | 否 | 全局;它拒绝 --agent 并写入代理默认值 |
这是价格表遗漏的边界。独立条目会为你提供独立的文件、记忆、历史记录、工具策略和存储的认证配置文件。但它们本身不会为每个代理提供一个用于环境配置自定义提供商的独立 API 密钥——按代理的文档 schema 根本没有 baseUrl、apiKey 或 providers 字段。文档中没有相关内容,并不能证明代码禁止该功能,因此应将其理解为文档未说明;如果需要按租户进行严格的密钥隔离,请运行独立的 Gateway。身份也存在相关限制:OpenClaw 的 WhatsApp DM 分离示例指出,“Replies still come from the same WhatsApp number — there is no per-agent sender identity”,并且“Direct chats collapse to the agent's main session key by default, so true isolation requires one agent per person.” 这句话针对的是 WhatsApp;在推广到其他场景前,请查阅你所用通道的页面。
在拆分角色时,还需注意一个能力边界:Kunavo 不提供文本转语音、语音转文本或嵌入模型,因此需要语音输出或向量索引的代理,必须在该步骤调用外部提供商。
OpenClaw 多模型:严格模式、回退、策略和实用通道
按代理的模型选择有四个值得有意设置的控制项。model 使用字符串形式时为严格模式。{ primary, fallbacks: [...] } 会将该代理加入故障转移。modelPolicy.allow 是一个允许列表,会“替换该代理的默认策略”——接受别名、精确引用和末尾通配符;借此可以阻止常规代理触及昂贵模型。utilityModel 则是一个独立的、通常更便宜的模型,用于“short internal tasks such as generated session and thread titles”,并支持按代理覆盖。
文档列出的触发条件非常具体。OpenClaw 会在“auth failures, rate limits and cooldown exhaustion, overloaded/provider-busy errors, timeout-shaped failover errors, billing disables, model_not_found”以及其他未识别错误且仍有候选模型时推进回退;但不会因上下文溢出错误而回退,因为这类错误属于压缩和重试逻辑,也不会因“explicit aborts that are not timeout/failover-shaped”而回退。在群组和频道对话之外,回退状态是可见的:这些界面会发布形如 Model Fallback: <fallback> (selected <primary>; <reason>) 的状态通知以及相应的清除通知;而群组和频道对话会“suppress the visible notices while retaining the same fallback state”,因此不要依赖在共享房间中看到通知。显式的会话选择——/model、模型选择器、session_status(model=...) 或 sessions.patch——是严格的:如果该模型在生成回复前失败,OpenClaw 会报告失败,而不是使用配置的回退模型进行回答。cron 作业的 --model 不属于这些情况;文档称其为仍会使用已配置回退模型的作业主模型,除非作业设置了 payload.fallbacks: []。
还有两项机制会决定你的意图能否保留。请求参数会通过四个层级合并,从 agents.defaults.params 到 agents.entries.*.params,后面的层级按键覆盖前面的层级。并行度有一个计算上限:agents.defaults.maxConcurrent 默认值为 max(8, available CPU parallelism * 4),适用于所有会话,而每个会话仍保持串行——同一代理的两条消息不会同时运行。要选择哪个模型承担哪个角色,请参阅Opus 与 Sonnet 及 Haiku中的能力对比。
按路径而非按代理归因成本
由于没有已记录的命令能够报告每个代理的支出,因此应按路径进行归因。下面的算术是示例性的,不是实测账单,也不是上限。假设一个 30 天的月份、文档所述的 30m 心跳默认值(1,440 次运行)、每次心跳输出 300 个 token、没有缓存命中,以及主对话通道包含 8M 个输入 token 和 500K 个输出 token。每次运行约 100K 和约 2–5K 的上下文数据,是 OpenClaw 自己用于说明 isolatedSession 所移除内容的示例,而不是本文实测值;3,000 是其中点值。费率是实时的Kunavo 目录中按每百万 token 计价的价格。
| 方式 | 假设的每月输入 / 输出量 | 在 Claude Haiku 4.5 下 | 在 Claude Opus 5 下 |
|---|---|---|---|
| 共享会话上的心跳,间隔 30m | 144.00M / 0.43M | $102.31 | $511.56 |
| 启用 isolatedSession: true 的相同心跳 | 4.32M / 0.43M | $4.54 | $22.68 |
| 主要对话轮次 | 8.00M / 0.50M | $7.35 | $36.75 |
| utilityModel 标题和摘要 | 0.20M / 0.02M | $0.21 | $1.05 |
Claude Haiku 4.5 在实时目录中列出每百万输入 / 输出 token 的 $0.70 / $3.50,Claude Opus 5 列出 $3.50 / $17.50。需要关注的解读是:在这些假设下,计划任务通道占据主导。使用强模型的共享会话心跳每月约为 $511.56,而在廉价模型上以相同频率使用 isolatedSession: true 时则为 $4.54。OpenClaw 自己也明确指出:“Heartbeats run full agent turns. Shorter intervals burn more tokens”,并列出了 isolatedSession、lightContext、更便宜的 model 和 target: "none" 作为可调节因素。
cheap-heartbeat 技巧有一个文档明确记录的故障模式,这正是 isolatedSession 比单独切换模型更值得优先采用的原因。心跳会“在运行完成后保留共享会话现有的运行时模型”,因此,将会话切换到更小模型的心跳可能会让该模型继续留在会话中,供下一次主会话轮次使用,而下一轮可能随后报告上下文溢出——OpenClaw 的恢复消息将其称为 heartbeat model bleed。文档中的示例使用了一个具有 32k 窗口的本地模型,因此风险大小取决于心跳模型的上下文窗口比共享会话需求小多少。还有一项调度说明:文档记录的默认间隔为 30m,仅当解析出的身份验证模式为 Anthropic OAuth/token 时才会增加到 1h;因此,普通 API key 路由会保持 30m,除非你自行设置 heartbeat.every。请先检查你自己的值,再进行预算。
关于金额有两点需要注意。Kunavo 的目录金额是计费下限,而不是上限:上游报告其费用时,账单取目录成本与上游成本乘以适用加价后的较大值。并且,如果声明自定义提供商时没有按模型设置 cost 对象,OpenClaw 自己的读数就没有意义——它会默认为 cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },显示 $0,而供应商仍会正常计费。请为每个新增模型声明 cost、contextWindow 和 maxTokens,并与提供商账本进行核对。Kunavo 的最低充值金额为预付余额 $10 ——这是资金充值最低额,不是任务费用或订阅费用。请参阅 billing details 和 AI cost optimization。
哪种购买路径适合多智能体 Gateway
| 方式 | 适用场景 | 你放弃的内容 |
|---|---|---|
| 一个 Gateway,一个 gateway 风格的提供商 | 多个智能体、多个模型系列、一个密钥和一个余额 | 不支持按智能体分离密钥;提供商定义和环境密钥是共享的 |
| 一个 Gateway,按智能体存储身份验证配置 | 你希望每个智能体在自己的 agentDir 中携带自己的凭据 | 仅针对身份验证配置文件提供文档支持——按智能体覆盖端点不在已发布的架构中 |
| 按租户分离 Gateway | 要求实现严格的密钥、环境和支出隔离 | 两个进程、两份配置、两条升级路径 |
| 每个智能体使用直接供应商账户 | 全天使用同一个供应商,并且希望使用该供应商自己的缓存和批处理功能 | 使用另一个系列意味着使用另一个账户;每个账户都有自己的费率和控制项 |
| 运行在计划任务通道上的本地模型 | 有界心跳检查,不收取逐请求费用 | 硬件和维护成本,以及上文提到的 heartbeat model bleed 注意事项 |
| 订阅型代理 | 相比按令牌计费,你更适合固定费率的高频日常使用 | OpenClaw 本身不销售订阅;那将属于不同的客户端 |
关于方言有一点需要说明,因为缓存是费用的关键。配套指南中的 Kunavo 配置块声明了 api: "anthropic-messages",OpenClaw 会将其视为非直接 Anthropic 端点。由此会产生两个有文档依据的后果。在此类端点上,隐式 Anthropic beta 标头会被抑制,因此交错思考等功能必须通过显式的 headers["anthropic-beta"] 选择启用,而不是自动启用。缓存也必须主动请求:OpenClaw 仅针对直接的 anthropic 和 anthropic-vertex 提供商预置 cacheRetention: "short",而“自定义 anthropic-messages 兼容端点”只有“在显式设置 cacheRetention 时”才受支持——因此请自行设置 params.cacheRetention,不要假定存在默认值(提示缓存,2026 年 9 月 21 日)。另一条规则适用于另一种方言:通往非原生端点的 openai-completions 路由会“不发送提示缓存指示”。在将反复使用的上下文按缓存命中进行预算之前,请先验证你自己路由报告的缓存使用情况。提示缓存介绍了费率相关内容。
验证它是否落在你预期的位置
openclaw config validate
openclaw gateway restart
openclaw agents list --bindings
openclaw models status --agent ops --json --check
openclaw models list --agent build配置验证会检查结构,Gateway 重启会重新加载配置;但两者都不能证明计费请求已成功。openclaw agents list --bindings 会显示实际加载的路由——优先使用它,而不是 --tree;后者会出现在概念页面中,但不在 CLI 命令表中。openclaw models status --agent <id> 会说明该智能体配置的默认值,models list --agent <id> 会显示其清单。如果 models set 遇到未知提供商并以非零状态退出,那属于模型层问题:提供商必须是已安装的插件,或在 models.providers 下声明。如果消息没有到达任何智能体,那属于路由层问题。如果多个智能体共享一个频道后出现重复运行,OpenClaw 将 bot loop protection 键记录为防护措施——文档描述的是预防机制,而不是根本原因,因此请先诊断,不要直接假定。
然后为每个智能体运行一个有界任务,并读取你的提供商账户为该任务记录的费用。Kunavo 尚未对 OpenClaw 的单智能体或多智能体运行时进行测试:以上内容全部来自 OpenClaw 已发布的文档,而已发布的配置并不等同于兼容性测试。尝试时请保留一条可用路由。从 提供商配置开始,在 OpenClaw 定价中比较完整的运行费用,准备为密钥充值时再 创建 Kunavo 账户。
常见问题
如何在 OpenClaw 中设置多个代理?
在 agents.entries 下为每个代理添加一个以键标识的条目,为每个代理分配独立的工作区和 agentDir,然后添加 bindings 数组,使入站消息能够解析到相应代理。OpenClaw 的文档明确规定,agentDir 绝不能共享:“绝不要在不同代理之间复用 `agentDir`——这会导致认证状态和会话状态冲突。” CLI 等价命令是 `openclaw agents add <id>`,并配合 --workspace、--agent-dir、--model 以及可重复指定的 --bind。你可能在旧教程中遇到的两种形式已经过时:agents.list 代理列表是 Doctor 会迁移的旧格式,而条目上的 `default: true` 标记已停用——现在多代理选择通过绑定或显式目标完成。于 2026 年 9 月 21 日在 docs.openclaw.ai 阅读;本文未进行运行时测试。
每个 OpenClaw 代理可以使用不同的模型吗?
可以。agents.entries.<id>.model 设置该代理的主模型,而你采用的写法决定它是否可以回退。OpenClaw 文档指出:“字符串形式设置严格的按代理主模型,不允许模型回退;对象形式 { primary } 同样是严格的,除非你添加 fallbacks。” 因此,按代理配置的模型使用普通字符串时,提供商错误会直接显示为错误,而不会悄然将该代理切换到另一个价格层级。使用 { primary, fallbacks: [...] } 可为代理选择启用回退,使用 { primary, fallbacks: [] } 可明确指定严格行为。模型引用始终采用带提供商限定的 provider/model 形式。已于 2026 年 9 月 21 日核查。
每个代理可以拥有自己的 API 密钥或提供商端点吗?
端点不能通过文档所述的按代理配置结构设置;凭据可以。models.providers——其中存放 baseUrl、apiKey 和 api 方言——是 Gateway 级别的块,因此同一 Gateway 中的所有代理共享相同的提供商定义;其中作为环境引用写入的密钥,则从该 Gateway 进程的环境中解析。2026 年 9 月 21 日发布的按代理条目结构没有 baseUrl、apiKey 或 providers 字段,agents.entries.*.models 仅包含 params、agentRuntime 和 codeMode。按代理独立存储的是该代理 agentDir 中的认证配置文件,其中保存 api_key、token 和 OAuth 凭据:models auth 子命令接受 --agent,而配置多个代理时,认证变更必须提供该参数。文档中没有相关内容,并不能证明代码禁止按代理设置端点,因此应将端点部分理解为“文档未说明”,而非“不可能”。如果需要按租户进行严格隔离,请运行独立的 Gateway。
为什么我在聊天中更改模型后没有任何变化?
因为默认写入范围是你输入命令的会话。OpenClaw 文档说明,agents.defaults.modelSelectionScope 默认值为 "session":“在一个聊天中更改模型不会更改其他聊天或配置的默认值,即使调用者是所有者或管理员也一样。” 使用 /model 配合 -a/--agent 可写入代理的主模型,或使用 -g/--global 写入共享默认值。还要注意,`openclaw models set` CLI 是全局命令且拒绝 --agent,因此不能用它设置单个代理的模型——请改为编辑 agents.entries.<id>.model。文档所述行为已于 2026 年 9 月 21 日核查。
AGENT_SELECTION_REQUIRED 是什么意思?
这意味着路由没有为该入站消息找到任何绑定,因此拒绝猜测。OpenClaw 文档指出,在配置了多个代理时:“如果多代理设置中没有可用的绑定,路由会报告 AGENT_SELECTION_REQUIRED,并要求你添加绑定。” 文档规定的匹配顺序是 match.peer、match.guildId、match.teamId、精确匹配的 match.accountId,然后是 accountId "*";最后是单代理回退,它“仅在恰好配置一个代理时适用;明确配置的多代理群组如果没有匹配的绑定,就会拒绝路由”。一旦配置了两个代理,就不存在兜底的所有者。在同一层级内,“首个匹配的 bindings 条目生效”,因此应将具体规则置于宽泛规则之前。使用 `openclaw agents list --bindings` 检查实际加载的内容。已于 2026 年 9 月 21 日核查。
如何查看每个 OpenClaw 代理的成本?
截至 2026 年 9 月 21 日,文档中没有任何命令能够按代理拆分报告支出,因此应改为按模型和路由归因——主代理轮次、心跳运行、utilityModel 通道以及创建的子代理。关于本地数据,有两点需要注意。OpenClaw 显示的美元金额是根据其自身本地定价元数据计算的估算值——当提供商提供相关数据时,其用量界面确实会读取提供商报告的套餐和支出数据,但按会话的成本分析是从会话推导出的;而 /usage cost 警告称,在聚合缓存刷新、数据不完整或过时时,Today 和 Last 30d 总额可能不完整。此外,对于未提供按模型成本对象的自定义提供商,OpenClaw 默认使用 cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }——即使供应商正常向你收费,请求仍会显示为 $0。请与提供商账本核对,而不是与聊天页脚核对。
OpenClaw 文档、CLI 参考和 npm 注册表条目已于 2026 年 9 月 21 日检查,软件包版本为 2026.9.5;本文未实际调用 Gateway、智能体、绑定或付费请求。Kunavo 的 token 费率读取自实时目录,本页所有美元金额均为示例性的 token 计算,而不是实测账单。