Discourse 工作流

:discourse2: 摘要 Discourse Workflows 允许管理员通过可视化构建器创建高级自动化,从而自动化社区中的几乎所有内容。
:open_book: 安装指南 此插件已随 Discourse 核心捆绑,无需单独安装。

Workflows 是一个可视化自动化构建器,允许管理员使用拖放画布创建高级的多步骤自动化——通过连接触发器、条件、操作和流控制节点,来自动化 Discourse 站点上的几乎所有内容。

:discourse: Discourse Workflows 适用于 Business 或 Enterprise 计划。

核心概念

如果您熟悉其他自动化工具,您可能会认出 Workflows 中使用的大多数词汇:

  • Workflow(工作流): 由连接节点组成的已保存自动化。
  • Node(节点): 工作流中的单个步骤:触发器、条件、操作以及流控制/实用工具。
  • Trigger(触发器): 工作流的起点。触发器可以是手动的,也可以由特定事件启动——例如主题创建、计划任务执行或传入的 Webhook。
  • Condition(条件): 一个路由节点,用于评估规则并将流程拆分为分支。例如,If(如果)节点根据真或假评估来路由流程。
  • Action(动作): 执行特定操作的节点——例如创建帖子、授予徽章、调用外部 API 等。
  • Item(项目/数据项): 在节点之间流动的数据。Items 是 JSON 对象,您可以在执行日志中检查它们,并使用表达式进行引用。
  • Expression(表达式): 以 {{ ... }} 形式编写的动态值,在运行时解析,用于引用早期节点、变量或站点设置中的数据。

创建工作流

要构建工作流:

  1. 转到 管理员 > 插件 > Workflows 并点击 New workflow(新建工作流)。

  1. 为您的工作流命名。
  2. 点击 Add first step(添加第一步)并选择您的触发器。

  1. 使用 + 按钮添加其他节点。

  1. 双击节点以进行配置。在配置面板中,左侧将显示该节点输入的详细资料,屏幕右侧将显示该节点输出的详细资料。在查看所有详细信息之前,您可能需要先运行一次工作流。

  1. 准备好上线时,点击 Publish(发布)。

:light_bulb: 提示:

  • 使用位于构建器右上角三点菜单中的 sticky notes(便签)来记录您的工作流功能。便签对工作流没有任何影响,但可以使模板和共享工作流更容易理解。
  • 在开发过程中使用 log node(日志节点),将调试值发送到执行日志中,而不影响工作流的行为。
  • 您可以将工作流 导出和导入 为 JSON,以便与团队成员共享或在站点之间移动。请参阅下方的“导出和导入工作流”了解哪些内容会被传输。

表达式和动态数据

接受表达式的字段在编辑器中会显示一个 {/} 按钮。点击它可浏览来自触发器和早期节点的可用数据,并插入引用。

常见表达式

表达式 返回内容
{{ $json.topic.title }} 来自当前项目的主题标题
{{ $json.post.url }} 来自当前项目的帖子 URL
{{ $json.user.username }} 与当前项目关联的用户用户名
{{ $workflow_vars.my_variable }} 名为 my_variable 的工作流变量的值
{{ $vars.my_variable }} 名为 my_variable 的全局变量的值
{{ $site_settings.title }} 您站点的标题
{{ $execution.id }} 当前执行的唯一 ID
{{ $('Node Name').item.json.property }} 引用特定上游节点的输出,通过其画布名称进行引用

静态值和动态值

以 = 开头的字段被视为表达式。没有前导 = 的字段被视为纯文本。表达式选择器会自动为您处理这一点。

管理工作流

有许多功能可以帮助您管理现有的工作流。

执行记录

每次工作流运行时,Discourse 都会记录一次执行。转到 Workflows → Executions(工作流 → 执行记录)查看历史记录。

每个执行记录显示其完成日期和时间以及状态:

  • Completed(已完成): 无错误地运行至完成。
  • Error(错误): 在特定节点失败;点击进入执行记录以查看错误及其数据。
  • Running(运行中): 当前正在处理。
  • Waiting(等待中): 因等待节点而暂停;等待表单、模态框、聊天审批的响应;或等待子工作流完成的 Call Workflow 节点。
  • Rate limited(速率限制): 因速率限制而跳过工作流。
  • Skipped(跳过): 触发器已触发,但工作流未发布。

您可以点击 Show(显示)按钮以更深入地查看工作流的执行情况。这会显示工作流的每个步骤,您可以展开以查看确切详细信息以及该步骤的持续时间。

在页面底部,您可以查看工作流的总体持续时间。如果需要共享或故障排除,您也可以 Export(导出)日志。

设置

在 Workflows → Settings(工作流 → 设置)标签页上,您可以:

  • 配置一个 error workflow(错误工作流),如果此工作流运行时出现任何失败,它将触发。如果工作流有一个错误触发器,它将按照该触发器定义的方式处理错误。
  • 设置计划触发器的 timezone(时区)。如果未设置,工作流将默认使用站点时区。
  • 删除工作流。:warning: 这是 永久性 操作,因此在继续之前,您应该考虑导出您的工作流(在工作流构建器右上角的三点菜单中可访问)。

版本

每次您更新工作流时,我们都会保存之前的版本。这使得 Revert(回滚)未按预期工作的更改变得很容易。

导出和导入工作流

使用工作流构建器右上角的三点菜单,可将工作流 Export(导出)为 JSON 文件,并 Import(导入)以加载一个。常见用途:与团队成员共享工作流,或从暂存站点移动到生产环境。

导入操作会将文件中的节点 添加 到您当前打开的工作流中;它不会创建新的工作流。要复制工作流,请先创建一个空工作流,然后导入到其中。导入的更改会保存为草稿,直到您发布。

包含在导出中: 节点及其配置、连接、便签和工作流变量定义。

不传输,因此在发布之前,请在目标站点上设置这些内容:

  • Credentials(凭证): 导入时会移除凭证引用。在目标站点创建凭证,并在每个节点中重新选择它们。
  • Data tables(数据表): 表、列和行不会导出。重新创建它们并在数据表节点中选择它们。
  • Variable values(变量值): 工作流变量定义会被导入,但其值不会。请在工作流的 Variables(变量)标签页中设置它们。如果已存在相同键的变量,导入将保留现有变量,并显示跳过的键。全局变量不会被导出。
  • Workflow settings(工作流设置): 错误工作流和时区不会应用。请在 Settings(设置)标签页中重新设置它们。
  • Site-specific references(站点特定引用): 类别、群组、用户、聊天频道、Data Explorer 查询和被调用工作流的 ID、名称和 URL 保持原样,可能与目标站点不匹配。工作流变量使这些更容易更改。

:light_bulb: 在发布之前,手动运行导入的工作流并检查 Executions(执行记录)日志。

变量

有两种类型的变量:

  • Workflow variables(工作流变量) 局限于单个工作流。在工作流的 Variables(变量)标签页中定义它们,并使用 {{ $workflow_vars.key_name }} 引用它们。它们具有类型(字符串、整数、布尔值、枚举、类别、类别列表、群组、群组列表、标签列表或列表),因此会对值进行验证并使用正确的选择器进行选择。定义的更改和值的更改遵循工作流的草稿/发布流程。
  • Global variables(全局变量) 所有工作流共享。在 Workflows → Variables(工作流 → 变量)中定义它们,并使用 {{ $vars.key_name }} 引用它们。

对于在不同站点或用例之间变化的值(如类别、群组或接收者),请使用工作流变量,这样您无需编辑其节点即可复用工作流。

凭证

某些节点——如 HTTP 请求或 AI Agent——需要对外部服务进行身份验证。请在 Workflows → Credentials(工作流 → 凭证)中存储 API 密钥和秘密,而不是直接粘贴到节点字段中。凭证在静态存储时是加密的,并且可以在工作流之间重用。

支持的凭证类型:

  • Basic Auth(基本认证)(用户名 + 密码)
  • Bearer token(Bearer 令牌)
  • Header auth(头部认证)(自定义头部名称和值)

数据表

数据表是 Workflows 插件内部持久的、结构化的表格。使用 Data table(数据表)节点从中读取或写入数据。它们支持 string、number、boolean 和 date 列类型。

数据表适用于:

  • Deduplication(去重) — 记录工作流已处理的用户或主题
  • State(状态) — 跟踪主题是否处于流程的特定阶段
  • Lookups(查找) — 存储映射(如主题 ID → 分配的员工),供您的工作流查询

执行记录

您可以从 Executions(执行记录)标签页查看所有工作流的所有执行记录。格式和功能与特定于工作流的执行记录非常相似,但显示所有工作流的情况,便于监控。

模板

创建新工作流时,您可以从 template(模板)开始,而不是从空白画布开始。模板是针对常见用例预先构建的工作流——它们附有便签解释其工作原理,是学习该系统的好方法。

:megaphone: 有兴趣看到更多模板吗? 我们将努力随着时间的推移扩展可用模板库,但如果您希望看到能让您使用 Workflows 更轻松的模板,请告诉我们。

您也可以将任何工作流导出为 JSON 文件,以便与他人共享或将其作为您自己的起点。

24 个赞

你好,在尝试激活此插件时,我收到以下错误消息:您无权更改隐藏设置:discourse_workflows_enabled

2 个赞

目前必须从 /admin/config/upcoming-changes 启用,而不是 admin/plugins

3 个赞

你好,如果我对这些工作流的目的理解正确的话,我希望的一个模板示例是在主题中添加一个管理员按钮,以便立即提升该主题的排名。可行吗?:grinning_face:

1 个赞

你好!

我们如何确保“使用 AI 构建”功能使用特定的 LLM?
当在我们的系统中将 Google Gemini 用作默认 LLM 时,我收到以下错误:
收到无效的 JSON 负载。在 ‘tools[0].function_declarations[5].parameters’ 处发现未知名称“additionalProperties”:找不到该字段

谢谢!

1 个赞

你使用的是哪个 Gemini 模型?要更改它,请选择工作流代理并替换其默认的 LLM

1 个赞

嘿,Sam!这是 Gemini 3 Flash。

我找到了工作流设置,确实显示的是 Gemini Flash 3。我把它改成了 GPT Nano 5,但还是出现同样的错误。

我甚至把所有人的默认设置都改成了 GPT Nano 5,并检查了单独的工作流设置。也将其设置为覆盖为 GPT Nano 5。

还是不行。:frowning:

1 个赞

你是否有权限使用 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

哎呀,我正在全力开发一个转向交互 API 的方案,所以我认为这将为我们接入 Gemini 模型提供更稳定的桥梁,希望下周就能完成。

2 个赞

太棒了,感谢您的快速回复!我又找到了一些更多内容,但我想您已经明白我的意思了。:wink:

这是谷歌官方对 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 模式:

  1. 严格执行默认值: 生成器会自动添加 "additionalProperties": false 以强制进行严格的参数类型检查。

  2. 动态映射/字典: 如果工具参数使用键值哈希/字典(例如 dict[str, Any] 或 Ruby Hash),模式生成器会输出 "additionalProperties": { "type": "string" }。

  3. 未清理的负载: 当 Discourse 将这些自动生成的工具模式发送到谷歌的函数声明端点时,Gemini 的 Protobuf 解析器会将 additionalProperties 标记为无效或未知字段。

3. 如何在 Discourse 中解决此问题

如果您在 Discourse AI 工具调用中看到此错误:

  • 避免使用动态哈希/字典参数: 确保自定义工具参数在 properties 下明确定义每个预期的键,而不是使用开放式对象。

  • 将动态数据序列化为字符串: 如果工具必须接受任意键值对,请将参数定义为 STRING,并指示工具接受序列化的 JSON 字符串。

  • 在自定义工具中过滤掉 additionalProperties: 如果您在 /admin/plugins/discourse-ai/ai-tools 下定义了自定义 AI 工具,请编辑参数 JSON 模式,移除任何 "additionalProperties" 块。

我刚刚提交了一个 PR,增加了对交互 API 的支持。如果你有一个测试环境,希望能帮忙进行更多测试。

是否有任何计划允许通过工作流检索外部用户 ID?我想制作一个表单,在继续之前检查身份提供商系统中有关当前用户的一些信息,但据我了解,“获取用户”节点不会输出任何 external_id 字段。

感谢您的反馈,这应该能解决问题:FIX: supports optional data for workflow user node (#42400) · discourse/discourse@4d0c688 · GitHub

3 个赞

有没有什么方法可以将 user_id 转换为用户名?我正在研究一个用例,即向主题的创建者发送私信。但是从 topic 对象中我只能获取到 user_id,而发送私信的操作需要的是用户名。

或者换一种方式——如果有一种方法可以通过 topic_id 获取第一条帖子,那也行得通,因为我看到帖子对象中有一个 username 字段。

1 个赞

@thgl 是的,既然我们有一个数据探索节点,那么获取任何类型信息的查询都是可行的(在这个例子中我硬编码了 user_id,但你应该明白我的意思):

workflow-nodes-2026-08-18.json (2.1 KB)

2 个赞

@patrickemin 不确定你是否已经看到了,但我已经添加了此用例所需的所有构建模块。如果你需要帮助,请告诉我。

1 个赞

啊,这招真妙,谢谢!

嗯,我在那个用例中找不到将操作分配给“管理主题”按钮的选项: