1. 项目概述:Cellar,一个真正能用的AI智能体计算机运行时
如果你正在构建或使用AI智能体(Agent)来自动化操作电脑——比如让它在浏览器里填表单、在桌面应用里导数据,或者完成一套跨浏览器和本地软件的复杂工作流——那你大概率已经受够了“截图+视觉模型”这套方案的折磨。速度慢、成本高、识别不准,一个弹窗就能让整个流程陷入死循环。这感觉就像让一个蒙着眼睛的人去操作电脑,全靠猜,效率可想而知。
我花了大量时间在实际项目中应用各种AI智能体方案,从简单的浏览器自动化到复杂的跨应用RPA,痛点非常明确:现有的方案要么太“笨”(纯视觉,贵且慢),要么太“窄”(只支持浏览器,离不开DOM)。直到我深度使用并研究了Cellar这个项目,才感觉找到了一个真正面向生产环境的解决方案。它不是一个玩具,而是一个基于混合感知(Hybrid Perception)架构的计算机运行时,核心思想是“结构优先,视觉兜底”。简单说,它能像人一样“看到”屏幕上的按钮、输入框是什么(通过系统无障碍接口、浏览器开发者协议),而不是每次都把整个屏幕当成一张图片去猜。这带来的性能、准确性和成本优势是颠覆性的。
Cellar 原生支持Model Context Protocol,这意味着你可以直接在Claude Code、Cursor以及任何支持 MCP 的 IDE 或工具中,获得四个开箱即用的强大工具(cel_see,cel_act,cel_think,cel_perceive),让你的AI助手瞬间获得“眼”和“手”,去操作你电脑上的任何应用。更关键的是,它是开源的(Apache 2.0),用 Rust 和 TypeScript 构建,没有云依赖,你的API密钥和数据都留在本地。
2. 核心架构解析:为什么“混合感知”是破局关键
要理解 Cellar 的价值,得先看看主流方案的局限性。当前AI智能体操作计算机,无外乎两种路径:
- 纯视觉流(Screenshot-only):每一步操作前,先截屏,然后把图片喂给 GPT-4V、Gemini Vision 这类多模态大模型,问它“按钮在哪?”“输入什么?”。问题显而易见:延迟高(每次调用都需网络传输和模型推理)、成本贵(高分辨率图片的视觉调用不便宜)、稳定性差(模型可能“幻觉”出按钮位置,对动态内容、微小UI变化不敏感)。
- 纯浏览器流(Browser-only):通过 Chrome DevTools Protocol 直接操作DOM。这很快、很准、很便宜,但能力被禁锢在浏览器标签页内。一旦工作流需要切换到桌面邮件客户端、Excel 或 Finder,智能体就“失明”了,流程就此中断。
Cellar 提出的“混合感知”巧妙地融合了多种技术,构建了一个分层的、择优而用的感知系统。它的核心引擎叫Cortex,持续维护着一个对屏幕状态的“世界模型”。
2.1 感知源融合:从“盲人摸象”到“全局透视”
Cellar 的感知层(cel-context)会并行从多个源头获取屏幕信息,并融合成一个统一的、结构化的上下文数据流。每个UI元素都会附带一个置信度分数,告诉上层的智能体“这个信息有多可靠”。
- 第一优先级:无障碍接口。在 macOS 上,这是
AXUIElementAPI;在 Linux 上是AT-SPI2。这是操作系统为辅助功能提供的标准接口,能直接获取窗口、按钮、文本框的层级结构、角色、名称、值、位置等原生语义信息。这相当于直接读取了应用的“源代码”,是最准确、最快速的方式。对于原生 macOS 应用(如 Finder、Notes、Terminal)和许多桌面软件,这是唯一可靠的感知方式。 - 第二优先级:Chrome DevTools Protocol。当目标在浏览器内时,Cellar 通过 CDP 直接获取 DOM 树和 CSS 样式。这比无障碍接口更细致,能获取更丰富的网页特定属性(如 CSS 选择器)。CDP 也是执行浏览器内操作(点击、输入、执行JS)最高效的通道。
- 第三优先级:原生平台API。针对一些特定应用或场景的优化接口。
- 最后兜底:视觉模型。当前面所有结构化方法都失效时(例如,UI元素是纯图片、自定义绘制控件),Cortex 才会调用视觉模型进行分析。此时,由于其他源已经提供了屏幕的大致结构和区域,视觉模型只需要对特定区域进行高精度分析,而非处理整张截图,极大降低了调用频率和成本。
这种“结构优先”的策略,使得 Cellar 在绝大多数操作中完全不需要调用昂贵的视觉模型,单步操作延迟从秒级降至百毫秒级,且准确性极高。
2.2 连续感知与状态保鲜:解决“点击幽灵按钮”问题
一个更隐蔽但致命的问题是“陈旧状态”。想象一下:智能体发出一个点击指令,但在指令到达前,屏幕上弹出了一个提示框。如果智能体基于旧的屏幕截图去点击,就会点错位置,甚至造成破坏。
Cellar 的 Cortex 引擎核心功能之一就是连续感知和变化追踪。它不是每次被询问时才“看”一眼屏幕,而是在后台以可配置的频率(例如每秒数次)持续感知屏幕状态。它会为每个UI元素维护一个“新鲜度”状态:
- Fresh:元素状态是最新的,与当前屏幕显示一致。
- Soft-stale:元素可能发生了变化,但大概率还是可交互的。智能体可以尝试操作,但需要更谨慎。
- Hard-stale:元素已经消失或发生根本性变化(如窗口关闭)。基于此状态的操作将被阻止,并向上层报告错误。
当cel_act工具执行一个点击操作时,Cortex 会检查目标元素的新鲜度。如果状态是 hard-stale,它会直接返回错误:“你要点的按钮已经不见了”,而不是盲目地往旧坐标上发送点击事件。这从根本上避免了智能体基于过期信息行动导致的混乱和崩溃,是构建可靠自动化工作流的基石。
2.3 模块化架构:清晰的责任边界
Cellar 的代码结构清晰地反映了其设计思想。cel/目录下的 Rust 模块是核心引擎:
cel-accessibility/cel-cdp:是与操作系统和浏览器通信的“眼睛”。cel-cortex:是持续运转的“大脑”,负责融合信息、维护世界模型、判断新鲜度。cel-input:是执行操作的“手”,负责注入鼠标键盘事件。cel-planner/cel-goal-runner:是“策略中心”,实现观察-规划-执行循环和自主目标运行。
而mcp-server/和agent/目录则提供了与外部AI智能体交互的“语言”(MCP协议)和“翻译官”。这种分离使得核心引擎可以独立进化,而上层接口可以适配不同的AI模型和客户端。
3. 实战入门:五分钟内让 Claude 学会操作你的电脑
理论说再多,不如亲手试试。最快体验 Cellar 威力的方式,就是把它接入 Claude Code(或 Cursor)。下面我以 Claude Code 为例,带你走通全流程。
注意:截至本文撰写,Cellar 对 macOS 的支持最完善,Linux 次之,Windows 正在规划中。以下操作基于 macOS。
3.1 安装与配置:一条命令的事
Cellar 提供了极其便捷的 npm 安装方式。你不需要克隆源码或安装 Rust 环境。
定位 MCP 配置文件。Claude Code 需要通过 MCP 配置文件来发现和管理工具。
- 打开 Claude Code,进入设置(Settings)。
- 找到“Developer”或“MCP Servers”相关选项。通常,它会显示配置文件的路径,类似
~/.config/claude-code/mcp.json或~/Library/Application Support/ClaudeCode/mcp.json。 - 如果找不到,可以在 Claude Code 内使用快捷键
Cmd + Shift + P,搜索 “MCP”,通常会有打开配置的选项。
编辑 MCP 配置文件。用你喜欢的文本编辑器打开该文件。如果文件不存在,就创建一个。
- 你需要配置一个 MCP 服务器,指向 Cellar 的 npm 包。同时,需要配置 LLM 提供商(以 Gemini 为例,你也可以用 OpenAI、Anthropic 或本地 Ollama)。
{ "mcpServers": { "cellar": { "command": "npx", "args": ["-y", "@dpagk/cellar-mcp"], "env": { "CEL_LLM_PROVIDER": "gemini", // 或 "openai", "anthropic", "ollama" "CEL_LLM_API_KEY": "你的_Gemini_API_密钥", // 可选:指定模型,默认为对应提供商的最新快速模型 // "CEL_LLM_MODEL": "gemini-2.0-flash-exp" } } } }实操心得:
npx -y会确保每次启动时使用最新版本的@dpagk/cellar-mcp包。如果你追求稳定性,可以先在全局安装一个特定版本(npm install -g @dpagk/cellar-mcp@x.x.x),然后将command改为cellar-mcp,args留空。重启 Claude Code。保存配置文件后,完全关闭并重新启动 Claude Code。重启后,Claude Code 会读取配置,启动 Cellar MCP 服务器进程。
验证连接。启动后,你可以尝试在聊天框中输入
/,看看是否有 Cellar 提供的工具出现。更直接的方式是,直接对 Claude 说:“看看我的屏幕现在有什么?” 或者 “列出当前最前面的窗口”。如果配置成功,Claude 会调用cel_see工具并返回结构化的屏幕信息。
3.2 四大工具详解:智能体的“瑞士军刀”
连接成功后,Claude 就获得了四个强大的工具。理解每个工具的用途和模式,是高效协作的关键。
3.2.1cel_see:智能体的“眼睛”
这是最常用的工具,用于获取屏幕状态。它有很多模式,适应不同场景:
cel_see active_window:获取当前活动窗口的详细信息。这是最快速的概览。cel_see focused:获取当前获得焦点的元素(如光标所在的输入框)。cel_see under_cursor:获取鼠标指针下方的元素。cel_see from_point:获取屏幕上特定坐标(x, y)处的元素。cel_see with_screenshot:在返回结构化数据的同时,附带一张屏幕截图(base64编码)。这在需要视觉确认或向用户展示时非常有用。
使用示例:当你对 Claude 说“我正在用 Safari 浏览 GitHub,帮我看看页面上有哪些仓库链接?” Claude 可能会内部调用类似cel_see active_window的命令,然后从返回的数百个元素中,过滤出role为link且label包含仓库名的元素,整理后呈现给你。
3.2.2cel_act:智能体的“手”
这是执行具体操作的工具。它支持多种动作,并且可以通过不同方式指定目标:
- 指定方式:
by_id: 使用cel_see返回的元素唯一ID进行精确操作。by_coordinates: 直接指定屏幕坐标 (x, y)。谨慎使用,容易因UI变化而失败。by_accessibility: 使用无障碍属性(如角色和名称)来查找元素。更健壮。
- 动作类型:
click/double_click/right_clicktype_text: 向焦点元素或指定元素输入文本。key: 发送按键序列(如Cmd+C)。scroll: 滚动窗口或元素。drag: 拖拽操作。cdp_eval:高级功能,直接在浏览器上下文中执行 JavaScript 代码。这开启了无限可能,例如读取网页变量、操作复杂网页组件。
使用示例:你可以对 Claude 说:“帮我在Finder里,把‘下载’文件夹中的‘project.zip’文件拖到‘桌面’上。” Claude 需要先cel_see定位这两个元素,然后调用cel_act drag,指定源元素ID和目标元素ID。
3.2.3cel_think:智能体的“工作记忆与规划器”
这个工具用于更复杂的、多步骤的任务管理和内部推理。
plan:将一个高级目标(如“将这份文档中的表格数据整理到Excel中”)分解成一系列具体的cel_see和cel_act步骤。run_goal:自主执行模式。给它一个目标,它会自动循环执行“观察-规划-执行”,直到目标达成或无法继续。这是实现完全自动化工作流的核心。remember/recall:在任务执行过程中存储和检索关键信息(如某个文件的路径、某个按钮的ID),避免重复查找。track:管理并查看当前正在运行或历史的任务流。
注意事项:
run_goal功能强大,但也存在风险。务必在安全、可控的环境下测试,并为其设定清晰的边界和停止条件,防止其进入不可控的操作循环。建议初期先使用plan模式,让 Claude 把步骤列出来给你确认,再手动或分步执行。
3.2.4cel_perceive:与持续运转的Cortex交互
这个工具用于管理和查询后台的连续感知引擎(Cortex)。
start/stop:手动控制Cortex的启停。通常Cortex会在MCP服务器启动时自动运行。status:查看Cortex的运行状态和资源使用情况。query:向Cortex的世界模型发起一次查询,例如“当前屏幕上所有状态为‘可点击’的元素有哪些?”。
这个工具通常用于调试和监控,在普通使用场景下,cel_see的调用会自动利用Cortex维护的最新状态,无需直接操作cel_perceive。
3.3 本地模型集成:完全离线的可能性
对于隐私要求极高的场景,Cellar 支持完全离线运行。它可以通过CEL_LLM_PROVIDER=ollama配置,连接到本地运行的 Ollama 服务,使用诸如Gemma 4、Llama 3等轻量级模型。
- 安装并启动 Ollama。从官网下载 Ollama,并启动服务。在终端拉取一个模型,例如:
ollama pull gemma2:2b。 - 修改 Cellar 配置。将 MCP 配置文件中的环境变量改为:
"env": { "CEL_LLM_PROVIDER": "ollama", "CEL_LLM_MODEL": "gemma2:2b", // 你拉取的模型名 "CEL_LLM_API_KEY": "not-needed", // Ollama 通常无需API Key "CEL_OLLAMA_BASE_URL": "http://localhost:11434" // Ollama 默认地址 } - 重启 Claude Code。之后所有的规划、决策(由
cel_think或 Claude 自身完成)都将由本地模型处理,屏幕感知和操作本身也是本地的,实现了端到端的隐私保护。
实操心得:本地小模型的逻辑推理和规划能力与 GPT-4/Gemini 等顶级模型有差距,可能导致复杂任务分解失败。但对于定义清晰、步骤固定的自动化任务(如“每天上午9点打开某个网页点击下载报告”),本地模型完全够用,且成本和隐私优势巨大。这是一种典型的权衡。
4. 高级应用与开发:构建你自己的智能体工作流
当你熟悉了基本工具后,就可以利用 Cellar 构建更强大的自动化解决方案了。它不仅仅是一个给 Claude 用的插件,其 MCP 服务器接口意味着任何能说话 MCP 协议的程序都可以驱动它。
4.1 跨应用工作流实战:浏览器数据导入本地表格
这是一个经典场景:从网页上抓取数据,然后填入本地的 Numbers 或 Excel 表格。纯浏览器自动化工具在此处无能为力。
假设任务:从 GitHub Trending 页面获取今日热门 Rust 项目列表,并填入 Numbers 表格。
Cellar 赋能的工作流:
- 规划阶段:你向 Claude 描述任务。Claude 内部调用
cel_think plan,生成大致步骤:打开浏览器导航至 GitHub Trending -> 筛选 Rust 语言 -> 获取项目名、星数等元素 -> 打开 Numbers -> 创建新表格 -> 按行填入数据。 - 执行阶段:
- Claude 调用
cel_act在浏览器中点击筛选按钮,选择 Rust。 - 调用
cel_see获取页面项目列表的结构化数据。由于是网页,Cellar 会优先通过 CDP 获取 DOM,能精准拿到每个<article>块内的<h2>、<span>文本,而无需视觉识别。 - Claude 解析数据,然后调用
cel_act激活 Numbers 应用(通过 macOS 快捷键Cmd+Space打开 Spotlight 输入 “Numbers” 并回车)。 - 在 Numbers 中,Claude 需要操作的是原生 macOS 应用。此时,
cel_see会通过无障碍接口 (AXUIElement) 获取 Numbers 的菜单、按钮、表格单元格信息。它可能会发现“新建表格”按钮的AXRole是AXButton,AXTitle是“新建”。 - 调用
cel_act click,使用by_accessibility方式定位并点击“新建”按钮。 - 接着,
cel_see定位到表格的第一个单元格(AXRole: AXCell,AXRowIndex: 0,AXColumnIndex: 0),然后cel_act type_text将第一个项目名输入。 - 循环此过程,直至所有数据录入完成。
- Claude 调用
整个过程中,Cellar 的 Cortex 引擎在后台默默工作。当焦点从浏览器切换到 Numbers 时,Cortex 无缝切换了感知源(从 CDP 到 AXUIElement),但为上层智能体提供的 API 是统一的 (cel_see)。智能体无需关心底层是浏览器还是桌面应用,它只需要说“点击那个叫‘新建’的按钮”,Cortex 会负责找到它并执行。这就是“一个运行时,统一所有界面”的魅力。
4.2 为特定应用编写适配器
虽然 Cellar 通过通用无障碍接口能处理很多应用,但某些复杂或自定义的桌面应用(如游戏、专业图形软件)的无障碍树可能不完善或信息稀疏。这时,你可以为它编写一个应用专属适配器。
适配器位于adapters/目录下,本质是一个实现了特定接口的插件,能提供比通用无障碍接口更丰富、更准确的元素信息和操作能力。例如,为 Photoshop 编写适配器,可以暴露“当前选中的图层名称”、“工具箱中的画笔大小”等专业属性。
开发适配器的大致步骤:
- 在
adapters/下创建新目录,如photoshop/。 - 实现
ApplicationAdaptertrait(Rust)或对应 TypeScript 接口。核心方法是snapshot() -> Vec<UiElement>,用于返回当前应用窗口的结构化元素树。 - 利用应用的官方脚本接口(如 Photoshop 的 ExtendScript)、私有 API 或 UI 自动化工具来获取信息。
- 将适配器注册到 Cellar 的运行时中。Cellar 在感知时,会优先检查是否有当前活跃应用的专属适配器,有则用之,无则回退到通用无障碍接口。
这为社区生态提供了扩展性,让 Cellar 的能力边界可以不断延伸。
4.3 集成到自定义 Agent 框架
如果你有自己的 AI Agent 框架(比如用 LangChain、AutoGen 或自定义 Python 脚本搭建的),你也可以直接集成 Cellar 的 MCP 服务器。
MCP 是一个基于 JSON-RPC 的协议。你的框架可以作为一个 MCP 客户端,通过标准输入/输出或 HTTP 与cellar-mcp进程通信。
简化流程:
- 启动
cellar-mcp子进程。 - 通过 MCP 初始化握手。
- 调用
tools/list获取cel_see等工具的描述。 - 调用
tools/call来执行工具,例如{"name": "cel_see", "arguments": {"mode": "active_window"}}。 - 解析返回的结构化数据,用于你的 Agent 决策。
这样,你就将强大的混合感知和操作能力,注入到了你自己的智能体系统中。Cellar 负责“感知和操作物理世界”这个复杂问题,你的 Agent 则可以专注于更高层的任务规划和逻辑推理。
5. 性能调优与故障排查
在实际使用中,你可能会遇到性能问题或操作失败的情况。以下是一些常见问题的排查思路和优化建议。
5.1 性能瓶颈分析
Cellar 的性能主要消耗在几个环节:
感知延迟:
cel_see调用慢。- 原因A:无障碍树过于庞大(例如,一个非常复杂的网页或 IDE)。Cellar 需要遍历和序列化整个树。
- 解决:使用更精确的
cel_see模式,如focused或under_cursor,而不是每次都获取整个active_window。或者在规划时,让 Agent 更精确地描述要查找的元素特征,减少需要处理的数据量。 - 原因B:视觉兜底被频繁触发。这说明当前应用的无障碍或 CDP 信息质量很差。
- 解决:考虑为这个应用编写适配器,或者调整视觉模型的调用策略(如果支持配置)。检查是否可以使用
cel_perceive query来利用 Cortex 缓存的、可能稍旧但更快的数据。
操作失败:
cel_act点击没反应或点错。- 原因A:元素状态已过期(hard-stale)。这是 Cortex 的防护机制在起作用。
- 解决:在 Agent 的流程中增加重试逻辑。失败后,先调用一次
cel_see刷新状态,再重新定位元素并操作。确保操作序列之间有足够的间隔,让UI有响应时间。 - 原因B:元素定位方式不稳健。使用
by_coordinates最容易失败。 - 解决:永远优先使用
by_id或by_accessibility。cel_see返回的元素 ID 在短时间(同一会话)内是稳定的。无障碍属性(角色、名称)也比绝对坐标可靠得多。 - 原因C:权限问题。在 macOS 上,Cellar 需要“辅助功能”权限才能控制电脑。
- 解决:前往
系统设置 > 隐私与安全性 > 辅助功能,确保你使用的终端(如 Terminal、iTerm)或 IDE(如 Claude Code)已被勾选。如果通过 npm 安装,可能还需要授权给 Node.js。
5.2 配置优化建议
通过环境变量可以微调 Cellar 的行为:
CEL_CORTEX_POLL_INTERVAL_MS: 控制 Cortex 后台刷新屏幕状态的频率(毫秒)。降低频率(如设为 1000)可减少 CPU 占用,但可能增加状态过期的风险。提高频率(如 200)则更实时,但负载更高。默认值通常是一个平衡点。CEL_VISION_PROVIDER和CEL_VISION_MODEL: 当需要视觉兜底时,可以指定不同的视觉模型提供商和模型。例如,可以配置为使用本地的llava模型通过 Ollama 运行,实现完全离线的视觉分析。CEL_LOG_LEVEL: 设置为debug可以输出大量详细日志,用于排查问题。在生产或日常使用时,建议设为info或warn。
5.3 常见错误与解决
| 错误现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 启动 Cellar MCP 服务器失败 | Node.js 版本不兼容或依赖安装失败 | 1. 检查 Node.js 版本(需 >= 18)。 2. 尝试全局安装 @dpagk/cellar-mcp:npm install -g @dpagk/cellar-mcp,然后将配置中command改为cellar-mcp。 |
| Claude 无法调用 Cellar 工具 | MCP 配置错误或服务器未启动 | 1. 检查 Claude Code 配置文件的 JSON 语法是否正确。 2. 重启 Claude Code,观察启动日志中是否有 Cellar 相关的错误。 3. 在终端手动运行 npx -y @dpagk/cellar-mcp,看能否启动。 |
cel_act操作无任何效果 | 缺乏辅助功能权限 | 1. 前往 macOS 系统设置的“辅助功能”列表,添加你的终端或 IDE。 2. 重启 Cellar MCP 服务器和 Claude Code。 |
cel_see返回的元素信息为空或很少 | 目标应用不支持无障碍接口或支持很差 | 1. 尝试对 Safari/Chrome 等标准应用操作,确认基础功能正常。 2. 对于目标应用,考虑是否必须依赖视觉兜底,或为其开发适配器。 |
任务在run_goal中陷入循环 | Agent 规划逻辑有缺陷或无法识别任务完成状态 | 1. 为run_goal设置明确的超时时间或最大步骤数。2. 先用 plan模式查看分解的步骤是否合理。3. 在目标中定义更清晰的完成条件。 |
6. 展望与生态:Cellar 的未来及社区角色
Cellar 目前处于快速发展的早期阶段,但其设计理念和已经实现的核心功能,已经为解决“AI智能体操作真实计算机环境”这一难题提供了目前看来最优雅和实用的方案。它的路线图也揭示了其向生产级、规模化发展的野心。
短期价值:对于开发者、测试工程师和效率追求者,Cellar 现在就是一个能立即提升工作效率的“神器”。将繁琐、重复的跨应用数字任务交给一个由自然语言驱动的智能体,其解放生产力的程度不亚于当年从命令行切换到图形界面。
长期想象:随着Worker Protocol和Docker 镜像的推出,Cellar 的能力可以被封装成服务,在远程服务器上运行浏览器或虚拟桌面环境,执行自动化任务。结合Managed Cloud的愿景,未来可能会出现基于 Cellar 的“自动化工作流即服务”平台。社区贡献的Adapter 市场则能形成一个生态,让任何软件都能被轻松地接入这个智能自动化网络。
作为用户或贡献者,你现在可以做什么?
- 深度使用并反馈:在你的真实工作流中尝试 Cellar,将遇到的边界情况、Bug 或新需求提交到 GitHub Issues。真实场景的打磨是开源项目成熟的关键。
- 贡献适配器:如果你常用的某个专业软件(如 Figma, Final Cut Pro, Logic Pro)自动化需求强烈,而通用无障碍支持不佳,尝试为它编写一个适配器。这不仅能解决你自己的问题,也能惠及整个社区。
- 参与协议与工具建设:MCP 工具的设计、Worker Protocol 的规范定义,都需要社区的智慧和实践。如果你对分布式系统、协议设计感兴趣,这里有广阔的参与空间。
在我个人看来,Cellar 代表的不仅仅是一个工具,而是一种范式转变:AI 智能体不应只是一个聊天机器人,它应该成为我们数字世界的一个“原生居民”,能够像人一样观察、理解和操作各种软件界面。Cellar 通过混合感知和统一的运行时,正在为这个未来铺设一条坚实可靠的道路。它的出现,让“每个人都有一个数字助理”的愿景,离现实又近了一大步。