OpenClaw 条件开关粒度:12+ ConditionalOnProperty 完整详解
一、基础概念与设计定位
1. 核心定义
ConditionalOnProperty 是 OpenClaw 可插拔运行时的分层条件激活注解/配置开关体系,借鉴 Spring Boot 条件化装配思想,面向企业多环境、多租户、多Agent场景实现细粒度组件按需启用/禁用,属于 UpClaw「配置分离、调度自动化、模型韧性、可观测性」四大改造板块底层支撑。
底层依托运行时插槽注册表 + MD 配置元数据 + 全局yaml配置三层联动,通过 12 类以上不同粒度的条件注解,控制:插件加载、子代理启用、工具集开关、压缩策略、Langfuse追踪、安全约束、模型路由、定时心跳、CJK优化、反抖动、记忆引擎、SFA2A通信等全部组件。
2. 开关粒度分层逻辑(从粗到细)
全局环境开关 > 租户/业务线开关 > Agent实例开关 > 会话运行时开关 > 单次功能特性开关
所有 ConditionalOnProperty 遵循多条件与/或组合、前缀隔离、缺失匹配、反向匹配四大规则,支持:
havingValue=xxx:配置等于指定值才启用matchIfMissing=true:配置不存在时默认启用matchIfMissing=false:配置不存在时默认禁用prefix="xxx":配置前缀隔离,避免key冲突negate=true:取反匹配(配置存在则禁用)
3. 设计目标
- 一套代码/一套MD配置,适配开发/测试/生产/私有化离线多环境;
- 按业务租户、智能体实例差异化开启能力,不用维护多套分支;
- 线上灰度切换功能(关闭Langfuse采样、临时关闭CJK优化、禁用子代理递归等)无需重启网关;
- 精准关闭高消耗组件(压缩、全量追踪、多模型路由)控制算力成本;
- 配套三层Tool治理、SubAgent安全约束、Context Compaction、四层Langfuse追踪实现动态启停管控。
二、12类标准 ConditionalOnProperty 粒度分类(完整12+开关)
按管控作用域从粗粒度全局 → 细粒度功能拆分,每一类对应独立注解、配置前缀、生效时机、业务用途。
1. ConditionalOnGlobalEnv(全局环境粒度,最粗)
- 配置前缀:
claw.global.env - 匹配key示例:
claw.global.env=prod/test/dev/offline - 生效阶段:网关启动插件加载阶段(on_validate / on_load)
- 作用:区分整体部署环境,一次性加载/卸载整套插件集群
offline离线私有化:自动禁用 OpenAI/Claude ModelProvider、外网Langfuse上报、网络类工具;dev开发环境:自动开启完整日志、全量追踪、宽松安全规则;prod生产:开启严格rules拦截、反抖动、并发限流、采样追踪;
- 典型搭配:
@ConditionalOnGlobalEnv(havingValue = "offline", negate = true)
// 仅非离线环境加载云端大模型插件
2. ConditionalOnTenant(租户/业务线粒度)
- 配置前缀:
claw.tenant.{tenantId} - 生效阶段:会话创建 onSessionCreate,按传入租户ID动态加载能力
- 作用:多租户中台差异化能力下发
- 金融租户:强制开启脱敏、全量Langfuse审计、禁用高危shell工具;
- 内部研发租户:开放Codex代码工具、放宽工具调用上限;
- 支持多租户白名单匹配,不匹配租户自动屏蔽对应技能、子代理。
3. ConditionalOnAgentName(Agent实例粒度)
- 配置前缀:
claw.agent.{agentName} - 生效阶段:Agent目录MD解析阶段,加载该代理专属插件/技能
- 作用:单类智能体独立开关,不同Agent隔离功能
customer_service客服Agent:开启CJK优化、订单工具集、关闭代码执行工具;code_dev研发Agent:关闭客服记忆逻辑、开启Codex模型、代码沙箱;
- 可控制:是否加载该Agent私有rules.md、SKILL.md、子代理委派权限。
4. ConditionalOnPluginEnable(可插拔运行时插件粒度)
- 配置前缀:
claw.plugin.{pluginId}.enable - 生效阶段:网关启动插件扫描阶段
- 覆盖全部8大插槽插件:ModelProvider、MemoryBackend、ToolAdapter、ChannelConnector、Observer、Scheduler、ContextEngine、SecurityPolicy
- 示例开关:
claw.plugin.langfuse.enable=true:启用四层Langfuse追踪插件;claw.plugin.lancedb.enable=false:禁用LanceDB向量记忆,切换SQLite;
- 支持动态热重载,修改配置后执行
plugins reload即时生效,无需重启网关。
5. ConditionalOnSubAgent(子代理委派粒度,配套SubAgent安全约束)
- 配置前缀:
claw.subagent.{subAgentId} - 生效阶段:onSubAgentDispatch 委派前置校验卡点
- 三层控制能力:
enable=true/false:全局是否允许创建该子代理;maxDepth=1:条件化递归深度开关;allowSpawnSub=false:条件控制是否允许子代理二次委派;
- 典型场景:测试环境放开
maxDepth=2多层委派,生产环境强制关闭。 - 联动黑白名单:配置为false时,自动将该子代理加入父代理AGENTS.md黑名单,直接拦截spawn_subagent调用。
6. ConditionalOnToolGroup(三层Tool治理工具集粒度)
- 配置前缀:
claw.tool.group.{groupName} - 分组:db、shell、file、web、code、video、order_api 工具组
- 生效阶段:before_tool_run 工具执行校验
- 能力:按业务组整体开关,无需逐个配置工具黑白名单
claw.tool.group.shell.enable: false
# 全局关闭所有shell/exec高危工具组,等价rules.md批量黑名单
支持租户/Agent维度覆盖:生产租户强制关闭shell组,内部运维租户开启。
7. ConditionalOnContextCompaction(上下文压缩粒度,配套4阶段Compaction)
- 配置前缀:
claw.compaction - 细分子开关(多子属性联合条件匹配):
enable:总开关,是否启用四阶段压缩流水线;antiJitter.enable:单独开关反抖动机制;cjk.optimize:单独开关CJK中日韩分词/摘要优化;autoArchive:压缩后是否自动归档原始对话至长期记忆;
- 条件组合示例:
// 仅生产环境开启压缩+反抖动,开发环境关闭压缩方便调试
@ConditionalOnProperty(prefix = "claw.global.env", havingValue = "prod")
@ConditionalOnProperty(prefix = "claw.compaction", havingValue = "true")
8. ConditionalOnObsTrace(四层Langfuse追踪粒度)
- 配置前缀:
claw.trace.langfuse - 分层细粒度开关:
globalEnable:总开关,是否上报链路;sessionSampleRate:采样率条件(仅10%会话全量追踪,其余丢弃Generation层);recordRuleSpan:是否记录rules.md拦截RulePolicySpan;recordSubAgentSpan:是否采集子代理完整内部链路;recordFullGeneration:是否存储完整模型输入输出(合规场景可关闭仅记录token统计);
- 企业合规场景:金融租户强制开启
recordRuleSpan=true全审计,内部测试租户关闭完整文本上报。
9. ConditionalOnMemoryBackend(LongTermMemory长期记忆粒度)
- 配置前缀:
claw.memory - 条件控制维度:
persistEnable:是否开启持久化记忆(临时会话可关闭,释放存储);vectorEngine=lancedb/milvus/sqlitevec:条件切换向量存储插件;subagentIsolate:是否启用子代理记忆分片隔离(防污染核心开关);autoArchiveTTL:过期记忆归档条件阈值;
- 离线私有化:切换memory为sqlitevec,关闭milvus分布式向量引擎。
10. ConditionalOnScheduler(调度自动化/HEARTBEAT心跳粒度)
- 配置前缀:
claw.scheduler.heartbeat - 控制定时后台任务:
enable:心跳总开关;compactBackground:定时后台压缩上下文;memoryClean:定时过期记忆清理;sessionRecycle:超时会话自动销毁;
- 场景:夜间低峰开启批量记忆归档,白天关闭减少算力消耗。
11. ConditionalOnModelRoute(ModelProvider模型路由/韧性粒度)
- 配置前缀:
claw.model.route - 条件开关:
fallbackEnable:模型故障自动降级开关;codexEnable/claudeEnable:单独启用/禁用Codex、Claude插件;localOllamaPriority:离线场景优先本地模型;
- 多条件组合:生产主模型GPT故障时自动路由至Claude,离线环境直接禁用所有云端模型。
12. ConditionalOnSecurityPolicy(rules.md安全约束粒度)
- 配置前缀:
claw.security - 细粒度安全开关,配套SubAgent三大安全约束:
subAgentBlacklistEnable:子代理工具黑白名单收缩总开关;antiRecursionEnable:防递归嵌套/乒乓循环阻断开关;antiPollutionIsolate:父子记忆/上下文防污染隔离开关;highRiskApproval:高危工具人工二次确认开关;
- 开发环境可临时关闭
antiRecursionEnable方便调试多层子代理,生产强制开启。
13. 扩展:ConditionalOnChannel(消息渠道扩展,第13类)
- 配置前缀:
claw.channel.{channelId} - 控制飞书/钉钉/WebSocket/HTTP渠道插件启停,多渠道独立开关,按需下线渠道。
总计≥13类独立维度的
ConditionalOnProperty条件开关,行业内统称「12+条件粒度体系」。
三、条件匹配优先级规则(多开关冲突解决)
- 细粒度覆盖粗粒度
Agent粒度配置 > 租户粒度 > 全局环境粒度;
例:全局开启shell工具组,但某金融租户配置claw.tool.group.shell.enable=false,该租户会话自动禁用shell。 - 多条件同时生效为逻辑AND
组件上多个@ConditionalOnProperty注解,必须全部匹配才启用;任意一个不匹配直接禁用。 - negate取反优先级最高
只要任意条件negate匹配,直接禁用,不校验其他正向条件。 - matchIfMissing兜底规则
未配置对应key时,按注解matchIfMissing判定默认启用/关闭,无配置不报错。
四、完整生命周期介入节点(开关何时生效)
1. 网关启动阶段(一次性静态条件:全局、插件、环境)
生效粒度:ConditionalOnGlobalEnv、ConditionalOnPluginEnable、ConditionalOnModelRoute
- 扫描所有插件、MD配置、底层驱动;
- 不满足条件的插件直接跳过加载,不占用内存连接池。
2. 会话创建 onSessionCreate(租户、Agent、记忆、压缩默认策略)
生效粒度:ConditionalOnTenant、ConditionalOnAgentName、ConditionalOnContextCompaction、ConditionalOnMemoryBackend
- 按当前租户+AgentID读取专属条件配置,初始化会话运行时参数;
- 预计算是否开启压缩、记忆隔离、CJK优化、心跳定时任务。
3. 子代理委派 onSubAgentDispatch(子代理专属条件卡点)
生效粒度:ConditionalOnSubAgent、ConditionalOnSecurityPolicy(子代理安全)
- 创建子代理前校验递归、黑白名单、防污染隔离开关;
- 不满足条件直接拦截,不分配沙箱、不创建子会话。
4. 工具执行 before_tool_run(工具组粒度动态校验)
生效粒度:ConditionalOnToolGroup
- 每一次工具调用实时匹配工具组开关,运行时动态拦截,无需重启会话。
5. 推理/压缩循环运行时(动态特性开关)
生效粒度:ConditionalOnContextCompaction(antiJitter/CJK)、ConditionalOnObsTrace
- 每轮拼装上下文时校验压缩、反抖动、CJK开关;
- Langfuse上报时按采样条件动态丢弃/保存Span/Generation数据。
6. 定时调度后台循环(Scheduler心跳开关)
生效粒度:ConditionalOnScheduler
- 后台线程按配置开关决定是否执行记忆清理、会话回收、批量压缩。
五、典型多条件组合落地示例
示例1:生产环境全安全+全观测组合
# 全局环境
claw.global.env: prod
# 开启四层Langfuse全审计,记录规则与子代理链路
claw.trace.langfuse.globalEnable: true
claw.trace.langfuse.recordRuleSpan: true
claw.trace.langfuse.recordSubAgentSpan: true
# 完整上下文压缩+反抖动+CJK中文优化
claw.compaction.enable: true
claw.compaction.antiJitter.enable: true
claw.compaction.cjk.optimize: true
# 子代理全套安全约束开启
claw.security.subAgentBlacklistEnable: true
claw.security.antiRecursionEnable: true
claw.security.antiPollutionIsolate: true
# 高危shell工具全局关闭
claw.tool.group.shell.enable: false
示例2:离线私有化调试环境
claw.global.env: offline
# 禁用所有云端模型
claw.plugin.openai.enable: false
claw.plugin.anthropic.enable: false
# 关闭外网Langfuse上报
claw.plugin.langfuse.enable: false
# 切换本地轻量向量库
claw.memory.vectorEngine: sqlitevec
# 临时放开子代理递归限制用于调试
claw.security.antiRecursionEnable: false
# 关闭自动压缩,完整查看原始上下文
claw.compaction.enable: false
示例3:金融租户差异化管控(租户粒度覆盖全局)
claw.tenant.finance:
# 强制全量追踪完整模型输出用于审计
trace.langfuse.recordFullGeneration: true
# 禁止任何数据库修改工具组
tool.group.db_write.enable: false
# 子代理记忆强制隔离防客户数据泄露
memory.subagentIsolate: true
六、与OpenClaw核心模块联动价值
- 三层Tool治理联动:通过
ConditionalOnToolGroup批量开关工具黑白名单,无需修改rules.md,配置化管控工具权限; - SubAgent安全约束联动:条件开关动态开启/关闭递归防护、权限收缩、数据隔离,区分生产/调试场景;
- Context Compaction联动:独立开关4阶段压缩、反抖动、CJK优化,中文业务线单独启用CJK,英文研发场景关闭节省算力;
- 四层Langfuse追踪联动:按租户、环境配置采样率、审计粒度,平衡合规需求与存储/算力成本;
- 可插拔运行时联动:基于插件粒度开关动态加载/卸载模型、记忆、渠道插件,一套框架适配多部署形态。
七、对比原生AgentScope / Codex / Claude Code
- 原生AgentScope
无分层条件属性开关,能力硬编码;环境、租户、Agent差异化能力只能修改代码,无配置化热切换,不支持细粒度动态启停压缩、追踪、子代理安全策略。 - OpenAI Codex
仅提供简单全局开关,无租户/Agent/子代理/工具分组粒度;无法条件化关闭递归、上下文压缩、观测链路,厂商封闭配置,无自定义条件注解体系。 - Claude Code
仅本地单环境简单配置,不支持多租户分层条件、子代理安全动态开关、上下文CJK独立切换,无企业级多粒度条件管控能力。
八、核心优势总结
- 十二维分层粒度,覆盖全链路组件:从全局环境到单次工具、子代理、压缩子特性全覆盖,无管控盲区;
- 配置分离低代码运维:修改yaml配置即可灰度启停功能,不用修改MD提示词、内核代码;
- 多环境一套部署包:开发/测试/生产/离线私有化仅切换配置,不用维护多分支镜像;
- 运行时动态生效:插件粒度支持热重载,会话/工具粒度实时校验,无需重启网关;
- 合规成本平衡:高审计租户全量开启追踪与安全约束,普通业务租户采样关闭高消耗组件,控制算力与存储开销;
- 调试友好:开发环境可单独关闭压缩、递归拦截、严格工具黑名单,方便复现问题,生产一键开启全套安全管控。
更多推荐



所有评论(0)