lindsey
(Lindsey Fogle)
1
|
|
|
 |
摘要 |
Discourse Workflows 允许管理员通过可视化构建器创建高级自动化流程,以自动化社区中的几乎所有操作。 |
 |
安装指南 |
此插件已包含在 Discourse 核心中。无需单独安装该插件。 |
Workflows 是一个可视化自动化构建器,允许管理员使用拖放画布创建高级的多步骤自动化流程——连接触发器、条件、操作和流程控制节点,以自动化您 Discourse 站点上的几乎所有操作。
Discourse Workflows 适用于 Business 或 Enterprise 计划。
核心概念
如果您熟悉其他自动化工具,您可能会认出 Workflows 中使用的大部分术语:
- 工作流 (Workflow):由连接的节点组成的已保存自动化流程。
- 节点 (Node):工作流中的单个步骤:触发器、条件、操作和流程控制/实用程序。
- 触发器 (Trigger):工作流的起点。触发器可以是手动的,也可以由特定事件启动——例如主题创建、计划任务触发或传入的 Webhook。
- 条件 (Condition):评估规则并将流程拆分为分支的路由节点。例如,If 节点根据 true 或 false 的评估结果来路由流程。
- 操作 (Action):执行特定操作的节点——创建帖子、授予徽章、调用外部 API 等。
- 项目 (Item):在节点之间流动的数据。项目是 JSON 对象,您可以在执行日志中检查它们,并使用表达式引用它们。
- 表达式 (Expression):以
{{ ... }} 形式编写的动态值,在运行时解析,用于引用来自早期节点、工作流变量或站点设置的数据。
创建工作流
要创建工作流:
- 前往 Admin > Plugins > Workflows 并点击 New workflow。
- 为您的工作流命名。
- 点击 Add first step 并选择您的触发器。
- 使用 + 按钮添加其他节点。
- 双击节点以进行配置。在配置面板中,节点输入的详细信息将显示在屏幕左侧,节点输出的详细信息将显示在屏幕右侧。您可能需要运行一次工作流才能看到所有各种详细信息。
- 准备好上线时,点击 Publish。
提示:
- 使用 便签,位于构建器右上角的三点菜单中,记录您的工作流功能。便签对工作流没有影响,但使模板和共享工作流更易于理解。
- 在开发期间使用 日志节点 将调试值发送到执行日志,而不影响工作流的行为。
- 您可以将工作流 导出和导入 为 JSON,以便与团队成员共享或从其他站点重新创建工作流。
表达式和动态数据
接受表达式的字段在编辑器中显示一个 {/} 按钮。点击它以浏览来自触发器和早期节点的可用数据并插入引用。
常见表达式
| 表达式 |
返回内容 |
{{ $json.topic.title }} |
当前项目中主题的标题 |
{{ $json.post.url }} |
当前项目中帖子的 URL |
{{ $json.user.username }} |
与当前项目关联的用户名 |
{{ $vars.my_variable }} |
名为 my_variable 的工作流变量的值 |
{{ $site_settings.title }} |
您站点的标题 |
{{ $execution.id }} |
当前执行的唯一 ID |
{{ $('Node Name').item.json.property }} |
来自特定上游节点的输出,通过其画布名称引用 |
静态和动态值
以 = 开头的字段被视为表达式。没有前导 = 的字段被视为纯文本。表达式选择器会自动为您处理此问题。
管理工作流
有许多功能可帮助您管理现有的工作流。
执行
每次工作流运行时,Discourse 都会记录一次执行。前往 Workflows → Executions 查看历史记录。
每次执行显示其完成时的日期和时间及其状态:
- 已完成 (Completed):无错误地运行至完成。
- 错误 (Error):在特定节点处失败;点击执行以查看错误和导致错误的数据。
- 运行中 (Running):当前正在处理。
- 等待中 (Waiting):由于等待节点而暂停;等待表单、模式窗口、聊天批准中的响应;或调用工作流节点等待子工作流完成。
- 速率限制 (Rate limited):由于速率限制,工作流被跳过。
- 已跳过 (Skipped):触发器已触发,但工作流未发布。
您可以点击 Show 按钮更深入地查看工作流的执行。这将显示工作流的每个步骤,您可以展开以查看确切详细信息以及该步骤的持续时间。
在页面底部,您可以查看工作流的总持续时间。如果需要用于共享或故障排除目的,您还可以 Export 日志。
设置
在 Workflows → Settings 选项卡上,您可以:
- 配置 错误工作流,当此工作流运行时出现任何故障时应触发。如果工作流具有错误触发器,它将按该触发器定义的方式处理错误。
- 设置计划触发器的 时区。如果未设置,工作流将默认使用站点时区。
- 删除工作流。
这是 永久 的,因此您应该考虑在继续之前导出您的工作流(可在工作流构建器右上角的三点菜单中访问)。
版本
每次您更新工作流时,我们都会保存之前的版本。这使得 Revert 未按预期工作的更改变得容易。
变量
变量是限定于单个工作流的键值对。在工作流的 Variables 面板中定义它们,并使用 {{ $vars.key_name }} 在任何地方引用它们。使用变量存储您希望在不编辑工作流图的情况下能够更改的配置值(如类别 ID 或收件人用户名)。
凭证
某些节点(如 HTTP 请求或 AI Agent)需要与外部服务进行身份验证。将 API 密钥和密钥存储在 Workflows → Credentials 中,而不是直接粘贴到节点字段中。凭证在静态时加密,并可以跨工作流重用。
支持的凭证类型:
- Basic Auth(用户名 + 密码)
- Bearer token
- Header auth(自定义标头名称和值)
数据表
数据表是 Workflows 插件内部持久的结构化表。使用 Data table 节点从中读取或写入。它们支持 string、number、boolean 和 date 列类型。
数据表适用于:
- 去重 — 记录工作流已处理的用户或主题
- 状态 — 跟踪主题是否处于流程的特定阶段
- 查找 — 存储您的工作流可以查询的映射(如主题 ID → 分配的工作人员)
执行
您可以从 Executions 选项卡查看所有工作流的所有执行。格式和功能与工作流特定的执行非常相似,但显示所有工作流以便更轻松地监控。
模板
创建新工作流时,您可以从 模板 开始,而不是空白画布。模板是为常见用例预先构建的工作流——它们带有便签注释,解释其工作原理,是学习系统的好方法。
有兴趣查看更多模板吗? 我们将努力随着时间的推移扩展可用模板库,但如果您希望在此处看到某个模板以简化您的 Workflows 使用,请告诉我们。
您还可以将任何工作流导出为 JSON 文件,与他人共享或将其用作您自己的起点。
21 个赞
你好,在尝试激活此插件时,我收到以下错误消息:您无权更改隐藏设置:discourse_workflows_enabled
2 个赞
目前必须从 /admin/config/upcoming-changes 启用,而不是 admin/plugins
3 个赞
你好,如果我对这些工作流的目的理解正确的话,我希望的一个模板示例是在主题中添加一个管理员按钮,以便立即提升该主题的排名。可行吗?
1 个赞
你好!
我们如何确保“使用 AI 构建”功能使用特定的 LLM?
当在我们的系统中将 Google Gemini 用作默认 LLM 时,我收到以下错误:
收到无效的 JSON 负载。在 ‘tools[0].function_declarations[5].parameters’ 处发现未知名称“additionalProperties”:找不到该字段
谢谢!
1 个赞
sam
(Sam Saffron)
6
你使用的是哪个 Gemini 模型?要更改它,请选择工作流代理并替换其默认的 LLM
1 个赞
嘿,Sam!这是 Gemini 3 Flash。
我找到了工作流设置,确实显示的是 Gemini Flash 3。我把它改成了 GPT Nano 5,但还是出现同样的错误。
我甚至把所有人的默认设置都改成了 GPT Nano 5,并检查了单独的工作流设置。也将其设置为覆盖为 GPT Nano 5。
还是不行。
1 个赞
sam
(Sam Saffron)
8
你是否有权限使用 Luna 或 Terra,或者 3.5 Flash 或 Sonnet?
工作流 AI 代理拥有相当多的工具,因此通常需要较新的 LLM。
1 个赞
我原本确信 Flash Lite 能正常工作,但它并没有。GPT Nano 5 确实可以正常工作。这似乎是一个已知问题,即使在 WordPress 中也存在。这里有一个参考链接。我们需要做的是,每当使用 Gemini 提供商时,从 JSON 响应模式中移除 additionalProperties 项:Remove `additionalProperties` from the JSON response schema - Pull Request #18 - WordPress/ai-provider-for-google - GitHub
sam
(Sam Saffron)
10
哎呀,我正在全力开发一个转向交互 API 的方案,所以我认为这将为我们接入 Gemini 模型提供更稳定的桥梁,希望下周就能完成。
2 个赞
太棒了,感谢您的快速回复!我又找到了一些更多内容,但我想您已经明白我的意思了。
这是谷歌官方对 Gemini 的解释。希望这能讲得通? 我并不是完全理解所有内容,但我清楚它会在处理该属性时出错。 哈哈。
简而言之: 错误持续存在,因为谷歌使用两个完全不同的引擎来处理模式(schema)。虽然 Gemini 支持用于结构化输出 (response_json_schema) 的标准 JSON Schema,但其函数调用/工具执行引擎仍然使用谷歌严格的 OpenAPI 3.0 Protobuf 解析器,该解析器会拒绝或在处理 additionalProperties 时出错。
1. 工具调用与结构化输出(引擎分裂)
谷歌的 Gemini API 在两个独立的位置验证模式:
-
结构化输出 (response_json_schema): 旨在格式化模型的最终响应。它使用标准 JSON Schema 解析,并能干净地处理 additionalProperties。
-
工具/函数调用 (tools[0].function_declarations): 旨在向模型传递站点工具(如 Discourse AI 搜索、角色操作或网页浏览)。此端点将模式解析为谷歌内部的 google.ai.generativelanguage.v1beta.Schema Protobuf 对象。
由于工具端点将参数映射到遗留的 OpenAPI 3.0 子集,在函数声明中发送 additionalProperties 会导致 API 解析器返回 400 Bad Request 或 MALFORMED_FUNCTION_CALL。
GitHub
2. 为什么像 Discourse 这样的框架会注入它
编排框架(Discourse AI、模型上下文协议/MCP、LangChain、Pydantic、Zod)会自动为自定义工具生成 JSON 模式:
-
严格执行默认值: 生成器会自动添加 "additionalProperties": false 以强制进行严格的参数类型检查。
-
动态映射/字典: 如果工具参数使用键值哈希/字典(例如 dict[str, Any] 或 Ruby Hash),模式生成器会输出 "additionalProperties": { "type": "string" }。
-
未清理的负载: 当 Discourse 将这些自动生成的工具模式发送到谷歌的函数声明端点时,Gemini 的 Protobuf 解析器会将 additionalProperties 标记为无效或未知字段。
3. 如何在 Discourse 中解决此问题
如果您在 Discourse AI 工具调用中看到此错误:
-
避免使用动态哈希/字典参数: 确保自定义工具参数在 properties 下明确定义每个预期的键,而不是使用开放式对象。
-
将动态数据序列化为字符串: 如果工具必须接受任意键值对,请将参数定义为 STRING,并指示工具接受序列化的 JSON 字符串。
-
在自定义工具中过滤掉 additionalProperties: 如果您在 /admin/plugins/discourse-ai/ai-tools 下定义了自定义 AI 工具,请编辑参数 JSON 模式,移除任何 "additionalProperties" 块。
sam
(Sam Saffron)
13
我刚刚提交了一个 PR,增加了对交互 API 的支持。如果你有一个测试环境,希望能帮忙进行更多测试。
是否有任何计划允许通过工作流检索外部用户 ID?我想制作一个表单,在继续之前检查身份提供商系统中有关当前用户的一些信息,但据我了解,“获取用户”节点不会输出任何 external_id 字段。
j.jaffeux
(Joffrey Jaffeux)
15
3 个赞
thgl
(Thomas Glaser)
16
有没有什么方法可以将 user_id 转换为用户名?我正在研究一个用例,即向主题的创建者发送私信。但是从 topic 对象中我只能获取到 user_id,而发送私信的操作需要的是用户名。
或者换一种方式——如果有一种方法可以通过 topic_id 获取第一条帖子,那也行得通,因为我看到帖子对象中有一个 username 字段。
1 个赞
j.jaffeux
(Joffrey Jaffeux)
17
@thgl 是的,既然我们有一个数据探索节点,那么获取任何类型信息的查询都是可行的(在这个例子中我硬编码了 user_id,但你应该明白我的意思):
workflow-nodes-2026-08-18.json (2.1 KB)
2 个赞
j.jaffeux
(Joffrey Jaffeux)
18
@patrickemin 不确定你是否已经看到了,但我已经添加了此用例所需的所有构建模块。如果你需要帮助,请告诉我。
1 个赞
嗯,我在那个用例中找不到将操作分配给“管理主题”按钮的选项: