Discourse ワークフロー

ありがとう、それで解決したよ!

「いいね!」 3

@gilles 上記で言及したフォローアップを実装しました:

これにより、以下の要素を含む汎用的な イベント → 参加状況の設定 操作が追加されます:

  • 参加者
  • 参加状況:参加予定 / 興味あり / 参加しない / 参加状況の削除
  • トピックID
  • 任意のアクター

そのため、元のユースケースは以下のように構築できます:

投稿が作成されたら → 最初の投稿の場合 → イベント / 参加状況の設定

イベントの作成者を参加者として指定し、状態を 参加予定 に設定します。

Workflows GUIでこのパターンをローカルでテストし、#42932 に重ねて適用したところ、ユーザーがイベントに自動的に「参加予定」として登録されることを確認しました。

このPRが現在ドラフトであるのは、#42932 に依存しているためです。#42932 がマージされ次第、main にリベースし、参加状況に関する差分のみを残す予定です。

「いいね!」 2

@Ethsim2 ありがとう、最高だよ :+1: :clap:

「いいね!」 1

Webhookでペイロードを再送信するように、同じイベントでワークフローをリトライする方法はありますか?

申し訳ありませんが、現時点ではこの機能はサポートしておりません。

「いいね!」 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"
          }
        ]
      },

「いいね!」 1

{{ $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 への明示的な参照があります:

以下のコミットはマージノードの結合動作を追加したもので、テストの説明には以下のように記載されています:

defaults clash handling to add_suffix (matches n8n position combine)

つまり、Workflows の一部が意図的に n8n の動作に合わせているという証拠はありますが、式言語自体が n8n からコピーされたものや n8n に基づいていることを明示的に述べているものを見つけることはできませんでした。したがって、これを Discourse Workflows が提供するサンドボックス化された JavaScript 式、かつ n8n 風の慣習をいくつか含んだもの、と説明するのが適切だと思います。

「いいね!」 3

フォームのグループベースアクセスが使えると最高ですね :face_holding_back_tears:

「いいね!」 2

AI Agent ステップでは、エージェントに Bot が有効化されている必要があることに気づきました。なぜこれが必須なのでしょうか?どこかにドキュメント化されていないでしょうか?ドロップダウンメニューで特定のエージェントを選択できない理由を調べるのに数分間かかってしまいました :sweat_smile:

「いいね!」 1