Discourse 工作流

谢谢,问题解决了!

3 個讚

@gilles 我现在已经实现了上面提到的后续功能:

它添加了一个通用的 事件 → 设置出席状态 操作,包含以下内容:

  • 参与者
  • 出席状态:参加 / 感兴趣 / 不参加 / 移除出席状态
  • 主题 ID
  • 可选的操作者

因此,你最初的使用场景可以构建为:

帖子创建 → 如果是第一个帖子 → 事件 / 设置出席状态

使用事件作者作为参与者,并将其状态设置为 参加。

我已在本地 Workflows GUI 中测试了该确切模式(基于 #42932 叠加),并确认用户会自动注册为事件的 参加 状态。

该 PR 目前仅为草稿,因为它依赖于 #42932。一旦 #42932 合并,我会将其变基(rebase)到 main 分支,届时将只保留与出席状态相关的差异。

2 個讚

@Ethsim2 谢谢你,你太厉害了 :+1: :clap:

1 個讚

有没有一种方法可以重试工作流(使用相同的事件),就像通过 Webhook 重新发送请求体(payload)那样?

不,抱歉,我们目前不支持这个。

2 個讚

当创建新标签时,是否有触发器/事件会触发?

当用户创建新标签时,是否有办法自动将其添加到特定的标签组?如果没有,推荐的做法是什么?

1 個讚

不,我们并没有这些。你能详细描述一下你的使用场景吗?

您能否做到以下几点:

  1. 查看所有新主题
  2. 检查标签是否与现有标签一致
  3. 如果是新标签,<insert action>
1 個讚

有一个“主题标签已更改”(Topic Tag Changed)事件。你可以调用 Discourse API 来查看该标签被使用的次数。如果次数为 1 / 如果它仅出现在该特定主题中,你就知道这个标签是新的。

或者,也许更简单的方法是:为“标签已创建”(tag is created)设置一个 Webhook,并将其指向工作流 Webhook 触发器。

1 個讚

使用场景:我有一个“artist”(艺术家)标签组。新艺术家不断涌现,因此当用户创建新的艺术家标签时,这些标签会不断出现。我希望这些新标签能自动被添加到“artist”标签组中,而不是每次都需要我手动添加。在 Workflows 中,有没有什么好的方法可以实现这一效果?

你怎么知道这是艺术家标签,而不是其他随机标签?

这正是 AI 步骤所处理的内容。AI 代理首先会判断新标签是否属于已定义的任意组别(艺术家 / 成员 / 地区 / 活动类型 / 发行类型);如果都不匹配,该标签将被跳过,而不会被归入任何组别。因此,随机标签会被过滤掉,只有正确分类的标签才会被自动添加到标签组中。

1 個讚

好的,我会添加一些标签创建时的触发器,以及一个用于将标签添加到标签组的节点。

4 個讚

我们已在工作流中添加了以下内容:

7 個讚

我想在主题包含特定文本时为其添加标签。有没有办法将 {{ $JSON.topic.title }} 转换为小写,以便该条件在 “pub run”、“Pub Run” 或 “pUb rUn” 的情况下都返回 true?

(节选)

{
      "id": "db9e2fa2-0008-4110-9c77-f1060124d7e7",
      "type": "condition:if",
      "typeVersion": "1.0",
      "name": "If",
      "parameters": {
        "combinator": "and",
        "conditions": [
          {
            "id": "29d3ed6c-e984-4d9b-83bf-861bd11b4b0a",
            "operator": {
              "type": "string",
              "operation": "contains",
              "singleValue": false
            },
            "leftValue": "={{ $json.topic.title }}",
            "rightValue": "pub run"
          }
        ]
      },

你试过 {{ $JSON.topic.title.toLowerCase() }} 吗?

1 個讚

谢谢——这管用!

用的是什么模板语言?

看起来是 Discourse Workflows 自己的 JavaScript 表达式系统,它在服务器端的沙箱环境中执行,而不是像 Liquid 或 Handlebars 那样的独立模板语言。

因此,例如:

={{ $json.topic.title.toLowerCase() }}

之所以有效,是因为 {{ ... }} 中的内容被作为 JavaScript 进行求值,而 toLowerCase() 是标准的 JavaScript 字符串方法。

其实现位于 plugins/discourse-workflows/lib/discourse_workflows/expression_resolver.rb 文件中;它暴露了工作流特定的全局变量,如 $json、$input、$itemIndex、$trigger、$execution 和 $()。

其语法和概念与 n8n 非常相似。实际上,Workflows 源代码的其他地方明确引用了 n8n:

下方 oneboxed 的提交添加了 merge-node 的组合行为,并包含一个描述为:

defaults clash handling to add_suffix (matches n8n position combine)(默认冲突处理为 add_suffix,与 n8n 的位置组合匹配)

的测试。

因此,有证据表明 Workflows 的部分功能刻意与 n8n 的行为保持一致,尽管我没能找到任何明确说明 表达式语言本身 是复制或基于 n8n 的内容。因此,我会将其描述为 Discourse Workflows 提供的沙箱化 JavaScript 表达式,并带有一些类似 n8n 的约定。

3 個讚

要是表单能支持基于分组的访问权限就好了 :face_holding_back_tears:

2 個讚