Workflows Discourse

:discourse2: Résumé Discourse Workflows permet aux administrateurs de créer des automatisations avancées grâce à un constructeur visuel, pour automatiser presque tout dans votre communauté.
:open_book: Guide d’installation Ce plugin est inclus dans le cœur de Discourse. Il n’est pas nécessaire de l’installer séparément.

Workflows est un constructeur d’automatisation visuel qui permet aux administrateurs de créer des automatisations avancées en plusieurs étapes à l’aide d’un canevas glisser-déposer — en reliant des déclencheurs, des conditions, des actions et des nœuds de contrôle de flux pour automatiser presque tout sur votre site Discourse.

:discourse: Discourse Workflows est disponible sur les forfaits Business ou Enterprise.

Concepts clés

Si vous connaissez d’autres outils d’automatisation, vous reconnaîtrez probablement la plupart du vocabulaire utilisé dans Workflows :

  • Workflow : Une automatisation enregistrée composée de nœuds connectés.
  • Nœud : Une étape unique dans un workflow : déclencheurs, conditions, actions et contrôle de flux / utilitaires.
  • Déclencheur : Le point de départ d’un workflow. Un déclencheur peut être manuel ou initié par un événement spécifique — création d’un sujet, déclenchement d’une planification ou réception d’un webhook entrant.
  • Condition : Un nœud de routage qui évalue une règle et divise le flux en branches. Par exemple, un nœud Si dirige le flux en fonction d’une évaluation vraie ou fausse.
  • Action : Un nœud qui fait quelque chose de spécifique — créer un message, accorder un badge, appeler une API externe, etc.
  • Élément (Item) : Les données qui circulent entre les nœuds. Les éléments sont des objets JSON que vous pouvez inspecter dans les journaux d’exécution et référencer à l’aide d’expressions.
  • Expression : Une valeur dynamique écrite sous la forme {{ ... }} qui se résout à l’exécution et est utilisée pour référencer des données provenant de nœuds précédents, de variables ou de paramètres du site.

Création d’un workflow

Pour créer un workflow :

  1. Allez dans Admin > Plugins > Workflows et cliquez sur Nouveau workflow.

  1. Donnez un nom à votre workflow.
  2. Cliquez sur Ajouter la première étape et choisissez votre déclencheur.

  1. Utilisez le bouton + pour ajouter des nœuds supplémentaires.

  1. Double-cliquez sur un nœud pour le configurer. Dans le panneau de configuration, les détails concernant les entrées du nœud sont affichés à gauche et les détails concernant les sorties du nœud sont affichés à droite de l’écran. Vous devrez peut-être exécuter le workflow une fois avant de voir tous les détails divers.

  1. Lorsque vous êtes prêt à le mettre en ligne, cliquez sur Publier.

:light_bulb: Conseils :

  • Utilisez les notes collantes, situées dans le menu à trois points en haut à droite du constructeur, pour documenter ce que fait votre workflow. Les notes collantes n’ont aucun effet sur le workflow mais rendent les modèles et les workflows partagés plus faciles à comprendre.
  • Utilisez le nœud de journalisation lors du développement pour envoyer des valeurs de débogage dans le journal d’exécution sans affecter le comportement du workflow.
  • Vous pouvez exporter et importer des workflows au format JSON pour les partager avec des collègues ou les déplacer entre des sites. Voir Exportation et importation de workflows ci-dessous pour ce qui est transféré ou non.

Expressions et données dynamiques

Les champs qui acceptent des expressions affichent un bouton {/} dans l’éditeur. Cliquez dessus pour parcourir les données disponibles provenant du déclencheur et des nœuds précédents et insérer une référence.

Expressions courantes

Expression Ce qu’elle renvoie
{{ $json.topic.title }} Le titre du sujet de l’élément courant
{{ $json.post.url }} L’URL du message de l’élément courant
{{ $json.user.username }} Le nom d’utilisateur associé à l’élément courant
{{ $workflow_vars.my_variable }} La valeur d’une variable de workflow nommée my_variable
{{ $vars.my_variable }} La valeur d’une variable globale nommée my_variable
{{ $site_settings.title }} Le titre de votre site
{{ $execution.id }} L’ID unique de l’exécution actuelle
{{ $('Node Name').item.json.property }} Sortie d’un nœud amont spécifique, référencé par son nom dans le canevas

Valeurs statiques et dynamiques

Les champs commençant par = sont traités comme des expressions. Les champs sans = initial sont traités comme du texte brut. Le sélecteur d’expression gère cela automatiquement pour vous.

Gestion des workflows

Il existe plusieurs fonctionnalités qui vous aident à gérer vos workflows existants.

Exécutions

Chaque fois qu’un workflow s’exécute, Discourse enregistre une exécution. Allez dans Workflows → Exécutions pour voir l’historique.

Chaque exécution indique la date et l’heure de sa fin ainsi que son statut :

  • Terminée : S’est exécutée jusqu’à la fin sans erreur.
  • Erreur : A échoué à un nœud spécifique ; cliquez sur l’exécution pour voir l’erreur et les données qui l’ont provoquée.
  • En cours : Est actuellement en traitement.
  • En attente : En pause en raison d’un nœud d’attente ; en attente d’une réponse dans un formulaire, une fenêtre modale, une approbation de chat ; ou d’un nœud d’appel de workflow qui attend la fin d’un sous-workflow.
  • Limité par le débit : Le workflow a été ignoré en raison de la limitation du débit.
  • Ignoré : Le déclencheur a tiré, mais le workflow n’était pas publié.

Vous pouvez cliquer sur le bouton Afficher pour obtenir une vue plus approfondie de l’exécution du workflow. Cela affiche chaque étape du workflow, que vous pouvez développer pour voir les détails exacts, ainsi que la durée de cette étape.

En bas de la page, vous pouvez voir la durée globale du workflow. Vous pouvez également Exporter le journal si nécessaire pour le partage ou le dépannage.

Paramètres

Dans l’onglet Workflows → Paramètres, vous pouvez :

  • Configurer un workflow d’erreur qui devrait se déclencher s’il y a des échecs lors de l’exécution de ce workflow. Si le workflow a un déclencheur d’erreur, il gérera les erreurs selon les définitions de ce déclencheur.
  • Définir le fuseau horaire pour les déclencheurs de planification. Le workflow utilise par défaut le fuseau horaire du site si ce n’est pas défini.
  • Supprimer le workflow. :warning: Cette action est permanente, vous devez donc envisager d’exporter votre workflow (accessible via le menu à trois points en haut à droite du constructeur de workflow) avant de continuer.

Versions

Chaque fois que vous apportez une mise à jour au workflow, nous sauvegardons la ou les version(s) précédente(s). Cela permet de Revenir en arrière facilement sur les modifications qui n’ont pas fonctionné comme prévu.

Exportation et importation de workflows

Utilisez le menu à trois points en haut à droite du constructeur de workflow pour Exporter un workflow au format JSON, et Importer pour en charger un. Utilisations courantes : partager un workflow avec des collègues, ou le déplacer d’un site de préproduction (staging) à la production.

L’importation ajoute les nœuds du fichier au workflow ouvert ; elle ne crée pas de nouveau workflow. Pour copier un workflow, créez d’abord un workflow vide, puis importez-y. Les modifications importées sont sauvegardées comme brouillon jusqu’à ce que vous publiiez.

Inclus dans l’exportation : nœuds et leur configuration, connexions, notes collantes et définitions des variables de workflow.

Non transférés, donc configurez-les sur le site de destination avant de publier :

  • Identifiants : les références aux identifiants sont supprimées à l’importation. Créez les identifiants sur le site de destination et sélectionnez-les à nouveau dans chaque nœud.
  • Tableaux de données : les tableaux, les colonnes et les lignes ne sont pas exportés. Recréez-les et sélectionnez-les dans les nœuds de Tableau de données.
  • Valeurs des variables : les définitions des variables de workflow sont importées, mais pas leurs valeurs. Définissez-les dans l’onglet Variables du workflow. Si une variable avec la même clé existe déjà, l’importation conserve l’existant et indique quelles clés ont été ignorées. Les variables globales ne sont pas exportées.
  • Paramètres du workflow : le workflow d’erreur et le fuseau horaire ne sont pas appliqués. Définissez-les à nouveau dans l’onglet Paramètres.
  • Références spécifiques au site : les ID, les noms et les URL pour les catégories, les groupes, les utilisateurs, les canaux de chat, les requêtes de Data Explorer et les workflows appelés sont conservés tels quels et peuvent ne pas correspondre au site de destination. Les variables de workflow facilitent leur modification.

:light_bulb: Exécutez le workflow importé manuellement et vérifiez le journal des Exécutions avant de le publier.

Variables

Il existe deux types de variables :

  • Les variables de workflow sont limitées à un seul workflow. Définissez-les dans l’onglet Variables du workflow et référencez-les avec {{ $workflow_vars.key_name }}. Elles ont un type (chaîne de caractères, entier, booléen, énumération, catégorie, liste de catégories, groupe, liste de groupes, liste de tags ou liste), afin que les valeurs soient validées et sélectionnées avec le bon sélecteur. Les modifications des définitions et des valeurs suivent le flux de brouillon/publication du workflow.
  • Les variables globales sont partagées par tous les workflows. Définissez-les dans Workflows → Variables et référencez-les avec {{ $vars.key_name }}.

Utilisez les variables de workflow pour les valeurs qui changent entre les sites ou les utilisations, telles qu’une catégorie, un groupe ou un destinataire, afin de pouvoir réutiliser le workflow sans modifier ses nœuds.

Identifiants

Certains nœuds — comme Requête HTTP ou Agent IA — doivent s’authentifier auprès de services externes. Stockez les clés API et les secrets dans Workflows → Identifiants plutôt que de les coller directement dans les champs des nœuds. Les identifiants sont chiffrés au repos et peuvent être réutilisés entre plusieurs workflows.

Types d’identifiants pris en charge :

  • Auth de base (nom d’utilisateur + mot de passe)
  • Jeton Bearer
  • Auth d’en-tête (nom et valeur d’en-tête personnalisés)

Tableaux de données

Les tableaux de données sont des tableaux structurés et persistants internes au plugin Workflows. Utilisez le nœud Tableau de données pour y lire ou y écrire. Ils prennent en charge les types de colonnes string, number, boolean et date.

Les tableaux de données sont utiles pour :

  • La déduplication — enregistrer quels utilisateurs ou sujets un workflow a déjà traités
  • L’état — suivre si un sujet est dans une étape particulière d’un processus
  • Les recherches — stocker des correspondances (comme ID de sujet → membre du personnel assigné) que vos workflows peuvent interroger

Exécutions

Vous pouvez afficher toutes les exécutions de tous les workflows depuis l’onglet Exécutions. Le format et la fonction sont très similaires aux exécutions spécifiques au workflow, mais s’affichent pour tous les workflows afin de faciliter la surveillance.

Modèles

Lorsque vous créez un nouveau workflow, vous pouvez partir d’un modèle au lieu d’un canevas vierge. Les modèles sont des workflows préconstruits pour des cas d’utilisation courants — ils sont annotés avec des notes collantes expliquant leur fonctionnement et constituent un bon moyen d’apprendre le système.

:megaphone: Intéressé pour voir plus de modèles ? Nous travaillerons à élargir la bibliothèque de modèles disponibles avec le temps, mais veuillez nous faire savoir s’il y a un modèle que vous aimeriez voir ici pour faciliter votre utilisation de Workflows.

Vous pouvez également exporter n’importe quel workflow au format JSON pour le partager avec d’autres ou l’utiliser comme point de départ personnel.

24 « J'aime »

Bonjour, lorsque j’essaie d’activer ce plugin, j’obtiens le message d’erreur suivant : Vous n’avez pas la permission de modifier les paramètres cachés : discourse_workflows_enabled

2 « J'aime »

Pour le moment, il doit être activé depuis /admin/config/upcoming-changes, et non admin/plugins

3 « J'aime »

Salut, si je comprends bien l’objectif de ces Workflows, un exemple de modèle que j’aimerais ajouter est un bouton administrateur sur les sujets qui permettrait de les remonter immédiatement. Est-ce réalisable ? :grinning_face:

1 « J'aime »

Salut !

Comment faire en sorte que « Build with AI » utilise un LLM en particulier ?
Lorsque j’utilise Google Gemini comme LLM par défaut dans notre système, je reçois l’erreur suivante : Invalid JSON payload received. Unknown name “additionalProperties” at ‘tools[0].function_declarations[5].parameters’: Cannot find field

Merci !

1 « J'aime »

Quel modèle Gemini utilisez-vous ? Pour le changer, sélectionnez l’agent de workflow et remplacez le LLM par défaut.

1 « J'aime »

Salut Sam ! Gemini 3 Flash.

J’ai trouvé le paramètre de workflow et c’était bien Gemini Flash 3. Je suis passé à GPT Nano 5, mais j’obtiens toujours la même erreur.

J’ai même changé le paramètre par défaut pour tout le monde vers GPT Nano 5 et vérifié le paramètre de workflow individuel. Je l’ai aussi défini pour qu’il soit remplacé par GPT Nano 5.

Toujours rien qui fonctionne. :frowning:

1 « J'aime »

Y a-t-il une chance que vous ayez accès à Luna ou Terra, ou à 3.5 Flash ou Sonnet ?

L’agent IA de flux de travail dispose de nombreux outils, donc il a tendance à nécessiter un LLM récent.

1 « J'aime »

J’aurais juré que Flash Lite fonctionnait, mais ce n’était pas le cas. GPT Nano 5 fonctionnait en revanche parfaitement. Il semble que ce soit un problème connu, même avec WordPress. Voici un lien pour référence. Ce que nous devons faire, c’est supprimer l’élément additionalProperties du schéma de réponse JSON chaque fois que nous utilisons un fournisseur Gemini : Remove `additionalProperties` from the JSON response schema - Pull Request #18 - WordPress/ai-provider-for-google - GitHub

zut, je suis en train de préparer une migration vers l’API Interactions, donc je pense que cela nous donnera un pont bien plus stable vers les modèles Gemini, espérerons-le pour la semaine prochaine.

2 « J'aime »

Super, et merci pour ta réponse rapide ! J’ai trouvé d’autres contenus, mais je pense que tu as compris l’idée. :wink:

Voici l’explication officielle de Google concernant Gemini. J’espère que cela a du sens ? Je ne comprends pas tout, mais je sais juste que le système bloque sur cette propriété. LOL.

En bref : L’erreur persiste car Google utilise deux moteurs entièrement différents pour le traitement des schémas. Bien que Gemini prenne en charge le JSON Schema standard pour les sorties structurées (response_json_schema), son moteur d’appel de fonctions / exécution d’outils utilise toujours le parseur Protobuf OpenAPI 3.0 strict de Google, qui rejette ou bloque sur additionalProperties.

1. Appel d’outils vs. Sortie structurée (La séparation des moteurs)

L’API Gemini de Google valide les schémas à deux endroits distincts :

  • Sorties structurées (response_json_schema) : Conçues pour formater la réponse finale du modèle. Elles utilisent l’analyse standard du JSON Schema et gèrent additionalProperties proprement.

  • Appel d’outils / de fonctions (tools[0].function_declarations) : Conçu pour transmettre les outils du site (comme la recherche Discourse AI, les actions de persona ou la navigation web) au modèle. Ce point de terminaison analyse les schémas dans l’objet Protobuf interne google.ai.generativelanguage.v1beta.Schema de Google.

Étant donné que le point de terminaison des outils mappe les paramètres vers un sous-ensemble hérité d’OpenAPI 3.0, l’envoi de additionalProperties dans une déclaration de fonction provoque le retour d’une erreur 400 Bad Request ou MALFORMED_FUNCTION_CALL par le parseur de l’API.

GitHub

2. Pourquoi les frameworks comme Discourse l’injectent

Les frameworks d’orchestration (Discourse AI, Model Context Protocol/MCP, LangChain, Pydantic, Zod) génèrent automatiquement des schémas JSON pour les outils personnalisés :

  1. Valeurs par défaut d’exécution stricte : Les générateurs ajoutent automatiquement "additionalProperties": false pour forcer un typage strict des paramètres.

  2. Tables/Dictionnaires dynamiques : Si un paramètre d’outil utilise une table de hachage clé-valeur (par exemple, dict[str, Any] ou un Hash Ruby), les générateurs de schéma produisent "additionalProperties": { "type": "string" }.

  3. Charge utile non nettoyée : Lorsque Discourse envoie ces schémas d’outils générés automatiquement au point de terminaison des déclarations de fonctions de Google, le parseur Protobuf de Gemini identifie additionalProperties comme un champ invalide ou inconnu.

3. Comment résoudre le problème dans Discourse

Si vous rencontrez cette erreur dans les appels d’outils Discourse AI :

  • Évitez les paramètres de type Hash/Dict dynamiques : Assurez-vous que les paramètres d’outils personnalisés définissent explicitivement chaque clé attendue sous properties plutôt que d’utiliser des objets ouverts.

  • Sérialisez les données dynamiques en chaînes : Si un outil doit accepter des paires clé-valeur arbitraires, définissez le paramètre comme une STRING et instructez l’outil à accepter une chaîne JSON sérialisée.

  • Filtrez additionalProperties dans les outils personnalisés : Si vous avez défini des outils IA personnalisés sous /admin/plugins/discourse-ai/ai-tools, modifiez le schéma JSON des paramètres pour supprimer tout bloc "additionalProperties".

Je viens de créer une PR qui ajoute le support pour l’API d’interaction. Si vous avez un environnement de test, je serais ravi que vous fassiez quelques tests supplémentaires.

Y a-t-il des prévisions pour permettre la récupération des identifiants externes des utilisateurs via les workflows ? J’aimerais créer un formulaire qui vérifie certaines informations concernant l’utilisateur actuel dans le système de fournisseur d’identité avant de poursuivre, mais le nœud « Obtenir l’utilisateur » ne semble pas renvoyer de champ external_id, autant que je sache.

Merci pour vos commentaires, cela devrait résoudre le problème : FIX: supports optional data for workflow user node (#42400) · discourse/discourse@4d0c688 · GitHub

3 « J'aime »

Existe-t-il un moyen de convertir un user_id en username ? J’examine un cas d’utilisation qui envoie un message privé au créateur d’un sujet. Mais à partir de l’objet topic, je ne peux obtenir que le user_id, et l’action pour envoyer un message privé exige un username à la place.

Ou, alternativement — s’il existait un moyen de récupérer le premier message à partir du topic_id, cela fonctionnerait aussi, car je vois que le post possède un champ username.

1 « J'aime »

@thgl Oui, étant donné que nous disposons d’un nœud data-explorer, tout type de requête pour obtenir toute sorte d’informations est possible (dans ce cas, j’ai codé en dur le user_id, mais vous avez l’idée) :

workflow-nodes-2026-08-18.json (2,1 Ko)

2 « J'aime »

@patrickemin Je ne sais pas si tu l’as déjà vu, mais j’ai ajouté tous les éléments nécessaires pour ce cas d’utilisation. Dis-moi si tu as besoin d’aide.

1 « J'aime »

Ah, c’est super, merci !

Eh bien, je n’ai pas trouvé l’action à affecter au bouton de sujet administrateur pour ce cas d’utilisation :