工作流自动化

前置知识: 阅读本文前建议先了解 核心概念 中的事件系统部分,以及 Bot 管理 中的工作流绑定。

工作流是 Monstrum 的可视化自动化引擎。你可以用拖拽式编辑器构建 DAG(有向无环图)流程,将多个步骤串联成自动化管道。


概述

工作流解决的问题:很多任务不是一句指令就能完成的,而是需要多个步骤按顺序、按条件执行。例如:

  • 收到 Issue → 分析内容 → 分配给合适的 Bot → 通知相关人员
  • 定时检查服务器状态 → 异常则创建告警 → 等待人工审批 → 执行修复操作
  • 并行调用多个 API → 汇总结果 → LLM 总结 → 发送报告

工作流将这些步骤编排为可视化的 DAG,支持条件分支、并行执行、人工审批、循环遍历等控制流。


创建工作流

方式一:从 Bot 详情页创建

  1. 进入 Bot 详情页 → 工作流 Tab
  2. 点击 新建工作流
  3. 填写名称和描述
  4. 进入可视化编辑器

方式二:从工作流列表创建

  1. 在 Bot 管理页面中可以看到各 Bot 关联的工作流
  2. 或直接访问工作流编辑器 URL

工作流状态

状态说明
草稿新建状态,可编辑,不可执行
已激活可执行,仍可编辑(保存后生效)
已禁用暂停执行,保留定义

可视化编辑器

工作流编辑器是一个拖拽式的 DAG 编辑器。

界面布局

  • 左侧面板:节点面板,列出所有可用的步骤类型
  • 中央画布:拖拽节点、连线,构建流程
  • 右侧面板:选中节点后显示配置面板
  • 顶部工具栏:保存、激活/禁用、执行、撤销/重做、设置、历史、触发器、导出

基本操作

  • 添加节点:从左侧面板拖拽节点到画布
  • 连线:从节点的输出端口拖拽到另一个节点的输入端口
  • 配置:点击节点,在右侧面板中配置参数
  • 删除:选中节点或连线后按 Delete 键
  • 撤销/重做:Ctrl+Z / Ctrl+Y

验证

编辑器会自动验证工作流的合法性:

  • 必须有且仅有一个开始节点
  • 必须有至少一个结束节点
  • 不能存在环(循环连线)
  • 资源调用节点必须选择资源
  • 条件节点必须填写表达式
  • 审批节点必须填写审批说明
  • LLM 调用节点必须填写提示词

步骤类型

开始(START)

工作流的入口节点。每个工作流必须有且仅有一个开始节点。

结束(END)

工作流的出口节点。可以有多个结束节点(不同分支汇聚到不同的结束点)。

资源调用(RESOURCE_CALL)

调用资源上的工具,或将任务委派给 Bot。

配置项:

字段说明
步骤名称工作流内唯一标识
资源选择资源或 Bot
工具选择要执行的工具
工具参数JSON 格式的参数,支持变量引用
超时时间步骤超时(秒)
最大重试次数失败时重试次数

条件判断(CONDITION)

基于表达式结果决定执行哪个分支。支持两种模式:

满足/不满足(Boolean):

  • 配置一个条件表达式
  • 表达式为真 → 走”是”分支
  • 表达式为假 → 走”否”分支

多路分支(Switch):

  • 配置一个分支判断值和多个分支标签
  • 根据判断值匹配分支标签,走对应分支

条件表达式 支持引用上游步骤的输出变量:

${check_status.output.status} == "critical"
${analyze.output.score} > 80
${fetch_data.output.count} > 0

条件表达式使用安全求值引擎,不支持任意代码执行。

并行执行(PARALLEL)

同时执行多个分支。

  • 默认 Fail-Fast:任一分支失败,立即取消其他分支
  • 可关闭 Fail-Fast,允许部分分支失败后继续

从并行节点引出多条连线,每条连线代表一个并行分支。

等待(WAIT)

暂停执行指定时长。

配置项:

  • 等待时长:固定等待秒数
  • 等到指定时间:等待到特定时间点

审批(APPROVAL)

暂停工作流执行,等待人工审批。

配置项:

字段说明
审批说明描述需要审批的内容
通知网关选择用于发送审批通知的 Gateway
频道 ID通知发送到的 IM 频道
超时时间超时自动拒绝(0 = 不限时)

审批通知会发送到指定的 IM 频道,审批人在 IM 中回复即可批准或拒绝。

LLM 调用(LLM_CALL)

单次 LLM 调用,不涉及工具执行。适用于文本分析、摘要生成、分类判断等场景。

配置项:

字段说明
提示词提示词模板,支持变量引用
系统提示词可选的系统指令
模型覆盖工作区默认模型
Temperature控制随机性
最大 Token 数输出 Token 上限
响应格式可选 JSON 格式约束

循环(FOR_EACH)

遍历一个集合,对每个元素执行循环体。

配置项:

  • 遍历集合:引用上游步骤输出的数组,如 ${fetch.output.items}
  • 循环变量名:循环体内引用当前元素的变量名

子工作流(SUB_WORKFLOW)

调用另一个已激活的工作流作为子步骤。

配置项:

  • 目标工作流:选择一个已激活的工作流
  • 输入参数:传递给子工作流的参数

变量传递

步骤之间通过变量传递数据。每个步骤的输出可以被下游步骤引用。

引用语法

${步骤名称.output.字段名}

例如:

  • ${check_server.output.status} — 引用 check_server 步骤输出的 status 字段
  • ${fetch_data.output.items[0].name} — 引用数组元素

在工具参数中使用

资源调用步骤的工具参数支持变量引用:

{
  "command": "systemctl restart ${analyze.output.service_name}",
  "host": "${get_target.output.host}"
}

在提示词中使用

LLM 调用步骤的提示词模板支持变量引用:

请分析以下服务器状态报告:
${check_status.output.report}

并给出建议。

可用变量面板

编辑器中选中步骤时,可以查看当前步骤可用的变量列表(来自上游步骤的输出)。点击变量名可复制引用语法。


工作流设置

点击编辑器顶部的 设置 按钮,可以配置工作流全局设置:

设置项说明
最大执行时间工作流整体超时(秒)。单步超时不能超过剩余预算
失败时重试是否启用自动重试
最大重试次数全局重试次数上限
标签工作流标签,用于分类和筛选

触发方式

工作流支持 4 种触发方式:

手动触发

在编辑器中点击 执行 按钮,或在工作流列表中点击执行。

定时触发

通过 定时调度 触发工作流执行。在创建调度任务时,目标类型选择”工作流”并选择要触发的工作流。

事件触发

通过事件触发器自动执行。

  1. 在编辑器中点击 触发器 按钮
  2. 点击 添加触发器
  3. 配置:
    • 事件模式:fnmatch 模式,如 task.completedworkflow.*schedule.fired
    • 指令:传递给工作流的上下文信息(可选)
    • 启用:是否启用此触发器
  4. 保存

常用事件模式:

事件模式触发时机
task.completed任务完成时
task.failed任务失败时
workflow.completed工作流完成时
schedule.fired定时调度触发时
custom.*Bot 发布的自定义事件

API 触发

通过 API 调用 POST /api/workflows/{id}/execute 触发。


绑定到 Bot

工作流可以绑定到 Bot,让 Bot 在对话中使用工作流。

在 Bot 详情页 → 工作流 Tab 中,为每个工作流设置绑定模式:

绑定模式说明
未绑定Bot 无法使用此工作流
AI 自动工作流注入为 LLM 工具,Bot 根据对话上下文自主决定是否调用
命令用户在对话中输入特定命令触发(需配置命令名称,如 deploy
自动 + 命令两种方式都支持

还可以配置命令的使用权限:仅管理员所有人


执行历史

查看执行历史

在编辑器中点击 历史 按钮,可以查看该工作流的所有执行记录:

  • 执行状态
  • 触发方式(手动 / 定时 / 事件触发 / API)
  • 耗时
  • 创建时间

执行详情

点击某次执行,可以查看详情:

  • 每个步骤的执行状态和耗时
  • 步骤的输入参数和输出结果
  • 失败步骤的错误信息
  • 审批步骤的审批结果

执行统计

编辑器顶部显示工作流统计:

  • 成功率
  • 总执行数
  • 平均耗时
  • 最慢步骤

执行状态

状态说明
等待中排队等待执行
运行中正在执行
成功所有步骤执行完毕
失败某个步骤执行失败
已取消手动取消
超时超过最大执行时间
等待审批审批步骤暂停中

导入与导出

导出

在编辑器中点击 导出 按钮,将工作流导出为 JSON 文件。导出内容包含所有步骤定义、连线和配置。

导入

  1. 在工作流列表点击 导入
  2. 上传工作流 JSON 文件
  3. 在依赖映射中将外部依赖(Resource ID、Bot ID)映射到本地资源
  4. 选择归属 Bot
  5. 确认导入

安全机制

工作流执行器内置多层安全机制:

  • DAG 环检测:保存时自动检测连线是否形成循环,防止无限执行
  • 超时预算:全局超时限制 + 每步超时取剩余预算的较小值,防止步骤超时拖垮整个工作流
  • 并行 Fail-Fast:并行分支中任一失败立即取消兄弟分支(可关闭)
  • 安全表达式:条件表达式使用 AST 白名单求值,不支持任意代码执行
  • 权限校验:资源调用步骤同样经过完整的权限检查链路

常见用法

自动化运维流水线

开始 → 检查服务器状态(SSH)→ 条件判断
  ├── 正常 → 记录日志 → 结束
  └── 异常 → LLM 分析 → 审批 → 执行修复 → 通知 → 结束

数据处理管道

开始 → 获取数据(API)→ 并行处理
  ├── 分支1:数据清洗
  ├── 分支2:数据分析
  └── 分支3:数据备份
→ 汇总结果 → LLM 总结 → 发送报告 → 结束

事件驱动响应

设置触发器监听 task.failed 事件,自动执行故障分析和通知流程。


常见问题

工作流保存时提示”检测到环”

检查连线是否形成了循环。使用编辑器的验证功能定位问题连线。

步骤超时但工作流仍在运行

每步超时受全局超时预算限制。如果全局超时充足,步骤超时只影响当前步骤。检查工作流设置中的最大执行时间。

条件表达式不生效

确认表达式语法正确,变量引用的步骤名称与实际步骤名匹配。检查上游步骤的输出是否包含引用的字段。

审批通知收不到

  • 检查审批步骤的通知网关配置
  • 确认 Gateway 状态正常
  • 确认频道 ID 正确