
从 RPA 到桌面 Agent这条线我算是全程经历过来的。早年做自动化不是按键精灵就是 iMacro后来影刀、UiPath 这类 RPA 工具火起来确实解决了不少重复劳动。但用久了你会发现传统 RPA 的本质还是脚本 规则流程一复杂维护成本就直线上升。最近这段时间我开始深度使用 Crayfish 配合 WorkBuddy 容器版这套桌面 Agent 方案说实话体验和传统 RPA 完全是两个物种。这篇文章我就从实际使用角度聊聊 Crayfish 和 WorkBuddy 容器版到底能做什么、怎么部署、以及它相对 RPA 的真实优势在哪里。如果你正在纠结选型或者已经在用 RPA 但被各种脚本维护、环境兼容问题搞得头疼这篇文章应该会对你有帮助。我会把架构思路、部署步骤、常见坑全部写出来尽量做到照着操作就能跑通。1. 内容整体设计与思路拆解1.1 从 RPA 到桌面 Agent自动化工具的进化逻辑先把一个很容易混淆的概念说清楚RPA 和桌面 Agent 不是同一个层面的东西。RPA 的核心是流程自动化它帮你把鼠标键盘操作录下来、写成脚本然后按照既定规则去执行。适合的场景是操作路径固定、业务流程明确、输入输出可预期。说白了它解决的是重复劳动。桌面 Agent 的核心则是意图自动化。它不只是帮你点鼠标敲键盘而是先理解你的目标再自己规划要调用哪些工具、按什么顺序执行、遇到异常怎么处理。Crayfish 就是干这个的桌面端运行环境而 WorkBuddy 容器版则是大脑和调度中心——你告诉它帮我整理今天所有文档并归档它会把任务拆解成若干个步骤再让 Crayfish 去桌面环境里实际执行。这个差异带来的直接变化是传统 RPA 的脚本一旦页面改版、按钮挪位置马上失灵而桌面 Agent 因为带了一层语义理解能力UI 变化的容错率会高很多。1.2 Crayfish 与 WorkBuddy 容器版在架构里的角色我第一次看到这套组合的时候第一反应是Crayfish 负责手WorkBuddy 负责脑。Crayfish 是一个运行在桌面端的 Agent 运行时它不是独立的应用程序更像是一个轻量的执行引擎。它负责和操作系统、桌面应用打交道比如读取窗口信息、模拟鼠标键盘输入、捕获屏幕内容、调起某个软件执行动作。它暴露的是一组和桌面环境交互的能力接口上层可以调用这些接口来完成真实的操作。我自己测试下来它对 Windows 下的多数桌面应用、Linux 下的 X11/Wayland 会话都能正常接管。WorkBuddy 容器版则是把 WorkBuddy 服务封装进 Docker 容器里运行在服务器或者本地开发机上。WorkBuddy 本身是一个工作台性质的服务它可以管理多种 Agent、技能Skill、连接器还可以编排复杂的业务流程。容器化之后它和桌面端之间的通信通过网络完成架构上更加解耦。用一句话概括这套结构WorkBuddy 容器版负责思考与编排Crayfish 负责动手操作两者通过 API/消息通道协作。1.3 为什么一定要把 WorkBuddy 容器化我在做 WorkBuddy 本地部署的时候最开始也是直接装在物理机上的。后来遇到几个问题第一依赖环境太容易冲突。WorkBuddy 依赖的 Python、Node.js 版本还有一堆 AI 相关的库只要机器上别的项目动一下依赖WorkBuddy 就可能起不来。容器化之后所有依赖都锁在镜像里再也不用担心在我机器上是好的这种问题。第二迁移和备份非常方便。整个 WorkBuddy 服务就是一个容器想迁移到别的机器打包镜像或者导出数据卷就行几分钟搞定。第三多实例隔离。我经常需要同时跑几套不同的业务配置比如一套用于测试、一套用于生产。容器化可以做到目录隔离、端口隔离互不干扰。这三条理由基本就是我坚定选择 WorkBuddy 容器版的核心原因。你如果也打算把这套东西落地到自己的工作流里直接上容器版别走弯路。2. 核心细节解析与实操要点2.1 桌面 Agent 的四大核心能力拆解一套合格的桌面 Agent 方案至少要具备四个能力模块。拆开来看你就知道 Crayfish 它的设计逻辑是什么。UI 感知能力Agent 要能看懂屏幕上有什么。Crayfish 在底层实现了对窗口树、控件属性的读取同时支持截屏后做图像识别。前者适合原生应用后者适合 Web 页面或者某些自绘 UI。对比传统 RPA 主要靠坐标点和图像锚点Crayfish 多了一个语义层它不只是知道这个按钮在坐标 (500, 300)而是知道这是一个保存按钮。应用操作能力感知之后还得能操作。Crayfish 支持的输入模拟分为硬件级和API 级。硬件级是直接调用系统输入事件适合游戏或特殊应用API 级是调用 UI Automation / Accessibility 接口精度更高适合常规桌面软件。实际推荐优先用 API 级操作稳定性和速度都更好。任务编排能力这一块主要靠 WorkBuddy 实现。你可以通过可视化流程设计器拖拽出一个任务流也可以用代码写一个 Skill。WorkBuddy 负责把任务分解、排序、管理状态并在多个任务之间传递上下文。异常处理能力这是桌面 Agent 和传统脚本的最大分水岭。Crayfish 在操作失败时能捕获到异常信息比如窗口找不到、控件超时WorkBuddy 会基于这些信息决定是重试、跳过还是切换方案。传统 RPA 遇到异常只能干巴巴地报错而桌面 Agent 可以自主决策。2.2 容器运行时设计要点WorkBuddy 容器版的部署不是简单 docker run 一个镜像就完事。有几个运行时层面的设计要点直接影响稳定性和安全性。数据持久化WorkBuddy 的状态、配置、日志都存在容器里的数据目录所以必须用挂载卷把数据目录映射到宿主机上。我习惯把宿主机的 /data/workbuddy 目录挂载到容器的 /app/data这样升级镜像时不会丢配置。网络模式选择如果 Crayfish 和 WorkBuddy 部署在同一台机器可以直接用 host 网络模式减少一层 NAT性能更好。如果分开部署在不同机器就用 bridge 模式并做好端口映射。WorkBuddy 默认监听的服务端口需要根据你本地配置改一下环境变量。资源限制桌面 Agent 场景下 WorkBuddy 需要加载 AI 模型至少会用到一些在线推理服务内存占用不低。建议给容器预留至少 4GB 内存。用 --memory 参数限制住防止它在异常时吃光宿主机内存。CPU 可以限制到 2 核左右实测日常任务足够。健康检查与自启动做成 docker-compose 服务后加上 restart: unless-stopped 策略再加上 healthcheck这样宿主机重启后 WorkBuddy 会自动恢复并且时刻保证可服务状态。这批配置我会在下一章的部署教程里给出完整参考。2.3 WorkBuddy 容器版与 RPA 的真实差异这里必须说点掏心窝的话。我用了好几年 RPA现在转向桌面 Agent不是因为 RPA 完全没用而是它们的适用范围和心智模型根本不同。第一学习成本的重心不同。RPA 你学的是录制、选择器、变量绑定桌面 Agent 你学的是如何把任务描述清楚、如何写 Skill、如何编排意图。后者对人的逻辑能力和问题拆解能力要求更高但好处是一旦拆解好复用的效率更高。第二脚本脆弱性。传统 RPA 脚本对 UI 元素的变化几乎零容忍。按钮 id 变了、CSS 类名变了、窗口延迟加载了脚本就废。Crayfish 通过语义识别和自适应等待策略能够容忍一定程度的 UI 波动。我在实际测试中同一个任务在页面改版后 RPA 脚本 100% 挂Crayfish 这边只改了少量参数就继续跑通了。第三可扩展性。RPA 工具的扩展能力通常受限于厂商的插件体系。WorkBuddy 本身就是个开放平台你可以自定义指令、写自己的 Skill、接入任意 HTTP API。另外容器版还允许你直接在 WorkBuddy 容器里加装 Python 库、Node 模块自由度不是一个量级。第四业务设计模式。RPA 的中心是流程Agent 的中心是目标。用 WorkBuddy 容器版 Crayfish你可以把一个业务目标交给系统它自己去拆解。这个变化听起来简单实际带来的维护成本和容错能力的改善是很明显的。3. 实操过程与核心环节实现3.1 环境准备安装容器运行时与桌面端开始之前先准备环境。这套方案运行在 Linux 上最顺手Windows 上我也试过用 Docker Desktop但性能有损耗。如果你打算长期使用建议直接在 Linux 机器上跑。操作系统Ubuntu 22.04 / CentOS 7 / 麒麟 V10 都支持Docker Engine20.10 以上版本或者兼容的容器运行时Docker Compose建议 v2 以上显卡与驱动如果本地要跑视觉模型需要 NVIDIA Docker Runtime如果没有独立 GPU建议把视觉类的推理任务走在线接口桌面环境在需要执行桌面任务的那台机器上安装 Crayfish 客户端支持 Windows 10/11、Linux 桌面安装 Docker 的过程就不讲了官方文档很详细。装好后验证一下docker --version docker compose version然后从镜像仓库拉取 WorkBuddy 容器版镜像。假设你用的是官方镜像名执行docker pull workbuddy/workbuddy-container:latestCrayfish 桌面客户端从官网下载安装包或者用源码编译。它依赖的桌面环境接口比较多Windows 下装好大概率即点即用Linux 下则需要确认 X11 或者 Wayland 环境是否正常。3.2 部署 WorkBuddy 容器版的完整步骤我不建议直接裸跑 docker run 一堆参数最好用 docker-compose 统一管理。下面这份 compose 文件是我实际在用的模板version: 3.8 services: workbuddy: image: workbuddy/workbuddy-container:latest container_name: workbuddy hostname: workbuddy restart: unless-stopped ports: - 6800:6800 - 6801:6801 volumes: - /data/workbuddy/config:/app/config - /data/workbuddy/data:/app/data - /data/workbuddy/logs:/app/logs environment: - WB_MODEproduction - WB_PORT6800 - WB_AGENT_PORT6801 - TZAsia/Shanghai mem_limit: 4g cpus: 2.0 healthcheck: test: [CMD, curl, -f, http://localhost:6800/health] interval: 30s timeout: 10s retries: 3写入 /data/workbuddy/docker-compose.yml 后执行cd /data/workbuddy docker compose up -d docker compose logs -f看到类似 WorkBuddy server started 的日志就说明服务起来了。第一次启动会比较慢因为要做数据库初始化和模型预加载耐心等一下。启动后打开浏览器访问 http://宿主机IP:6800进入 WorkBuddy 管理界面。首次登录需要创建管理员账号然后配置 Agent 和连接器。3.3 配置 Crayfish 桌面 Agent 与 WorkBuddy 联动WorkBuddy 起来以后要把 Crayfish 注册进去。先把 Crayfish 客户端打开并登录——如果你是用本地模式它会启动一个本地代理服务默认监听端口 6750。然后在 WorkBuddy 管理界面里添加一个 Agent 类型为 Crayfish 的连接填三个信息Agent 名称随便起建议按机器区分比如 办公机-Crayfish地址填 Crayfish 客户端所在机器的 IP如果是本机就填 127.0.0.1端口默认 6750填好后WorkBuddy 会给 Crayfish 下发一个令牌。把令牌填到 Crayfish 客户端的配置里两边就握手成功了。在这个配置里遇到问题的情况我在第 4 章有针对性的排查记录。连接成功后建议先测试一下在 WorkBuddy 里创建一个简单的指令比如 打开计算器并输入 123如果 Crayfish 能正确执行说明整条链路已经通了。3.4 实战搭建一个基于自定义指令的业务自动化流程链路通了之后我们来做一个有实用价值的场景。就以钉钉多维表定期同步举例这个需求在后台问的人特别多。需求背景每天上午 9 点把本地表格里的数据同步到钉钉多维表。涉及动作打开本地 Excel、读取新增行、打开钉钉多维表、逐行填入、刷新数据。用 WorkBuddy 容器版 Crayfish 来实现步骤是这样的第一步在 WorkBuddy 里编写同步脚本Skill。WorkBuddy 支持用 Python 或 JS 编写 Skill。我下面的 Python 脚本思路可以作为参考import openpyxl import requests def sync_to_dingding(file_path, table_id, api_token): wb openpyxl.load_workbook(file_path) ws wb.active headers [cell.value for cell in ws[1]] for row in ws.iter_rows(min_row2, values_onlyTrue): if not any(row): continue record dict(zip(headers, row)) resp requests.post( fhttps://api.dingtalk.com/v1.0/multiDimension/{table_id}/records, jsonrecord, headers{x-acs-dingtalk-access-token: api_token}, ) print(sync result:, resp.status_code)这一步的目的是把业务逻辑写成一个可调用的组件WorkBuddy 可以在流程里直接引用它。第二步用 Crayfish 执行桌面端读取操作。WorkBuddy 编排任务时调用 Crayfish 执行以下动作打开本地 Excel 文件等待内容加载读取指定区域数据Crayfish 会把读取到的数据回传给 WorkBuddy数据传给 Skill 逻辑做后续处理这部分在 WorkBuddy 的流程设计器里是几个拖拽式的节点不需要写复杂代码。第三步配置定时触发。WorkBuddy 的定时任务器可以设置 cron 表达式。填0 9 * * *就表示每天早上 9 点执行。整套下来效果是到点后 WorkBuddy 自动唤醒 Crayfish 打开表格、读取数据再调用 Skill 同步到钉钉多维表全程无需人工干预。同样的思路你可以扩展到 Obsidian 笔记整理、建筑行业图纸归档、私人工作台自动搭建等场景。4. 常见问题与排查技巧实录4.1 容器启动失败和崩溃问题WorkBuddy 容器版启动失败我见过的高频原因有三个数据目录权限不对。容器内的进程默认以非 root 用户运行如果宿主机的挂载目录权限是 root 或者别的用户容器就没法写入。解决办法很简单chown -R 1000:1000 /data/workbuddy端口被占用。6800 或 6801 端口被宿主机上的其他服务占用了容器会一直重启。用ss -ltnp | grep 6800查一下把冲突解决掉。内存不足。如果你给容器限制了 2GB 内存而 WorkBuddy 需要加载的模型和数据超过了这个限制就会出现 OOM Killed。把 mem_limit 调高到 4GB 以上再观察。如果容器起来了但健康检查不过多半是服务启动时间超过预期。可以把 healthcheck 的 start_period 参数加上比如start_period: 60s给服务足够的预热时间。4.2 Crayfish 连不上 WorkBuddy 的排查思路Crayfish 和 WorkBuddy 握手失败是最常见的协作问题。我的排查顺序是先确认 Crayfish 本地 Agent 服务是否真的在监听。在 Crayfish 所在机器上执行curl http://127.0.0.1:6750/health如果返回正常再看网络连通性。Crayfish 和 WorkBuddy 如果在不同机器检查防火墙有没有放行 6750 和 6800、6801 端口。很多云服务器的安全组默认只放行 80 和 443容易踩这个坑。再确认令牌有没有填对。WorkBuddy 侧生成的令牌是一次性的如果 Crayfish 配置里带了多余的空格也会握手失败。建议先把令牌放到记事本里肉眼检查一下。4.3 自动化任务执行不稳定怎么办执行不稳定大部分是超时设置和等待策略的问题。桌面应用加载有快有慢Crayfish 默认的等待时间是 10 秒。遇到大型软件启动10 秒根本不够。我建议在 WorkBuddy 的任务配置里把关键步骤的超时时间从默认值改到 30 秒以上。还有一类情况是元素定位失败。如果目标软件窗口标题有动态变化比如文档 - Word这种建议用通配符匹配不要写死完整标题。这个在 Crayfish 的配置项里支持。4.4 升级与备份的避坑指南WorkBuddy 容器版升级镜像时最怕数据没挂载出来一升级配置全丢。所以再次强调config 和 data 目录必须挂载到宿主机。升级操作我建议这样执行docker compose pull docker compose up -d如果升级后发现问题可以快速回滚到旧版本docker compose down docker compose ps # 找到旧版镜像 tag docker compose up -d workbuddy:旧版本号另外WorkBuddy 的数据目录里可能有 SQLite 数据库备份前最好先把容器停掉避免备份出不一致的数据文件。备份时直接打包 /data/workbuddy 整个目录就行。5. 最后分享几点我个人很受用的经验这套方案我用了几个月最深的感触是你的重心要从写脚本转移到拆目标上来。传统 RPA 时代我 80% 的时间花在怎么写选择器、调坐标现在用 WorkBuddy 容器版我 80% 的时间在思考一个任务怎么拆解、怎么描述清楚、需要哪些 Skill。还有一个小技巧WorkBuddy 的 Skill 可以分得很细比如读取Excel是一个 Skill调用钉钉API是另一个 Skill。这样单个 Skill 简单、易测、好复用组合出的流程反而更稳定。我后来接手维护同事做的流程时这种细粒度拆分带来的好处特别明显。如果你之前用过影刀、UiPath 这类 RPA 工具刚开始转过来可能会不适应因为桌面 Agent 没有录制按钮了所有动作逻辑需要自己描述和组织。但一旦你度过适应期回过头再看那些需要大量维护的 RPA 脚本大概率不会再想回去了。这篇文章里提到的部署方式和测试场景是我实际跑通的。如果你想先自己体验一下 WorkBuddy 容器版建议先在本地用 Docker Compose 搭一套最小环境再把 Crayfish 接到同一台机器的桌面环境里跑一个最简单的打开记事本输入一句话的任务。跑通这个最小闭环剩下的扩展其实都是水到渠成的事。