☰
8种方式用CEL策略引擎精确控制AI智能体行为:OpenBot终极指南
2026/9/25 2:06:39 网站建设 项目流程

8种方式用CEL策略引擎精确控制AI智能体行为:OpenBot终极指南

【免费下载链接】OpenBotOpen-source AI coworkers that each get a computer of their own: a browser, files and tools, with every action decided before it happens and recorded after. Bring any AG-UI agent.项目地址: https://gitcode.com/gh_mirrors/openb/OpenBot

OpenBot 是一个开源 AI 同事(AI 智能体)平台:每个智能体都拥有自己的"电脑"——浏览器、文件和工具,而它的CEL 策略引擎能在每个动作发生之前做出裁决、在发生之后留下审计记录。本文将带你用 8 种方式精确控制 AI 智能体的行为,从"永远不提交表单"到"定时任务不许碰终端",让智能体既聪明又守规矩。

一、CEL策略引擎是什么?动作先审批,后执行

CEL(Common Expression Language)是一种轻量级表达式语言。OpenBot 用它来描述边界规则,核心思想写在 server/src/computer/policy.ts 的开头:

一家公司想要的边界是一句话——"永远不要在我们域名之外的页面上点击写着 Submit 的东西"。表格只能表达你想过的形状,而表达式语言能表达你真正想过的东西。

整个流程只有五步(详见 docs/architecture.md):

  1. 智能体发起一个工具调用(点按钮、写文件、跑命令、调 MCP 工具);
  2. 服务器网关从自己保存的页面快照解析出目标元素——而不是相信智能体说它点的是什么;
  3. 用当前策略对这次动作做 CEL 表达式求值;
  4. 无论放行还是拒绝,都写入一条审计记录;
  5. 只有裁决为"放行"时,动作才会真正到达那台"电脑"。

裁决逻辑集中在 server/src/computer/policy.ts 的evaluateActionPolicy函数中,网关的执行入口在 server/src/computer/gateway.ts。

二、如何快速上手:两分钟配置OpenBot策略

方式一:环境变量。在 .env.example 中找到AGENT_COMPUTER_POLICY,它是一个 JSON 对象,包含mode、deny(拒绝规则数组)和allow(放行规则数组)三个字段。文件内自带一条可直接启用的示例规则(拒绝提交表单),取消注释即可生效。

方式二:管理界面。打开后台的Boundaries(边界)页面(app/src/routes/_authed/admin/boundaries.tsx),你可以:

  • 在enforce(强制执行)和dry-run(试运行)之间切换;
  • 逐条添加/删除 deny 规则;
  • 一键套用内置预设,如"Never submit a form"(永不提交表单)、"Never type into a password field"(永不输入密码框)、"Stay off social media"(远离社交媒体)。

预设本身就是具体的 CEL 规则,例如"永不提交表单"的规则是:

(intent == "activate" && contains(element.name, "submit")) || ((tool.name == "computer_key" || tool.name == "computer_type") && key == "Enter")

注意它同时封住了两条"回车门":独立的按键动作,以及"输入文本后自动回车"的动作——因为表单在任意输入框按回车都会提交。

三、8种方式精确控制AI智能体行为

规则可以检查的"属性"(context)包括:tool.name(调用了哪个工具)、intent(这次动作的意图)、bot.id/actor.id(哪个智能体、谁在操作)、page.url/page.host(当前页面)、element.ref/element.role/element.name/element.type(目标元素)、key(要按下的键)、file.path/file.name/file.extension(目标文件)、command(要运行的命令原文)、mcp.server/mcp.tool/mcp.effect(MCP 调用)、initiator.kind/initiator.id(这次运行的触发源)。

1️⃣ 拒绝优先:deny 列表永远压过 allow

求值顺序是先 deny 后 allow:任何一条 deny 表达式为真,动作立刻被拒,不管 allow 写了什么。这条优先级规则保证"收回权限"永远不会被更宽泛的"授予权限"规则反杀,运营者才能安心推理自己禁止了什么。

2️⃣ 默认拒绝:沉默意味着"什么都不许做"

策略缺失时按拒绝处理;allow为空时什么都不能做。OpenBot 出厂默认显式写着deny: []和allow: ["true"](放行一切、禁止为空),而不是靠隐式默认值——"智能体能做什么"必须永远是有人写下来的,而不是系统猜的。配置了策略但 JSON 写错时,服务器直接拒绝启动,限制规则绝不会悄悄退化成宽松行为。

3️⃣ 失败封闭(fail-closed):规则写错了,只会更严不会更松

  • 一条写坏的 deny 规则→ 当作拒绝处理(宁错杀,不放水);
  • 一条写坏的 allow 规则→ 不产生放行效果;
  • 表达式求值结果不是 true/false(比如把 deny 列表误当成标签清单、写了个纯字符串)→ 同样按坏规则走失败封闭路径。

引擎还会把每次表达式出错大声写进日志,"悄悄出错的政策比明显拒绝的政策更糟"。

4️⃣ 试运行模式:dry-run 先看效果再真拦截

mode有两个取值:

  • enforce:拒绝即拦截;
  • dry-run:照常裁决并记录审计,但一切照旧放行。

这让管理员可以对着真实流量写规则、观察审计轨迹,确认无误后再一键切换到强制执行。正如源码注释所说:"没人敢开启的治理功能,不算治理功能。"

5️⃣ 按"意图"规则:管效果,而不是管工具名

intent字段回答"这个动作做什么效果",而不是"调用了哪个工具"。可选值包括activate(点按)、type(输入)、navigate(打开页面)、read(查看)、read_file/write_file/list_files(工作区文件)、read_tool/write_tool(MCP 工具)、run_command(跑命令)。

运营者脑子里想的是"不许激活任何叫 submit 的东西",而按钮可以被点击、回车、空格三种方式激活——用intent == "activate"一条规则就把所有激活路径都罩住了。

6️⃣ 按"元素"规则:页面事实以服务器快照为准

element字段来自服务器自己抓取的页面快照,而不是调用方声称它点的是什么。这意味着"不许点 Submit"这条规则无法通过给按钮换个名字来绕过——这是策略与"装饰"的本质区别。配合page.host还能写出"只在自己域名外禁止某操作"这类精准规则。内置contains()与matches()两个字符串函数(均忽略大小写)让"never click submit"顺带抓住标注为 "SUBMIT" 的按钮。

7️⃣ 按"文件、命令、MCP"规则:管住工作台里的另外三扇门

  • 文件:file.name、file.extension被拆成独立字段,就是为了让你直接写"不许碰 *.env"、"不许碰 credentials/ 目录",而不必在 CEL 里做字符串手术;
  • 命令:command存命令原文,可以写deny: contains(command, "rm -rf"),或者干脆deny: intent == "run_command"宣布"我的智能体不配终端"。源码也提醒你:匹配命令文本是过滤器,不是边界——真正的边界是跑命令的那个容器;
  • MCP 工具:mcp.effect由服务器拿自己公布的工具目录交叉校验得出,且失败封闭——凡没被确证为"读"的,一律按"写"处理,一条deny: mcp.server == "jira" && mcp.effect == "write"就能说"任何人在 Jira 上都不许改任何东西"。

8️⃣ 按"触发源"规则:有人看着可以跑,没人看着就不行

initiator.kind回答"是什么触发了这次运行":person(有人在场)、deployment、routine(定时任务,凌晨三点无人值守)、handoff(智能体交接)。它与actor.id(动用的是谁的授权)是两码事。于是这条规则变得可写:

deny: initiator.kind == "routine" && intent == "run_command"

意思很清楚:智能体在大伙眼皮底下跑 shell 没问题,但无人值守的定时任务碰终端就说不得。

四、历史回放:新规则上线前先"预演"一遍

写边界规则往往是"盲写"——管理员敲下一条 CEL 规则,保存后才知道它到底会命中什么。OpenBot 的做法是把审计历史当裁判:候选策略会被逐条重放在历史动作上,重放用的上下文与网关当初裁决时逐字段一致(见 server/src/computer/policy-dry-run.ts)。

回放报告(DryRunReport)会告诉你:扫描了多少条记录、新策略下会多拒绝多少条(wouldRefuse)、会多放行多少条(wouldAllow)、以及具体是哪些动作的裁决发生了变化、命中了哪条规则。规则先"彩排"再"上台",这正是治理功能敢被启用的原因。

五、相关文件导读

想继续深挖,这些文件值得收藏:

  • 策略引擎核心:server/src/computer/policy.ts
  • 历史回放与试运行报告:server/src/computer/policy-dry-run.ts
  • 动作网关(裁决 + 审计的执行入口):server/src/computer/gateway.ts
  • 后台 Boundaries 管理页:app/src/routes/_authed/admin/boundaries.tsx
  • 架构文档(含属性清单):docs/architecture.md
  • 策略环境变量与示例规则:.env.example
  • 引擎行为测试用例:server/tests/computer-policy.test.ts

六、写在最后

OpenBot 的 CEL 策略引擎把"信任问题"变成了"规则问题":

  1. 先审后行——每个动作过网关裁决,再落审计;
  2. 拒绝优先、默认拒绝、失败封闭——沉默和错误都只会让人更安全;
  3. 意图、元素、文件、命令、触发源多维度写规则——从"永不提交表单"到"无人值守不许碰终端",8 种方式覆盖智能体行为的每一扇门;
  4. dry-run + 历史回放——新规则先试错,再上岗。

把仓库克隆下来(仓库地址见上文项目信息),用 Docker Compose 拉起,你的 AI 同事就有了一台"装了门禁"的电脑。🔐

【免费下载链接】OpenBotOpen-source AI coworkers that each get a computer of their own: a browser, files and tools, with every action decided before it happens and recorded after. Bring any AG-UI agent.项目地址: https://gitcode.com/gh_mirrors/openb/OpenBot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询