Automator
*运行你自己应用的 workflow。*workflow 是一系列步骤:调用你的 OpenTraderWorld API 的某个端点、调用它之外的任意 URL、向你的 AI 服务商提一个问题、重塑答案、通知你自己。可以手动运行,也可以按计划运行。
典型用途:周一盘前简报,读取本周的经济事件和你的自选清单,并推送一条 Telegram 消息;每晚把 journal 导出到外部服务;把价格 webhook 分发为一条通知;由助手根据你自己的数字撰写每周摘要。
该模块位于 /automator,有四个分区:Workflows、Schedules、Agenda(即将运行的日历)、Runs。
网格
编辑器是网格,而不是画布:无需画连线。
- **步骤自上而下运行,步骤内的任务自左向右运行。**一切都是依次运行的。步骤把属于 workflow 同一时刻的任务归为一组,但不会同时启动它们。
- 把块从调色板拖到间隙上:两个步骤之间的间隙会新建一个步骤,两个任务之间的间隙会把它放入该步骤。松开之前,每个有效的放置目标都会高亮。
- 任务只能读取在它之前运行的内容。移动卡片后,它的引用会在下一次保存时重新检查。
- 每次编辑后 1.2 秒自动保存,Ctrl/Cmd+Z 撤销。仍在填写的块会保留为草稿:在通过验证之前,它不会运行,也不会被任何计划拾取。
块
| 块 | 作用 |
|---|---|
| App call | 你自己 API 的一个端点,在进程内运行。调色板列出 workflow 可访问的端点;点击一个,块就会直接指向它,并附带预期的请求体结构。 |
| Web call | 应用之外的任意 URL:方法、查询、请求头、JSON/文本/表单请求体,答案可按 JSON、文本、CSV 或二进制读取,并有响应大小限制。 |
| AI step | 一轮模型对话,周围没有会话。选择 persona 和已存储的提示词,或自己写指令;当下一个块需要读取字段而不是散文时,请求返回 JSON 对象。它调用你的服务商,每次运行都会消耗 token。 |
| Transform | 重塑之前的内容:pick 取一个值、set 构造一个对象、format 格式化字符串、csv_parse 解析 CSV、join 把列表连成一行。 |
| Notify | 应用内通知以及你的通知渠道(邮件、Telegram、Slack、Discord)。不选任何渠道表示授权给 Automator 的所有已启用渠道。 |
| Wait | 暂停运行。等待期间 Stop 仍会响应。 |
在块之间传递数据
每个块都有一个 id,显示在其编辑器顶部。后面的块用表达式读取它的结果:
{{steps.http1.output}} the whole answer
{{steps.http1.output.items.0.name}} one field of it
{{steps.http1.status}} ok | simulated | failed | skipped
{{steps.http1.error}} the failure message, empty on success
{{run.started_at}} {{run.trigger}} {{workflow.name}} {{input.key}}过滤器在管道符之后链式使用:json、upper、lower、trim、round:2、date:"DD/MM/YYYY"、default:"n/a"。只有 default 能挽救一个不存在的值。
这不是一门语言:没有算术,没有代码。每个引用都会在保存图时对照真正位于它之前的块进行检查,所以断开的链接会在编辑器中被拒绝,而不是在凌晨三点才出问题。
机密
密码或 API 密钥应放在保险库中,绝不要输入到字段里。在请求头、查询值或请求体中用 {{vault.myvault.mykey}} 引用它,这是唯一接受它的地方(绝不能在 URL 中),解析出的值会从运行历史中清除。查询值仍会出现在你所调用站点的日志中,所以请优先使用请求头。
权限
- App call 需要访问 token。在 workflow 的设置中选择一个;token 在设置 → AI agents 中创建。没有 token 就完全无法进行内部调用,workflow 只能访问其 token 所授予的内容,且处于 MCP gateway 所使用的同一允许列表之内。
- **Web call 拒绝访问你自己的网络。**回环、私有、CGNAT 和链路本地地址会被拒绝,除非该块明确允许内部目标。主机会先被解析,连接固定在已检查的地址上,每一次重定向跳转都会再次检查。
- **Notify 需要授权。**只有在设置 → 通知中向 Automator 授予某个渠道之后,它才会在这里出现。
先试运行,再正式运行
- Test run 执行读取操作,并报告写入或发送本应做什么,所以没有任何东西离开应用。读取一个只有模拟写入才能产生的值的块,本身会被报告为模拟,而不是让一个真实运行会通过的测试失败。
- Test this block 单独运行一个块,规则相同。
- Run now 是真实运行。Stop 会在块之间以及等待期间检查;超过 workflow 运行限制的运行会以超时关闭。
运行记录
每次运行为每个块保留一行:发送了什么、返回了什么、状态和耗时,所以在凌晨 3 点失败的 workflow 会指明是哪个块并显示负载。超过 256 KB 的输出会被暂存并按需获取。历史记录修剪为每个 workflow 最近 50 次运行(测试运行为 10 次)。
计划
每 N 分钟、每天、每周的某几天、每月,或在给定时刻运行一次,每个都有自己的 IANA 时区,所以设在 Europe/Paris 的规则遵循巴黎而不是服务器。
- 不重叠:如果下一次触发时上一次运行仍在进行,该次触发会被丢弃,而不是排队。
- 补跑(可选):如果应用在计划时间处于关闭状态,则在启动时运行一次。
- 夏令时会被处理,而不是忽略:被跳过的当地小时在间隙末尾运行,重复的小时只运行一次。设在短月份月底之后的每月规则,在该月最后一天运行。
- 计划可以固定到 workflow 的某个版本。保存新的图时会询问固定的计划是否应跟随它;自动保存绝不会自行改变指向。
- 可从 workflow 卡片或计划列表暂停 / 恢复。已禁用的 workflow 绝不会被计划启动,不过手动运行仍然有效。
计划中的写入会真正写入
指向会更改你数据的端点的 App call,每次运行都会无人值守地这样做。编辑器会标记这些端点;请在安排计划之前先测试 workflow。
让 agent 构建 workflow
编排图是这个模块对你要求最高的事情,而这恰恰是 AI agent 擅长的那类工作。所以持有带 Automator 权限 token 的 agent 可以读取你的 workflow、创建一个、编写其图并测试它。
它做不到的是让其投入使用。这种划分是有意的:
- agent 保存的图会作为草稿落地,绝不会成为正在运行的图。打开 workflow,阅读它写了什么,然后保存以采纳它。在你这样做之前,什么都不会改变:已经 在计划中的 workflow 会继续运行你保存的那个版本。
- agent 无法附加 workflow 的访问 token。这个包络把图转化为权限,所以由你在阅读完它将运行的图之后,手动授予。
- agent 无法运行 workflow、恢复修订、删除 workflow 或触碰计划。
- 它的测试运行是封闭的:通知和外部调用被强制关闭,并且在没有附加 包络的情况下,App call 会安全失败。测试会检查图能否运行、其 表达式能否解析、其 transform 是否如其所述地工作,而不触及任何东西。已经 带有 token 的 workflow 会被拒绝:那一个由你自己测试。
划这条线的原因是 workflow 使用它自己的 token 运行,而不是调用者的。 既能编写图又能启动它的 agent,会继承该 token 所授予的一切, 无论它自己的权限怎么说。编写和启用是两项授权,其中只有一项 可以由你委托出去。
Automator 在演示模式下被禁用。