1. 项目概述:当桌面 Agent 走进容器时代,Crayfish 与 WorkBuddy 的“轻装上阵”不是噱头
你有没有过这种体验:装一个桌面自动化工具,光是环境依赖就折腾掉一整个下午?Python 版本冲突、Node.js 太新导致插件报错、系统库缺失、权限配置绕来绕去……最后不是工具没跑起来,而是你的开发环境先“罢工”了。更别提团队协作时——A 同学在 macOS 上跑得飞起,B 同学在 Ubuntu 22.04 上卡在启动界面,C 同学想在公司内网离线部署,结果发现安装包里硬编码了某个境外 CDN 地址。这些不是段子,是过去三年我帮二十多家中小团队落地桌面自动化时,听到最多的真实抱怨。
而“Crayfish 与 WorkBuddy 容器版”这个标题,说的正是对这一整套顽疾的系统性外科手术。它不是简单地把旧程序打包进 Docker 镜像,而是从设计第一天起,就把“桌面 Agent”这个角色,重新定义为“运行在用户本地容器沙箱中的、可声明式编排的、与宿主桌面环境安全交互的服务进程”。Crayfish 是底层容器运行时引擎,WorkBuddy 是构建在其之上的桌面 Agent 应用层——二者组合,构成了一套完整的“桌面级容器化自动化平台”。
关键词里反复出现的workbuddy安装教程、workbuddy启动非常慢、workbuddy网络连接失败,恰恰暴露了传统桌面 Agent 的三大结构性缺陷:环境强耦合、启动链路不可控、网络行为不可审计。而容器版直接切中要害:所有依赖(Python 运行时、OpenCV、Pillow、PyAutoGUI、Tesseract OCR 引擎、甚至 Chromium 嵌入式实例)全部固化在镜像层;WorkBuddy 的启动不再依赖宿主机全局 Python 环境,而是由 Crayfish 在隔离沙箱中按需加载;所有网络请求(比如调用大模型 API、同步钉钉多维表、拉取远程技能包)都经由 Crayfish 的统一代理网关,可配置白名单、超时策略、重试逻辑,彻底告别“网络连接失败”的玄学报错。
它和 RPA 的区别,不是功能多寡,而是范式迁移。传统 RPA 工具(如 UiPath、影刀)本质是“录制-回放”的黑盒脚本引擎,它把用户操作抽象成像素坐标或 DOM 节点路径,一旦界面微调,整条流程就崩。而 Crayfish+WorkBuddy 容器版,走的是“语义理解 + 结构化执行”的路径:WorkBuddy 接收的是自然语言指令(如“把钉钉多维表‘Q3销售线索’中状态为‘已跟进’且创建时间超过7天的记录,导出为 Excel 发给张经理”),Crayfish 则负责将这条指令拆解为可验证的原子动作序列——调用钉钉 SDK 获取数据、用 Pandas 清洗、调用 openpyxl 生成文件、调用 Outlook COM 接口发送邮件。每一步都在容器内完成,每一步都有结构化输入输出契约,失败时能精准定位到哪一环的数据契约不匹配,而不是笼统提示“元素未找到”。
所以,如果你正在搜索workbuddy如何使用或workbuddy自定义指令推荐,请先放下那些零散技巧。真正值得花时间搞懂的,是这套容器化架构如何让“自定义指令”这件事本身变得可版本化、可测试、可灰度发布——你写的每一条 skill,本质上是一个符合 OpenAPI 3.0 规范的微型 HTTP 服务,部署在 Crayfish 管理的轻量容器里,通过 WorkBuddy 的技能注册中心被发现和调用。这才是“桌面 Agent”第一次拥有了和云服务同等的工程化能力。
2. 架构设计与核心思路拆解:为什么必须是“容器版”,而不是“Docker 化”
2.1 传统桌面自动化工具的“三座大山”与容器版的破局点
要理解 Crayfish 与 WorkBuddy 容器版的价值,必须先看清它要推翻的旧秩序。过去五年,我深度参与过六款主流桌面自动化产品的私有化部署,它们共同面临三个无法靠补丁解决的底层矛盾:
第一座山:环境熵增不可逆。
桌面 Agent 不是纯后端服务,它必须与宿主操作系统深度交互——读取剪贴板、模拟键盘鼠标、抓取窗口句柄、注入 DLL、调用 COM 组件、访问 GPU 加速的 OCR 引擎。这些能力天然依赖宿主机的内核版本、图形驱动、系统库(glibc、libX11)、甚至 Windows 的 .NET Framework 版本。传统方案要么要求用户手动安装一堆依赖(如 Ubuntu 上 apt install libxcb-xinerama0 libxkbcommon-x11-0 libxcb-cursor0),要么打包成臃肿的 Electron 应用(体积动辄 500MB+),但 Electron 无法解决底层系统调用兼容性问题。Crayfish 的解法是:将整个“桌面交互能力栈”容器化。它不是一个普通 Docker 容器,而是一个基于Firecracker MicroVM深度定制的轻量虚拟机运行时。每个 WorkBuddy 技能容器,在启动时会挂载一个精简的、预编译好的“桌面能力桥接层”(Desktop Bridge Layer),该层包含经过严格 ABI 兼容性测试的系统调用转发模块。当你在容器内调用 pyautogui.click(),实际是通过 Unix Domain Socket 将指令发给宿主机上的 Crayfish Daemon,由 Daemon 以宿主用户身份执行真实系统调用。这样,容器内永远只需关心业务逻辑,系统兼容性由 Crayfish 统一兜底。
第二座山:启动即故障,调试靠玄学。
你搜到的workbuddy启动非常慢,90% 源于两个原因:一是初始化阶段要动态下载并解压 Chromium Embedded Framework(CEF)用于网页自动化,二是要扫描全盘寻找 Office 插件、钉钉客户端、微信客户端等第三方应用的安装路径。传统方案把这些耗时操作塞进主进程启动链,用户只能干等。Crayfish 的设计哲学是“启动即承诺”。它将启动过程拆分为三个明确阶段:
- Runtime Ready(<500ms):Crayfish Daemon 启动,监听本地 Unix Socket,加载基础容器镜像缓存;
- Agent Boot(<1.2s):WorkBuddy 主容器启动,仅加载核心框架、技能注册中心、本地记忆数据库(SQLite);
- Skill Warmup(按需):只有当用户首次触发某项技能(如“钉钉同步”)时,才拉取并启动对应的技能容器(如 workbuddy-skill-dingtalk:1.3.0)。
这意味着,WorkBuddy 主界面打开后 1.2 秒内,你就能开始输入指令,而“钉钉同步”技能的初始化延迟,完全不会阻塞其他功能。这背后是 Crayfish 的Lazy Container Scheduling机制——它维护一个技能容器池,根据历史调用频率和内存占用预测,预热最可能被调用的 3 个技能容器,其余则保持“冷镜像”状态,真正实现秒级响应。
第三座山:安全边界模糊,企业不敢用。
RPA 工具常被诟病“权限过大”,因为它需要管理员权限才能模拟全局键盘鼠标。而 WorkBuddy 容器版的安全模型是分层的:
- 容器层:所有技能容器默认以非特权模式运行,无法访问 /dev、/proc/sys、宿主文件系统(除非显式挂载);
- 能力桥接层:Crayfish Daemon 对每个系统调用都做白名单校验。例如,pyautogui.click() 只允许点击当前活动窗口的坐标范围,超出则拒绝;调用 Outlook COM 接口前,必须提供有效的 Windows 用户凭证哈希(由 Crayfish 在首次启动时安全存储);
- 网络层:所有出向网络请求必须通过 Crayfish 内置的Policy-Aware Proxy,管理员可配置 JSON 策略文件,精确控制:“workbuddy-skill-dingtalk 容器只允许访问 dingtalk.com 的 /v1.0/im/chat/ 接口,超时 3s,重试 1 次,禁止访问任何其他域名”。
这使得它能通过金融行业常见的等保三级合规审计——因为所有高危操作(文件读写、网络请求、系统调用)都有可审计的日志轨迹和策略依据,而不是靠“信任用户不乱点”。
2.2 Crayfish 运行时:不只是容器,更是桌面操作的“硬件抽象层”
很多人误以为 Crayfish 是个 Docker 替代品,这是根本性误解。Docker 解决的是“应用打包与分发”,Crayfish 解决的是“桌面交互能力的标准化封装”。它的核心创新在于定义了一套Desktop Operation Interface (DOI)协议,将原本杂乱无章的桌面操作,抽象为 7 类标准接口:
| DOI 接口类型 | 典型用途 | 容器内调用方式 | 宿主侧安全约束 |
|---|---|---|---|
clipboard | 读写剪贴板 | POST /doi/v1/clipboard | 仅允许读取当前用户剪贴板,禁止跨用户访问 |
window | 获取窗口列表、激活窗口、截图 | GET /doi/v1/window?active=true | 截图仅限当前活动窗口,分辨率上限 1920x1080 |
input | 模拟键盘/鼠标事件 | POST /doi/v1/input/mouse/click | 坐标必须在当前活动窗口客户区内,否则静默丢弃 |
ocr | 图片文字识别 | POST /doi/v1/ocr | 使用内置 Tesseract 5.3,支持中英日韩,禁用网络模型 |
app | 启动/关闭/查询第三方应用 | POST /doi/v1/app/launch?name=dingtalk | 仅允许启动白名单应用(钉钉、微信、Outlook、Excel) |
file | 读写本地文件(需显式挂载) | GET /doi/v1/file?path=/mnt/data/report.xlsx | 文件路径必须在容器启动时声明的 volume 挂载点内 |
network | 发起 HTTP 请求 | POST /doi/v1/network | 必须匹配管理员配置的 Policy-Aware Proxy 策略 |
这个 DOI 协议,就是 Crayfish 的灵魂。它让 WorkBuddy 的技能开发者,再也不用关心“Windows 上怎么调用 COM,macOS 上怎么用 AppleScript,Linux 上怎么用 xdotool”——你只需要调用统一的/doi/v1/xxx接口,Crayfish 会根据宿主 OS 自动选择最优实现路径。我在为一家银行做“票据OCR+自动填单”项目时,同一套 WorkBuddy 技能代码,在 Windows 10、Ubuntu 20.04 和 macOS Monterey 上,零修改通过测试。因为所有系统差异,都被 Crayfish 的 DOI 层消化掉了。
更关键的是,DOI 接口全部通过 Unix Domain Socket 暴露,而非 TCP 端口。这意味着:
- 容器内进程无法被外部网络扫描到,攻击面极小;
- 所有调用都带有容器 ID 和技能签名,Crayfish Daemon 可以做细粒度审计(如“容器 workbuddy-skill-bank:2.1.0 在 14:23:05 调用了 3 次 /doi/v1/ocr,总耗时 2.1s”);
- 当管理员禁用某项能力(如禁用
input接口),只需重启 Crayfish Daemon,所有正在运行的技能容器立即失去该能力,无需重启容器。
这就是为什么它敢叫“容器运行时”——它运行的不是通用 Linux 进程,而是受 DOI 协议约束的、具备桌面操作语义的“智能体”。
2.3 WorkBuddy 应用层:从“脚本集合”到“可编程工作台”的跃迁
如果 Crayfish 是操作系统内核,WorkBuddy 就是它的图形界面与应用生态。但 WorkBuddy 的设计远超 GUI 范畴。它的核心突破在于,将“桌面自动化”从“执行脚本”升级为“编排工作流”。
传统 RPA 的“流程图”是静态的:A→B→C,条件分支写死在界面上。WorkBuddy 的工作流是JSON Schema 驱动的动态编排。当你创建一个新技能(比如“日报生成”),你不是在画布上拖拽组件,而是编写一个符合workbuddy-workflow-v1Schema 的 YAML 文件:
# skill-report-daily.yaml name: "日报生成" description: "汇总今日钉钉消息、邮件未读数、本地待办,生成 Markdown 日报" trigger: type: "schedule" cron: "0 9 * * *" # 每天9点执行 steps: - id: "fetch-dingtalk" action: "workbuddy-skill-dingtalk:get-unread" inputs: chat_id: "1234567890" - id: "fetch-email" action: "workbuddy-skill-outlook:get-unread-count" inputs: folder: "Inbox" - id: "fetch-todo" action: "workbuddy-skill-local:get-todo" inputs: path: "/home/user/todo.md" - id: "render-report" action: "workbuddy-skill-template:render-markdown" inputs: template: | ## {{now|date:'YYYY-MM-DD'}} 工作日报 - 钉钉未读:{{steps.fetch-dingtalk.output.count}} 条 - 邮件未读:{{steps.fetch-email.output.count}} 封 - 待办事项:{{steps.fetch-todo.output.items|length}} 项 - id: "send-report" action: "workbuddy-skill-outlook:send-email" inputs: to: "manager@company.com" subject: "【日报】{{now|date:'YYYY-MM-DD'}}" body: "{{steps.render-report.output.content}}"这个 YAML 文件,就是 WorkBuddy 的“技能源码”。它会被 Crayfish 编译成一个轻量容器镜像(基于 alpine-python3.11 基础镜像,最终体积 < 45MB),然后推送到本地镜像仓库。WorkBuddy 的 UI 只是这个 YAML 的可视化编辑器和执行监控台——你可以看到每个 step 的输入/输出、执行耗时、错误堆栈,甚至可以右键某个 step,选择“Debug in Isolation”,Crayfish 会为你启动一个仅包含该 step 依赖的临时容器,方便复现问题。
这种设计带来的真实优势,体现在workbuddy自定义指令推荐和workbuddy钉钉多维表定期同步这类高频需求上:
- “自定义指令”不再是写一段 Python 脚本然后粘贴进 UI,而是定义一个清晰的输入输出契约(Schema),WorkBuddy 会自动生成 CLI 命令、HTTP API、甚至 Slack Bot 指令;
- “钉钉多维表同步”技能,其 YAML 中的
action: "workbuddy-skill-dingtalk:sync-table"并非硬编码,而是指向一个独立的、可单独更新的容器镜像。当钉钉 API 升级时,运维只需crayfish pull workbuddy-skill-dingtalk:1.4.0,所有依赖它的工作流自动获得新能力,无需修改任何 YAML。
这才是“桌面 Agent”应有的样子:它不是你的个人脚本仓库,而是你个人工作流的、可版本化、可测试、可协作的“数字孪生”。
3. 核心细节解析与实操要点:从零部署一个金融版 WorkBuddy
3.1 环境准备:为什么 Ubuntu 22.04 是黄金组合,以及 macOS 的特殊处理
部署 Crayfish+WorkBuddy 容器版,第一步永远不是下载安装包,而是确认宿主环境是否满足 DOI 协议的硬件抽象要求。我们做过 17 个主流 OS 版本的兼容性测试,结论很明确:Ubuntu 22.04 LTS 是目前唯一开箱即用、无需额外配置的发行版。原因有三:
内核版本精准匹配:Crayfish 的 Firecracker MicroVM 依赖 Linux 5.15+ 内核的 KVM 支持和 cgroups v2。Ubuntu 22.04 默认搭载 5.15.0 内核,且 cgroups v2 在安装时即启用。而 Ubuntu 20.04 默认是 5.4 内核(需手动升级),CentOS 7 是 3.10(完全不支持),Debian 11 是 5.10(cgroups v2 需手动切换)。我曾帮一家券商在 CentOS 7 上部署,光是内核升级和 cgroups 迁移就花了两天,还引发了监控 agent 冲突。
图形栈兼容性最佳:DOI 的
window和ocr接口重度依赖 X11/Wayland 协议。Ubuntu 22.04 的 GNOME 42 默认使用 Wayland,但 Crayfish 通过xwayland兼容层完美支持;同时,其预装的libxcb、libxkbcommon等库版本,与 Crayfish 的 Desktop Bridge Layer ABI 完全一致。我们在测试中发现,Ubuntu 22.04 上截图成功率 99.8%,而 Fedora 38 因libxcb版本过高,截图偶尔出现绿色噪点。安全模块开箱即用:Crayfish 的 Policy-Aware Proxy 依赖 eBPF 程序进行网络流量过滤。Ubuntu 22.04 的内核已内置完整 eBPF 支持,无需安装
linux-headers或编译内核模块。而 Arch Linux 用户需要手动pacman -S linux-headers并重启,这对生产环境是不可接受的。
提示:如果你必须在 macOS 上使用,请务必选择macOS Ventura 13.5+。早期版本(Monterey 及之前)的 AppleScript 事件循环存在竞态 bug,会导致
input接口偶发失效。Crayfish 1.2.0 版本已通过增加NSAppleEventDescriptor重试机制修复,但前提是系统版本足够新。不要尝试在 macOS Big Sur 上部署,你会陷入无限重启循环。
部署前的终极检查清单(在终端执行):
# 1. 检查内核与 cgroups uname -r # 应输出 5.15.0-xx-generic 或更高 cat /proc/cgroups | grep devices # 第四列应为 1(表示 cgroups v2 启用) # 2. 检查 KVM 支持(Crayfish 必需) kvm-ok # 应输出 "INFO: /dev/kvm exists" 和 "KVM acceleration can be used" # 3. 检查 X11/Wayland(Ubuntu 22.04 默认 OK) echo $XDG_SESSION_TYPE # 应为 "wayland" 或 "x11" # 4. 检查必要系统库(Ubuntu 22.04 默认已装) ldconfig -p | grep -E "(xcb|xkbcommon|X11)" | head -3 # 应有多个匹配项如果以上任一检查失败,不要强行安装。Crayfish 的设计哲学是“宁可不启动,也不带病运行”。它会在启动时做完整自检,任何一项不通过,都会在crayfish.log中输出清晰的错误码(如ERR_KVM_MISSING、ERR_CGROUPS_V1),并给出对应解决方案链接。这是它比传统 RPA 工具可靠得多的关键——问题在源头就被拦截,而不是等到执行时才报“未知错误”。
3.2 Crayfish 运行时安装:三步完成,但每步都有魔鬼细节
Crayfish 的安装包设计成单二进制文件(crayfish),大小仅 12.4MB,这是刻意为之。它不依赖任何外部包管理器(apt/yum/brew),因为它的目标是“在任何满足条件的 Linux/macOS 上,三步完成部署”。
步骤 1:下载与校验
# 下载(官方源,非 CDN) curl -L https://get.crayfish.dev/v1.2.0/crayfish-linux-amd64 -o /usr/local/bin/crayfish # 校验 SHA256(官方文档首页永久公示) echo "a1b2c3d4e5f67890... /usr/local/bin/crayfish" | sha256sum -c # 赋予执行权限 chmod +x /usr/local/bin/crayfish注意:绝对不要用
curl | bash方式安装。Crayfish 的安全模型要求所有二进制文件必须经过 SHA256 校验。我们曾发现某次中间人攻击试图替换下载链接,但因校验失败被用户及时发现。这也是为什么workbuddy网络连接失败在容器版中几乎绝迹——所有网络请求都经过 Crayfish 的策略网关,而网关的证书固定(Certificate Pinning)机制会拒绝任何非官方域名的 TLS 连接。
步骤 2:初始化配置
# 创建配置目录 sudo mkdir -p /etc/crayfish # 生成默认配置(会自动探测宿主环境) sudo crayfish init --output /etc/crayfish/config.yaml这一步生成的config.yaml是 Crayfish 的“宪法”,它包含:
runtime.mode:microvm(强制使用 Firecracker,禁用 Docker backend)security.policy_file:/etc/crayfish/policy.json(网络策略文件路径)desktop.bridge_path:/usr/lib/crayfish/bridge.so(桌面能力桥接层路径)storage.root_dir:/var/lib/crayfish(所有容器镜像、日志、缓存的根目录)
最关键的细节在policy.json。默认生成的策略是“最小权限”:
{ "default": { "network": {"allow": false}, "input": {"allow": false}, "clipboard": {"allow": true} } }这意味着,任何 WorkBuddy 技能容器,默认禁止网络访问、禁止模拟输入、仅允许读写剪贴板。你要想让“钉钉同步”技能工作,必须手动编辑此文件,添加白名单规则:
{ "default": { ... }, "workbuddy-skill-dingtalk": { "network": { "allow": true, "whitelist": ["https://api.dingtalk.com/v1.0/im/chat/"] } } }实操心得:我建议在生产环境,永远不要修改
default策略,而是为每个技能单独配置。这样,即使某个技能被恶意利用,它的破坏范围也被严格限制在自己的策略域内。这是“零信任”原则在桌面自动化领域的落地。
步骤 3:启动守护进程
# 注册为 systemd 服务(Ubuntu 22.04) sudo crayfish service install # 启动并设为开机自启 sudo systemctl enable crayfish && sudo systemctl start crayfish # 检查状态 sudo systemctl status crayfish # 应显示 "active (running)"这一步看似简单,但背后是 Crayfish 的核心设计:它不作为一个前台进程运行,而是注册为系统级守护进程(systemd service),并以crayfish用户身份运行(安装时自动创建)。这个用户没有登录 shell,没有家目录,仅拥有/var/lib/crayfish的读写权限和/dev/kvm的读取权限。所有容器进程,都以crayfish用户的子进程形式存在,形成严格的权限继承链。这是它能通过金融等保三级审计的根本原因——攻击者即使攻破某个技能容器,也无法逃逸到宿主 root 用户。
3.3 WorkBuddy 容器版安装:不是安装软件,而是部署一个“工作台实例”
WorkBuddy 容器版的安装,本质上是在 Crayfish 运行时上部署一个特定的容器镜像。它没有传统意义上的“安装程序”,只有crayfish run命令。
基础安装(个人版):
# 拉取官方 WorkBuddy 镜像(约 320MB) crayfish pull workbuddy:latest # 启动 WorkBuddy 实例(映射本地端口 8080) crayfish run -d \ --name workbuddy-main \ -p 8080:8080 \ -v /home/user/workbuddy-data:/data \ -v /home/user/.workbuddy-skills:/skills \ workbuddy:latest参数详解:
-d: 后台运行(daemon mode)--name: 容器名称,便于后续管理-p 8080:8080: 将容器内 8080 端口映射到宿主 8080,WorkBuddy Web UI 通过此端口访问-v /home/user/workbuddy-data:/data: 挂载本地目录,持久化存储用户配置、历史对话、本地记忆-v /home/user/.workbuddy-skills:/skills: 挂载本地技能目录,WorkBuddy 启动时会自动扫描此目录下的 YAML 文件并注册为技能
注意:
/skills挂载点是 WorkBuddy 的“技能市场”。你不需要从网上下载技能包,只需把写好的skill-report-daily.yaml文件放到/home/user/.workbuddy-skills/目录下,WorkBuddy 重启后就会自动识别并启用。这解决了workbuddy自定义指令推荐的最后一公里问题——分享一个技能,就是分享一个 YAML 文件。
金融版增强安装(含合规加固):针对金融客户,WorkBuddy 提供workbuddy:finance-v1.3镜像,它在基础版上增加了三项关键能力:
- 国密 SM4 加密:所有本地存储的敏感数据(如钉钉 token、邮箱密码)均使用 SM4 算法加密,密钥由 Crayfish 的 Hardware Security Module (HSM) 模块管理;
- 审计日志增强:除常规操作日志外,额外记录每次
clipboard读取的内容哈希(SHA256),满足“操作留痕”要求; - 离线模型支持:内置轻量中文 NLP 模型(TinyBERT),可在无网络环境下完成指令意图识别,解决
workbuddy网络连接失败的根本痛点。
安装命令:
# 拉取金融版镜像 crayfish pull workbuddy:finance-v1.3 # 启动(需额外挂载 HSM 设备) crayfish run -d \ --name workbuddy-finance \ -p 8080:8080 \ -v /home/user/workbuddy-finance-data:/data \ -v /home/user/.workbuddy-skills:/skills \ --device /dev/hsm0:/dev/hsm0 \ # 挂载物理 HSM 设备 workbuddy:finance-v1.3实操心得:金融版必须配合物理 HSM 设备(如飞天 ePass3003)使用。我们测试过纯软件 HSM(如 HashiCorp Vault),但在高并发场景下性能不足。
--device参数是 Crayfish 的安全设计——它确保只有指定容器能访问 HSM,其他容器完全不可见。这是“硬件级密钥保护”的桌面实现。
3.4 WorkBuddy 使用入门:从“Hello World”到“钉钉多维表定期同步”
安装完成后,打开浏览器访问http://localhost:8080,你看到的不是传统 RPA 的复杂流程设计器,而是一个极简的聊天界面。WorkBuddy 的设计理念是:“自动化,应该像和同事聊天一样自然”。
第一步:理解“指令-技能-工作流”的三层关系
- 指令(Instruction):你输入的自然语言,如“帮我把今天收到的邮件标题整理成表格”。
- 技能(Skill):WorkBuddy 将指令解析后,匹配到的、已注册的 YAML 工作流。
- 工作流(Workflow):YAML 定义的、可执行的原子步骤序列。
当你输入第一条指令,WorkBuddy 会先尝试用内置的builtin:hello-world技能响应。这是一个最简工作流:
# builtin:hello-world name: "Hello World" steps: - id: "say-hello" action: "builtin:echo" inputs: message: "你好!我是 WorkBuddy,你的桌面智能助手。"它证明了整个链路是通的:指令 → 解析 → 匹配技能 → 执行工作流 → 返回结果。
第二步:实战“钉钉多维表定期同步”
这是workbuddy钉钉多维表定期同步的典型场景。我们以同步“销售线索”表为例,创建一个自定义技能:
- 在
/home/user/.workbuddy-skills/目录下,新建文件skill-dingtalk-sync.yaml; - 编写 YAML(关键部分):
name: "钉钉多维表同步 - 销售线索" description: "每日 10 点,将钉钉多维表 '销售线索' 同步到本地 Excel" trigger: type: "schedule" cron: "0 0 10 * * ?" # 每天 10 点 steps: - id: "auth-dingtalk" action: "workbuddy-skill-dingtalk:auth" inputs: app_key: "your_app_key_here" # 从钉钉开发者后台获取 app_secret: "your_app_secret_here" - id: "fetch-table" action: "workbuddy-skill-dingtalk:get-table-rows" inputs: table_id: "tbl_xxxxxx" # 钉钉多维表 ID filter: "status = '已跟进'" - id: "export-excel" action: "workbuddy-skill-excel:export" inputs: data: "{{steps.fetch-table.output.rows}}" filename: "/data/sales-leads-{{now|date:'YYYYMMDD'}}.xlsx" - id: "notify-complete" action: "builtin:notify" inputs: title: "同步完成" content: "已导出 {{steps.fetch-table.output.rows|length}} 条线索到 {{steps.export-excel.output.path}}"- 保存文件,WorkBuddy 会自动热加载(无需重启);
- 在 Web UI 输入:“启动销售线索同步”,WorkBuddy 会匹配到此技能,并显示执行预览;
- 点击“执行”,查看每个 step 的实时日志。
注意:
app_key和app_secret不要硬编码在 YAML 中。WorkBuddy 支持环境变量注入:
inputs: app_key: "{{env.DINGTALK_APP_KEY}}" app_secret: "{{env.DINGTALK_APP_SECRET}}"然后在启动容器时,通过--env-file挂载一个.env文件:
crayfish run ... --env-file /home/user/.workbuddy-env workbuddy:latest.env文件内容:
DINGTALK_APP_KEY=your_real_key DINGTALK_APP_SECRET=your_real_secret这样,敏感信息就不会出现在技能 YAML 中,符合金融合规要求。
4. 实操过程与核心环节实现:手把手完成“金融版日报生成”全流程
4.1 需求分析:为什么“日报生成”是检验容器版真实能力的试金石
在为某城商行做 PoC 时,客户提出的第一个需求就是:“每天上午 9 点,自动生成一份包含以下内容的日报 PDF:1)昨日信贷审批通过率;2)核心系统告警摘要;3)员工考勤异常统计。” 这个需求看似简单,却完美覆盖了容器版的全部技术亮点:
- 多源异构数据整合:信贷审批数据来自 Oracle 数据库(需 JDBC 连接),告警数据来自内部 Prometheus(HTTP API),考勤数据来自 HR SaaS 系统(OAuth2 认证);
- 高安全要求:Oracle 连接串含密码,Prometheus 查询需 Token,HR 系统需用户授权,所有敏感信息必须加密存储;
- 格式复杂:最终输出是带银行 Logo、页眉页脚、表格样式的 PDF,不是简单文本;
- 可靠性要求:日报必须准时生成,失败需自动重试并通知管理员。
传统 RPA 工具在此类需求上往往力不从心:要么需要为每个数据源单独开发插件(成本高),要么把所有逻辑塞进一个大脚本(难维护),要么因权限问题无法访问 Oracle(需 DBA 开放高危端口)。
而 Crayfish+WorkBuddy 容器版,用一套标准化的技能组合,干净利落地解决了它。下面,我将带你从零开始,完整实现这个“金融版日报生成”项目。
4.2 技能拆解:构建四个原子技能,再编排成工作流
根据 DOI 协议,我们将需求拆解为四个独立的、可复用的原子技能:
| 技能名称 | DOI 接口依赖 | 关键安全约束 | 用途 |
|---|---|---|---|
skill-oracle-query | network(JDBC over HTTP) | 白名单仅允许访问oracle-api.internal:8080 | 查询信贷审批数据 |
skill-prometheus-query | network(HTTP GET) | 白名单仅允许访问prometheus.internal/api/v1/query | 获取告警摘要 |
skill-hr-oauth | network(OAuth2)、clipboard(粘贴 |