openclaw深入深出:gateway设计思路的整体描述
整个openclaw设计中,gateway是最核心部分。如果把整个应用看做一个操作系统,那么gateway就是操作系统内核。它起到承上启下的核心作用。在系统启动时,gateway在创建后首先会创一系列建一系列核心服务,同时加载一系列管道 这些管道用于跟移动端的通讯软件连接以便接收来自通讯软件发送的任务请求。一旦请求信息通过管道发送给gatewy后,gateway会分析请求的内容,然后将请求分发给对应的核心服务。
由此gateway在整个openclaw体系中作为”control panel”的角色承担六种指着。这些职责分别为:连接管理,消息路由,会话管理,agent调度,工具基础设施,配置与运维。我们通过下图能清晰的了解gateway是如何”承上启下”的:

从上图可以看到,gateway“承上”的方式。在gateway内部抽象出了”channel”的概念,它其实是一个统一接口实例,这些实例内部通过调用不同的第三方库来连接不同的通讯软件。例如某个channel通过telegram提供的grammY库来建立与Telegram的通讯 另一个channel在实例化后使用Baileys库来建立与whatsapp客户端的通讯,与其他通讯软件客户端的连接类似,只要有了对方提供的sdk或者库,那么gateway就能创建对应的channel实例来与对方建立连接。需要注意的是,channel其实是gateway内部的插件实例, 他们其实是预先开发的代码,一旦gateway启动后就会加载这些代码,于是channel和gateway属于同一进程。一旦客户端有需求需要处理时,客户端发送的信息就会通过channel传递给gateway内核,后者就会把请求分发给对应的agent进行处理。
从上图还能看出gateway如何“启下”。gateway启动后还会激活一系列预先配置好的agent,这些agent负责将请求提交给它对应的大模型。由于agent只是执行具体“脏活累活”的工具,当任务需要定时执行给定任务时,例如“每两个小时帮我检查邮箱,查看是否有公司发给我的特定邮件,然后根据邮件内容帮我执行相应回复”。 对于这种任务agent知道如何调用大模型分析邮箱查找是否有特定邮件,如果找到就把邮件内容提交给大模型让其创建回复内容,然后agent会执行回复操作。问题在于agent自己不能”每两个小时”自动激活自己去执行任务.负责”定时激活”任务的工具就是上图中”基础设施”部分的cron,后面我们会看到其对应代码为server-cron.ts, 当每过去两个小时,对应的cron进程就会触发然后启动对应的agent,这时gateway就会构造任务上下文,例如”检查邮箱,查看是否有来自前端项目组的邮件,如果邮件询问后端数据库模块的接口是否完成,那么回复对方接口将在今天下班时给出”,这样agent拿到上下文后,将目前邮箱里的邮件抽取出来提交给llm,并将大模型回复的内容发送给对应邮件的发送方。 这里需要注意的是,cron定时任务执行时,用户可能不在电脑前面,当任务需要执行特定危险操作,例如”回复邮件后将相应邮件进行删除”,这种操作往往需要用户进行授权,如果此时用户不在,那么就可以由上图中的”Operator App”来作为异步审批的功能。
对于上面的任务,如果邮箱需要通过浏览器打开,那么就涉及到”基础设施”部分的浏览器.首先gateway充当代理服务器的功能.当agent需要打开某个网页时,它不能直接调用浏览器,而是将请求先发送给gateway,在收到请求后gateway先查看指定指令是否允许执行,例如某些特定网页不允许打开,那么gateway就能拒绝这些请求.如果允许,gateway可以通过Playwright等库来对浏览器进行操作.同时gateway在这个过程中承担会话管理的功能,浏览器登录状态,Cookie等敏感信息由gateway维护,对agent透明,这样能提供安全性.
至于节点调用,主要涉及到你电脑端硬件功能的使用.如果agent执行任务时需要使用硬件提供的功能,例如录屏,录音等,这就需要gateway提供中间层接口的作用.首先gateway启动时会执行”能力注册”,也就是搞清楚当前运行的设备上都有哪些硬件能力可以被调用,这时需要上图中”node客户端”来发挥能力注册功能,这也是openclaw自己附带的模块功能,在不同系统上运行时对应的节点程序就会运行,这些节点程序会暴露当前设备所能提供的硬件功能,运行在macos上的节点程序会调用macos提供的API来查询都有哪些硬件可用,例如摄像头,录屏,文件系统等,这些能力就会注册到gateway,其他节点程序功能也类似,运行在iphone上的节点就会调用ios的API来查询当前设备的硬件功能,然后提供给gateway.当agent执行任务时需要”一张现场照片”,agent就会将请求:”我要拍照”发送给gateway,如果当前openclaw运行在手机上,那么当前的node客户端程序在启动时已经将手机的硬件功能告知给了gateway,后者就会知道”我当前所在设备是iphone15,设备上的摄像头正常运作,现在我可以把拍照这个请求发送给node客户端程序”,node客户端收到指令后调用摄像头执行拍照任务,然后将拍摄的照片发送给gateway,然后gateway再把照片提供给agent.
Operator同样也是openclaw根据不同操作系统提供的用于”管理功能”的应用程序.如果运行在macos上,那么openclaw运行的是菜单栏app,这个程序会主流在屏幕顶部菜单栏的小图标,点击后会展开控制面板界面.它常驻后台,能够及时给用户提供系统级通知,例如agent需要删除某些邮件时,这个通知就会以弹窗的方式通知用户.CLI是命令行程序,可以运行在所有支持命令行的系统,用户可以通过这个命令行程序,通过发送指令的方式跟Openclaw互操作,例如执行”openclaw operator status”,那么这个命令就会让openclaw返回当前的状态.web控制台是运行在浏览器的程序,openclaw内部附带一个小型web服务器,当用户使用web打开本地url,例如”http://localhost:18789/dashboard”(举例),那么页面会打开一个面板UI,用户可以从面板UI来实现openclaw的互操作.
最后我们看看一次消息处理的联动过程:

如果我们想远程让openclaw清理电脑磁盘,那么我们可以在telegram特定频道发送”帮我清理磁盘”这个命令.由于openclaw通过channel程序实例运行了telegram提供的grammY库建立了连接,于是消息就能通过telegram客户端传达到telegram服务器,然后通过channel发送给运行在本地的Openclaw.收到”帮我清理电脑磁盘”这个语言请求后,openclaw把这个文本发,它会查看当前哪个agent时候执行这个任务,然后启动agent,结合请求来构造提示词后发送给agent,后者将提示词发送给大模型,大模型将提示词转换为具体的指令例如”rm -rf /tmp/cache”.由于该指令涉及到删除文件等微信操作,gateway就把指令提交给运行在当前操作系统上的operator程序,如果用户预先设置了权限规则,那么operator查询规则后发现可以执行删除操作,于是operator把审批结果提交给gateway,gateway收到允许执行的结果后,要求agent执行删除指令,agent则调用工具,例如启动控制台执行rm指令,执行指令后将执行结果返回给gateway,gateway再通过channel把执行结果发送给telegram客户端.
这里我们只给出大概说明,每个模块例如channel如何建立,operator和node客户端的内部设计等我们将在后续章节进行详解
夜雨聆风