编排工作流
从开始节点到输出节点构建可运行的类型化流程
工作流编辑器使用 React Flow 画布。左侧节点面板负责添加节点,中央画布负责连接流程,右侧抽屉负责配置选中节点。工作流支持手动触发、Webhook 触发和 Cron 定时触发(需额外部署调度任务)。
工作流构建器界面
布局
工作流编辑器由以下部分组成:
- 节点面板(左侧):按类别组织的可用节点类型
- 模型:LLM、媒体生成
- 逻辑:条件、问题分类器、决策、迭代、循环、暂停
- 转换:代码、模板、文件转 URL、变量聚合、变量赋值、参数提取
- 扩展:子工作流、Agent、工具、知识库检索、回答
- 画布(中央):工作流设计区域,支持添加、连接和排列节点
- 属性面板(右侧):节点配置、设置和变量
- 工具栏(顶部):保存工作流、测试(调试)工作流、缩放控制
构建工作流的步骤
- 添加开始节点:每个工作流以开始节点(用户输入或触发器)开始,定义输入参数
- 添加处理节点:添加节点处理数据,参见下方节点类型
- 连接节点:点击源节点的输出端口,拖动到目标节点的输入端口
- 配置节点:在属性面板中配置每个节点的设置
- 添加回答节点:使用回答节点定义工作流返回的最终输出;它是构建器中的输出节点,不要将其理解为另一个名为
end的运行时终止节点 - 测试工作流:点击测试(调试)按钮,输入测试数据,运行并查看结果
- 保存并发布:点击保存保存为草稿,点击发布激活工作流
变量与数据流
变量作用域:
- 输入变量:在开始节点定义,从用户或触发器收集
- 节点变量:节点输出,在后续节点中引用
- 系统变量:
{{workflow.id}}- 工作流 ID{{workflow.name}}- 工作流名称{{run.id}}- 当前运行 ID
变量用法:
- 在提示词中:
分析来自 {{customer_email}} 的查询:{{inquiry_text}} - 在条件中:
{{analysis.urgency}} == "high"
错误处理
构建器中没有 try-catch / 重试 UI。节点失败后的流程取决于执行器和工作流结构;错误会记录在运行/节点执行中供检查。HTTP 请求执行器默认最多重试 3 次,但构建器没有单独的重试配置项。
工作流模板
内置工作流模板:
- 简单问答机器人:使用 LLM 的基本问答机器人
- RAG 知识机器人:带检索增强的知识库问答
- 意图路由器:基于检测到的意图路由对话
- 代码审查助手:多视角自动代码审查
模板会实例化到新工作流中;实例化时请在编辑器中检查并配置模型、知识库及其他节点引用,不要假设模板变量名固定为某个 API 字段名。
键盘快捷键
Space + Drag:平移画布Ctrl/Cmd + Scroll:缩放Ctrl/Cmd + 0:重置缩放
创建与保存草稿
- 前往应用 > 创建应用 > 工作流。
- 在工作流设置填写名称、描述、可见性和所属团队。
- 选择开始节点:用户输入适合表单交互,触发器适合 API 或 Webhook 调用。
- 从节点面板拖拽节点到画布,或点击添加节点。
- 拖动源句柄到目标句柄创建连线。开始节点不能删除。
- 选择保存。编辑器会记录最近保存时间和未保存状态。
定义变量
开始节点使用工作流级变量。变量类型包括文本、段落、下拉选项、数字、布尔、数组、对象、文件、图片、多文件和多图片。每个变量可设置必填、默认值、标签和描述。
引用变量时使用编辑器选择器;不要手写不存在的名称。当前定义格式 schema_version: 2 支持原生对象和数组传递。
节点类型
编辑器提供以下节点类型,按类别组织:
节点面板按四个分类组织,下表按同一分类列出每个节点;类型标识符用于 API 交互,配置时请使用表中的准确值。
模型节点
| 节点 | 类型标识 | 用途 |
|---|---|---|
| LLM | llm | 调用语言模型进行文本生成和分析 |
| 媒体生成 | media_generation | 使用兼容模型生成媒体内容 |
逻辑节点
| 节点 | 类型标识 | 用途 |
|---|---|---|
| 用户输入 | user_input | 手动执行工作流的入口点(创建工作流时选择,不出现在添加节点菜单中) |
| 触发器 | trigger | 触发器执行工作流的入口点(同上) |
| 条件分支 | condition | 基于表达式结果分支执行 |
| 问题分类器 | question_classifier | 用对话模型对输入问题做文本分类 |
| 决策 | decision | 用决策模型对状态做类型化判断(choice/score/noul),按返回结果选择分支 |
| 迭代 | iteration | 遍历列表中的每个项目,逐个执行容器内的子节点 |
| 循环 | loop | 重复执行某个分支直到满足条件 |
| 暂停 | pause | 等待审批或变量输入 |
转换节点
| 节点 | 类型标识 | 用途 |
|---|---|---|
| 代码执行 | code | 执行 Python 或 JavaScript 自定义代码 |
| 模板 | template | 渲染模板字符串 |
| 文件转 URL | file_to_url | 将文件资产转换为可访问 URL |
| 变量聚合 | variable_aggregator | 合并多个变量值 |
| 变量赋值 | variable_assignment | 为变量赋值 |
| 参数提取 | parameter_extractor | 从文本中提取结构化参数 |
扩展节点
| 节点 | 类型标识 | 用途 |
|---|---|---|
| 子工作流 | sub_workflow | 调用另一个已发布的工作流 |
| Agent | agent | 调用已发布的 Agent |
| 工具 | tool | 执行已配置的工具 |
| 知识库检索 | knowledge_retrieval | 从知识库检索相关内容 |
| 回答 | answer | 定义工作流的最终输出 |
迭代、循环、暂停不能放进另一个容器:在迭代/循环容器内部打开添加节点菜单时,逻辑分类只剩条件、问题分类器和决策,并用 iteration_exit / loop_exit 作为容器内的结束标记。这两个标记没有独立执行器,只标出容器边界,不要把它们当作独立节点连接。
http_request 和 document_extractor 在引擎中注册了执行器,但构建器面板没有对应的节点组件——只有通过 API 提交的定义才会出现这两个类型。
未实现:Transform、Parallel、Wait、Switch、Database、Email、Webhook(作为节点)、Log、Delay、Merge、Input、Output 等节点类型。变量处理通过 variable_assignment 和 variable_aggregator 完成。
配置节点
按任务配置节点参数:
LLM 节点
- 模型:选择已配置的模型(如 GPT-4 Turbo、Claude 等)
- 提示词:使用
{{variable}}语法引用上游变量 - 温度:通常以
0-2配置,具体可用范围取决于所选模型;控制输出的随机性 - 最大令牌数:限制模型输出的长度
- Top P:通常以
0-1配置,具体可用范围取决于所选模型;核采样参数 - 输出变量:定义存储模型输出的变量名
输出变量: response、reasoning、usage(加上配置的输出变量)。
媒体生成节点
- 提供商:image | video
- 提示词:
{{prompt}} - 宽度/高度:(图片)
- 持续时间/宽高比:(视频)
条件分支节点
- 条件表达式:使用 Jinja2 语法,如
{{analysis_result.urgency}} == "high" - True 分支:条件为真时连接的下游节点
- False 分支:条件为假时连接的下游节点
问题分类器节点
将用户输入分类到多个意图/类别之一并相应路由。它把分类写进提示词让对话模型生成 JSON,再从文本里解析 category;需要概率、置信度和"不会答错格式"时改用下面的决策节点。
决策节点
决策节点调用决策模型(非生成式)对一份状态做一次类型化判断,再按判断结果走对应分支。模型不产出散文,只返回选项/等级的概率分布和置信度,因此路由结果不需要从模型输出里解析,也不会因为多写一句话而走错分支。
使用前先接入决策模型:管理员在集成 > 模型供应商中添加 TypeSafe AI(提供商固定为 typesafe,默认端点 https://api.typesafe.ai/v1),并把该模型以决策类型授权给当前团队。节点里的决策模型下拉框只列出当前团队已启用、类型为 decision 的模型;没有可用模型时会显示"暂无可用模型"。
| 配置项 | 界面标签 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
modelId | 决策模型 | 字符串 | 无(必填) | 团队已启用的决策模型;未选择时检查清单报"未选择模型" |
stateTemplate | 输入状态 | 模板字符串 | 无(必填) | 模型要评估的内容,支持 {{变量}}。最终会渲染成字符串;需要传对象或数组时先用模板/变量赋值节点拼成文本 |
questionType | 问题类型 | choice | score | noul | choice | 决定分支句柄与可用输出,见下表 |
instructions | 判断说明 | 字符串 | 无(必填) | 一句话说明模型要判断什么,例如"判断该退款单是否应直接批准" |
options | 选项 / 有序评分等级 | 字符串数组 | ["yes", "no"] | choice 需 1–255 个唯一选项;score 需 2–10 个有序等级;空串或重名会被检查清单拒绝 |
defaultHandle | 兜底分支 | 字符串 | default | 置信度低于阈值、或未解析出分支时走这里 |
confidenceThreshold | 置信度阈值 | 数字 0–1 | 不设置(不启用) | 仅在选择/评分类型显示;返回置信度严格小于该值时改走兜底分支 |
问题类型决定分支句柄与输出:
| 问题类型 | 界面标签 | 分支句柄 | 置信度 | 适用场景 |
|---|---|---|---|---|
choice | 选择一个选项 | 每个选项一个句柄,外加兜底分支 | 有 | 在若干互斥处置中选一个(退款 / 技术支持 / 账单 / 其他) |
score | 按有序等级评分 | 每个等级一个句柄,外加兜底分支 | 有 | 等级本身有序(低 / 中 / 高,P0–P3),同时需要数值评分 |
noul | 是 / 否概率判断 | 固定 yes、no,外加兜底分支 | 无 | 单一二元判断;概率 ≥ 0.5 走 yes,否则 no;不返回置信度,因此阈值对它无效 |
分支句柄与重命名
choice/score的每个选项或等级就是画布上的一个输出句柄,句柄名等于选项/等级文本;兜底句柄名为defaultHandle(默认default)。- 改动选项文本时,只要选项个数不变,编辑器会按位置重映射已有连线;如果改动了个数,残留连线会指向"已过期的输出句柄",检查清单报
decisionBranchHandleInvalid,必须重新连到当前句柄。 - 不需要连接每个分支,但被连接的分支必须有下游节点;低置信度答案会改走兜底分支,兜底分支没有下游时流程在该节点结束。
兜底分支与置信度阈值
- 阈值只在返回置信度严格小于阈值时生效;等于阈值仍走模型选中的分支。
- 阈值只影响路由,不影响输出:
answer始终是模型选中的选项/等级,selected_handle才是实际走的分支。 - 不设置阈值时,只有"没有解析出分支"才会走兜底;
noul永远不走兜底(它一定返回是或否)。 - 决策节点默认最多重试 2 次(首次失败后等待 1 秒起、指数退避并带抖动);重试与阈值无关,阈值只处理"答了但不确定"的情况。
输出变量
| 输出 | 类型 | 说明 |
|---|---|---|
answer | 字符串 | 选中的选项/等级,或 yes/no |
selected_handle | 字符串 | 实际走的分支句柄(被阈值改道时是兜底句柄) |
usage | 对象 | 本次决策调用的 Token 用量 |
choice / score / noul | 类型相关 | choice 追加 choice、confidence、probabilities;score 追加 score、confidence、probabilities;noul 追加 noul(为 yes 的概率) |
下游可以用 {{决策节点ID.answer}} 记录判断结果,用 {{决策节点ID.confidence}} 或 {{决策节点ID.probabilities}} 决定是否再套一层人工复核。
失败路径
| 错误 | 触发条件 |
|---|---|
validation_error | 未选模型、输入状态或判断说明为空;问题类型不是 choice/score/noul;选项个数越界、为空串或重名 |
decision_result_missing | 模型返回的答案类型、选项集合或概率集合与节点配置不一致(例如返回了未配置的选项) |
| 供应商/模型错误 | 团队未授权该决策模型、模型或授权被禁用、端点被模型端点白名单拦截、请求超时(默认 60 秒)、认证或配额错误 |
示例:工单分诊
ticket_text(段落)和 customer_tier(下拉:free/pro/enterprise)。
{{start.ticket_text}};问题类型选选择一个选项;判断说明写"判断这条工单应交给哪个处理队列";选项填 refund、technical、billing、other。
manual_review,置信度阈值填 0.6——模型置信度低于 0.6 的工单不再自动分派,交给人工。
refund 连到退款审批子工作流,technical 连到技术支持 LLM 节点,billing 连到账单模板节点,manual_review 连到暂停节点(审批模式)等人工处置。other 不连接表示直接结束。
manual_review;在运行追踪里查看该节点的 answer、confidence 和 probabilities,再决定 0.6 是否需要上调或下调。
调试决策分支
- 检查清单会逐项报:未选择模型、输入状态为空、判断说明为空、选项/等级数量不足或超限、选项为空或重名、连线使用已过期句柄。
- 运行追踪里看
selected_handle(实际走的哪条分支)和confidence(是否被阈值改道)。如果总是落到兜底分支,先看probabilities是"两个选项概率接近"还是"模型没理解判断说明"——前者调阈值,后者改判断说明或输入状态。 - 决策节点是一次调用、一个结果,没有中间步骤:调试只能整轮运行,不存在断点或单步执行。
迭代/循环节点
- 集合:
{{items}} - 项目变量:item
- 输出变量:results
暂停节点
暂停执行,直到团队成员提供请求的变量或提交审批决定。暂停可配置为变量模式或审批模式;等待的运行在处理请求后恢复。
- 模式:variables | approval
- 标题:审查请求
- 输入变量:需要收集或审批的变量列表
代码执行节点
- 语言:Python 或 JavaScript
- 代码:自定义执行逻辑
- 超时:代码执行器当前固定为
30秒;不是可在构建器中自由设置的1-300秒范围 - 输入变量:传递给代码的变量
- 输出变量:代码执行返回的变量
模板节点
使用变量渲染模板字符串(如 Jinja-like {{variable}} 替换)。
文件转 URL 节点
将文件(如沙箱工件)转换为可下载的 URL。
变量赋值节点
为变量赋值。
变量聚合节点
聚合值(如将循环迭代结果收集到数组中)。
参数提取节点
使用 LLM、正则表达式或 JSON 路径从文本中提取结构化参数。
- 提取方法:llm | regex | json_path
- 源变量:
{{source}} - 参数:[...]
HTTP 请求节点
- 方法:GET / POST / PUT / PATCH / DELETE
- URL:目标端点地址
- 请求头:自定义 HTTP 头
- 请求体:JSON 格式的请求负载
- 超时:默认
30秒;当前未核实有1-300秒的代码执行超时配置范围 - 输出变量:存储响应数据
HTTP 请求执行器默认最多重试 3 次;构建器没有单独的重试配置项。
工具节点
- 工具:选择已配置的工具
- 参数映射:将上游变量映射到工具参数
- 输出变量:存储工具执行结果
可用内置工具: web_search、fetch_webpage、calculate、unit_convert、get_weather、get_current_time、format_datetime、markitdown,以及沙箱工具(bash、read、edit、write、artifact)。
知识库检索节点
- 知识库:选择目标知识库
- 查询模板:使用
{{variable}}引用查询内容 - Top K:默认
5;具体上限取决于接口与配置,文档不将其限定为固定的1-100范围 - 分数阈值:默认
0.0。最低相似度分数 - 搜索模式:hybrid
子工作流节点
运行另一个工作流作为子步骤并捕获其输出。
Agent 节点
使用消息和可选上下文调用 AI Agent。
回答节点
从工作流返回最终答案/输出。
配置节点时,确保所有输入变量都有明确的来源(上游节点输出或开始节点变量)。未连接的输入变量会被发布前检查清单报告为问题;请在调试和发布前处理。
触发配置
工作流支持三种触发方式:
手动触发
无需额外配置。发布后,具有权限的用户可以通过 UI 或 API 手动触发工作流。
Webhook 触发
将触发类型设为 Webhook 后,系统自动生成一个 webhook token。触发端点为:
POST /api/v1/workflows/webhook/{webhook_token}请求要求:
- 认证:在
Authorization头中提供有效的clou_API 密钥 - 请求体:工作流输入变量(原始 JSON 或
{"inputs": {...}}格式) - Webhook token:使用恒定时间比较匹配,防止时序攻击
未实现 / Roadmap:wh_.../whsec_... 凭证对、IP 白名单、每个 webhook 的速率限制、重试策略和 webhook 请求日志当前不可用。
Cron 定时触发
将触发类型设为 Cron 后,调度表达式保存在 trigger_config 中(如 0 9 * * 1-5 表示工作日上午 9 点)。界面的执行频率会换算成同一个表达式,自定义模式直接填 分 时 日 月 周。
仅保存 Cron 触发器不会让工作流自动运行:workflow.check_scheduled 任务实现了 cron 评估逻辑,但它既不在随附的 Celery Beat 调度表(backend/app/core/celery.py)里,也不在 Celery 应用的 include 模块列表中,因此默认部署中从未被调度。要启用定时触发,运维需要在自定义部署里同时做三件事:
- 让任务被注册——把
app.services.workflow.tasks加进celery_app的include,或在 Worker 启动时导入该模块。 - 把该任务加入 Beat 调度,建议每分钟一次,例如
{"workflow-check-scheduled": {"task": "workflow.check_scheduled", "schedule": crontab(minute="*")}}。 - 对齐键名:调度任务读取
trigger_config["cron"],而工作流设置的定时任务表单写入trigger_config["cron_expression"]。界面保存的表达式需要改名为cron才会被匹配,或者直接用 API 把表达式写在cron键上。
任务本身只挑选已发布且 trigger_type=cron 的工作流,用 croniter 判断当前这一分钟是否命中表达式,命中就以空输入 {} 和工作流创建者身份触发一次运行。它没有单独的路由规则,会落到 default 队列,除非在 Beat 条目里用 options.queue 指定。
草稿与发布
工作流有三种状态:
草稿(Draft)
- 正在编辑中的工作流
- 不能被触发执行
- 仅对编辑者可见
- 可随时保存修改
已发布(Published)
- 可运行的工作流
- 可以通过 UI、API 或 webhook 触发
- 对所有有权限的用户可见
- 修改前需先取消发布
已归档(Archived)
- 已停用的工作流
- 不在正常列表中显示
- 配置信息保留
没有 active/inactive 状态。归档是模型级状态(archived),通过更新操作应用;发布/取消发布是管理员生命周期操作。
发布前检查
选择检查清单,解决以下问题后再调试运行和发布:
| 检查项 | 说明 |
|---|---|
| 未选择模型 | LLM 节点未配置模型 |
| 输入变量无来源 | 节点输入未连接到上游变量 |
| 节点无输入 | 必填节点缺少输入连接 |
| 输出未定义 | 回答节点未配置输出变量 |
| 条件分支不完整 | 条件节点缺少 True 或 False 分支 |
| 决策配置不完整 | 决策节点未选模型,或输入状态、判断说明为空,或选项/等级数量与唯一性不合规 |
| 决策分支句柄过期 | 决策节点连线指向已不存在的选项/等级句柄,需要重新连接 |
| 工具必填参数缺失 | 工具节点缺少必填参数映射 |
| 循环容器不完整 | 循环节点未正确配置 |
验证通过后,使用调试运行测试工作流,确认输出符合预期后再发布。
运行工作流
访问工作流
- 导航到应用(
/app/apps)。 - 打开工作流标签页。
- 选择工作流卡片打开
/app/apps/workflow/{id}。 - 选择运行开始手动执行。
工作流列表
列表显示:
| 列 | 说明 |
|---|---|
| 名称 | 工作流名称 |
| 团队 | 拥有工作流的团队 |
| 状态 | 草稿或已发布 |
| 上次运行 | 上次执行时间;运行可能正在暂停节点等待 |
| 操作 | 运行、查看、编辑 |
手动执行
步骤:
- 打开工作流
- 点击运行按钮
- 如果工作流有输入变量:
- 填写必填输入
- 查看可选输入
- 点击开始
- 实时观看执行过程
- 完成后查看结果
输入变量
工作流可能需要输入:
- 文本:自由格式文本输入
- 数字:数值
- 下拉选项:下拉选项
- 布尔:是/否复选框
观看执行
实时进度:
- ⏸️ 待定:尚未开始
- ⏳ 运行中:正在执行
- ⏳ 等待中:暂停等待外部输入或审批
- ✅ 成功:成功完成
- ❌ 失败:执行失败
- ⏭️ 已跳过:已跳过(条件性)
执行详情: 点击节点查看详细信息,包括状态、持续时间、输入和输出。
流式输出: LLM 节点实时流式输出;执行视图在运行时显示部分内容。
执行结果
成功: 显示执行持续时间、执行的节点数和状态。
失败: 显示失败节点和错误信息。
常见错误:
- 输入格式无效
- API 调用失败
- 超时
- 资源未找到
- 权限被拒绝
停止执行
执行期间:
- 点击停止执行按钮
- 确认停止操作
- 工作流在当前节点停止
工作流变量
输入变量: 启动工作流时提供。
输出变量: 执行期间由回答节点和其他节点输出生成。
查看执行记录
执行历史
- 选择工作流
- 点击执行历史标签页
- 查看运行列表:
- 运行 ID
- 状态(
running、success、failed等) - 开始时间
- 持续时间
- 触发来源
- 输入/输出
相关 API 端点:
GET /api/v1/workflows/runs- 获取所有运行记录GET /api/v1/workflows/{workflow_id}/runs- 获取指定工作流的运行记录GET /api/v1/workflows/{workflow_id}/runs/mine- 获取当前用户的运行记录
执行详情
点击单个运行查看详细信息:
- 运行信息:运行 ID、工作流名称、状态、开始时间、完成时间、持续时间、触发方式
- 节点执行时间线:每个节点的开始时间、完成时间和耗时
- 节点级详情:
GET /runs/{run_id}/nodes获取每个节点的执行详情 - 流式事件:
GET /runs/{run_id}/stream获取节点执行的实时事件流
工作流日志
工作流执行历史可从工作流的日志视图(/app/apps/workflow/{id}/logs)访问。打开应用 > 工作流,选择工作流,然后从工作流菜单中选择日志。
运行详情字段:
| 字段 | 说明 |
|---|---|
| 状态 | 日志 UI 显示已完成(API success)、失败、运行中、待定、已取消或超时。原始 API waiting 运行当前在列表和运行详情抽屉中回退到待定徽章;已取消和超时没有筛选控件。 |
| 开始时间 | 执行开始时间 |
| 持续时间 | 总执行时间 |
| 触发者 | 用户或 Webhook |
| 输入 | 提供的输入变量 |
| 输出 | 执行结果 |
| 已执行节点 | 运行的节点数 |
| 错误 | 错误信息(如果失败) |
状态图标:
| 徽章 | 日志标签 | API 状态 | 说明 |
|---|---|---|---|
| ✅ | 已完成 | success | 成功完成 |
| ❌ | 失败 | failed | 执行失败 |
| ⏳ | 运行中 | running | 正在执行 |
| ⏳ | 待定 | pending | 执行前排队 |
| ⏳ | 待定 | waiting | 此原始状态当前没有专用日志徽章或筛选,回退到待定。 |
| ⏹️ | 已取消 | cancelled | 已停止或取消;当前没有专用筛选控件。 |
| ⏱️ | 超时 | timeout | 超过执行超时;当前没有专用筛选控件。 |
查看节点执行详情
查看逐节点执行:
- 打开运行的节点执行
- 每个节点显示其状态、持续时间、输入、输出和错误(如有)
流式传输
运行实时流式传输事件(GET /api/v1/workflows/runs/{run_id}/stream),包括节点状态更新和 LLM 令牌输出。
筛选历史
| 筛选 | 选项 |
|---|---|
| 状态 | 所有状态、已完成、失败、运行中、待定 |
| 日期范围 | 所有时间、最近 7 天、最近 30 天、最近 90 天 |
| 运行 ID | 精确运行 UUID |
执行统计
摘要指标(每个工作流或系统范围):
- 总运行次数
- 成功率
- 失败运行次数
- 平均持续时间
删除历史
删除单个执行:
- 在历史中找到执行
- 点击 "..." 菜单
- 选择 "删除"
- 确认删除
- 执行被移除
已删除的执行无法恢复。批量删除未实现,也没有自动保留/清理策略设置。
未实现 / Roadmap:实时执行仪表盘(运行中/排队执行、成功率、平均执行时间、成本)当前不可用。运行统计可通过 GET /api/v1/workflows/runs/stats(支持团队过滤)和 GET /api/v1/workflows/{workflow_id}/stats(+ /stats/trends)获取。
Webhook 管理
创建或重新生成 Webhook Token
- 编辑工作流
- 将触发类型设为 Webhook
- 保存 - 系统自动生成
webhook_token - 随时通过
POST /api/v1/workflows/{workflow_id}/regenerate-webhook-token重新生成 token
测试 Webhook
使用 curl 测试 webhook:
curl -X POST "https://your-domain.com/api/v1/workflows/webhook/TOKEN" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customer_email": "test@example.com",
"inquiry_text": "测试查询",
"priority": "low"
}'Webhook 日志
未实现 / Roadmap:没有单独的 webhook 请求日志视图。触发的运行会出现在工作流运行历史中(GET /api/v1/workflows/runs)。
API 端点
工作流 API 支持程序化管理工作流生命周期:
| 操作 | 端点 | 说明 |
|---|---|---|
| 列出工作流 | GET /api/v1/workflows | 获取工作流列表 |
| 创建工作流 | POST /api/v1/workflows | 创建新工作流 |
| 获取工作流 | GET /api/v1/workflows/{id} | 获取工作流详情 |
| 更新工作流 | PUT /api/v1/workflows/{id} | 更新工作流配置 |
| 删除工作流 | DELETE /api/v1/workflows/{id} | 删除工作流 |
| 发布工作流 | POST /api/v1/workflows/{id}/publish | 发布工作流 |
| 取消发布 | POST /api/v1/workflows/{id}/unpublish | 取消发布 |
| 执行工作流 | POST /api/v1/workflows/{id}/run | 触发工作流执行 |
| 列出运行记录 | GET /api/v1/workflows/runs | 获取运行历史 |
| 获取运行详情 | GET /api/v1/workflows/runs/{run_id} | 获取单次运行详情 |
| 节点执行详情 | GET /api/v1/workflows/runs/{run_id}/nodes | 获取节点级执行信息 |
| 流式事件 | GET /api/v1/workflows/runs/{run_id}/stream | 实时节点事件流 |
| 运行统计 | GET /api/v1/workflows/runs/stats | 团队级运行统计 |
| 工作流统计 | GET /api/v1/workflows/{id}/stats | 单个工作流统计 |
| 趋势统计 | GET /api/v1/workflows/{id}/stats/trends | 执行趋势数据 |
| 重新生成 Token | POST /api/v1/workflows/{id}/regenerate-webhook-token | 重新生成 webhook token |
管理员端点位于 /api/v1/admin/workflows,需要 admin:app:* 权限。管理员可以跨团队管理所有工作流。
故障排除
工作流执行失败
- 在执行历史中打开失败的运行
- 检查节点执行详情和错误信息
- 常见错误:
- 节点超时:增加超时时间或优化节点
- 输入无效:验证输入变量格式
- API 错误:检查 API 凭证和连接性
- LLM 错误:验证模型可用性和 API 密钥
- 工具错误:检查工具配置
- 使用
POST /api/v1/workflows/{workflow_id}/run重新触发
Webhook 未触发
- 确认工作流触发类型为
webhook - 确认 POST 到正确的
/api/v1/workflows/webhook/{webhook_token}端点 - 确认
Authorization头中包含有效的clou_API 密钥 - 确认工作流已发布(未发布的工作流会拒绝 webhook 触发)
Cron 未执行
- 确认工作流已发布且
trigger_type为cron - 确认
trigger_config里有有效的 cron 表达式(调度任务读的是cron键) - 确认自定义部署把
app.services.workflow.tasks加进了 Celeryinclude,并用 Beat 定期调度workflow.check_scheduled(例如每分钟) - 确认运行该任务的 Worker 消费了它实际落到的队列(默认
default)
执行时间过长
- 优化节点:减少 LLM
max_tokens、使用更快的模型、优化工具调用 - 缩小串行链:执行计划按拓扑分层,但层内节点仍逐个执行,画布上也没有并行节点;把可批量化的重复工作收敛进迭代节点,并缩小迭代输入规模
- 设置节点超时:设置合理的超时时间并优雅处理
- 监控性能:通过运行历史查看执行时长统计
工作流无法启动
- 检查工作流是否已发布
- 确认有执行权限
- 确保提供所有必填输入
- 刷新页面重试
执行卡住
- 检查节点是否正在等待外部响应
- 确认 API 端点可访问
- 停止并重新启动执行
- 联系管理员
无法查看历史
- 刷新页面
- 检查是否有权限
- 确认工作流已执行
- 检查日期范围筛选
- 联系管理员
缺少执行记录
- 检查筛选(可能隐藏结果)
- 确认日期范围
- 确认执行是否被删除
无法启动新运行
- 确认有执行工作流的权限
- 确认工作流已发布
- 从工作流页面开始新执行
最佳实践
工作流设计
- 保持工作流简单聚焦,避免过度复杂
- 使用描述性节点名称,包含动作动词,具体明确
- 添加错误处理逻辑
- 激活前充分测试
- 记录工作流用途
- 使用变量实现可复用性,避免硬编码值
- 添加日志便于调试
- 设置合理的超时时间
性能优化
- 减少串行步骤:画布上没有并行节点,同一层的独立节点也是逐个执行;合并节点比拆分后"等它并行"更有效
- 控制迭代规模:迭代节点超过上限会截断输入,先筛掉不需要处理的数据项
- 缓存重复操作
- 优化 LLM 提示词
- 选择合适的模型
- 设置合理的超时时间
- 监控执行时间
- 优化工具调用
输入与监控
输入:
- 提供所有必填输入
- 使用正确的数据类型
- 先用样本数据测试
监控:
- 关注执行进度
- 检查节点输出
- 行为异常时停止
错误处理:
- 仔细阅读错误信息
- 检查输入值
- 审查节点配置
- 使用修正后的输入重试
安全
- 使用 webhook 认证(API 密钥放在 Authorization 头)
- 被泄露时重新生成 webhook token
- 启用审计日志
- 监控异常活动
未实现 / Roadmap:webhook IP 白名单和速率限制当前不可用。
退出与丢失更改
返回应用列表或关闭页面前,如果存在未保存更改,编辑器会显示确认对话框。选择不保存离开会丢弃当前草稿更改。
这篇文章对你有帮助吗?