Flujos de trabajo de Discourse

:discourse2: Resumen Discourse Workflows permite a los administradores crear automatizaciones avanzadas mediante un constructor visual para automatizar casi cualquier cosa en tu comunidad.
:open_book: Guía de instalación Este plugin viene incluido con el núcleo de Discourse. No es necesario instalar el plugin por separado.

Workflows es un constructor de automatizaciones visual que permite a los administradores crear automatizaciones avanzadas de varios pasos utilizando un lienzo de arrastrar y soltar, conectando disparadores, condiciones, acciones y nodos de control de flujo para automatizar casi cualquier cosa en tu sitio de Discourse.

:discourse: Discourse Workflows está disponible en los planes Business o Enterprise.

Conceptos clave

Si estás familiarizado con otras herramientas de automatización, probablemente reconocerás la mayor parte del vocabulario utilizado en Workflows:

  • Workflow: Una automatización guardada compuesta por nodos conectados.
  • Nodo: Un paso único en un workflow: disparadores, condiciones, acciones y flujo de control / utilidades.
  • Disparador: El punto de partida de un workflow. Un disparador puede ser manual o iniciarse por un evento específico (creación de un tema, ejecución de una programación o una webhook entrante).
  • Condición: Un nodo de enrutamiento que evalúa una regla y divide el flujo en ramas. Por ejemplo, un nodo If (Si) enruta el flujo según una evaluación verdadera o falsa.
  • Acción: Un nodo que realiza algo específico: crear una publicación, otorgar una insignia, llamar a una API externa, etc.
  • Elemento: Los datos que fluyen entre los nodos. Los elementos son objetos JSON que puedes inspeccionar en los registros de ejecución y referenciar utilizando expresiones.
  • Expresión: Un valor dinámico escrito como {{ ... }} que se resuelve en tiempo de ejecución y se utiliza para hacer referencia a datos de nodos anteriores, variables o ajustes del sitio.

Crear un workflow

Para crear un workflow:

  1. Ve a Administración > Plugins > Workflows y haz clic en New workflow.

  1. Nombra tu workflow.
  2. Haz clic en Add first step y elige tu disparador.

  1. Utiliza el botón + para añadir nodos adicionales.

  1. Haz doble clic en un nodo para configurarlo. En el panel de configuración, se mostrarán detalles sobre las entradas del nodo en el lado izquierdo y detalles sobre las salidas del nodo en el lado derecho de la pantalla. Es posible que debas ejecutar el workflow una vez antes de ver todos los detalles varios.

  1. Cuando estés listo para lanzarlo, haz clic en Publish.

:light_bulb: Consejos:

  • Utiliza notas adhesivas, ubicadas en el menú de tres puntos en la parte superior derecha del constructor, para documentar lo que hace tu workflow. Las notas adhesivas no tienen ningún efecto en el workflow, pero facilitan la comprensión de las plantillas y los workflows compartidos.
  • Utiliza el nodo de registro durante el desarrollo para enviar valores de depuración al registro de ejecución sin afectar el comportamiento del workflow.
  • Puedes exportar e importar workflows como JSON para compartirlos con compañeros de equipo o moverlos entre sitios. Consulta Exportar e importar workflows a continuación para ver qué se transfiere y qué no.

Expresiones y datos dinámicos

Los campos que aceptan expresiones muestran un botón {/} en el editor. Haz clic en él para examinar los datos disponibles del disparador y de nodos anteriores e insertar una referencia.

Expresiones comunes

Expresión Qué devuelve
{{ $json.topic.title }} El título del tema del elemento actual
{{ $json.post.url }} La URL de la publicación del elemento actual
{{ $json.user.username }} El nombre de usuario del usuario asociado con el elemento actual
{{ $workflow_vars.my_variable }} El valor de una variable de workflow llamada my_variable
{{ $vars.my_variable }} El valor de una variable global llamada my_variable
{{ $site_settings.title }} El título de tu sitio
{{ $execution.id }} La ID única de la ejecución actual
{{ $('Nombre del Nodo').item.json.property }} Salida de un nodo anterior específico, referenciado por su nombre en el lienzo

Valores estáticos y dinámicos

Los campos que comienzan con = se tratan como expresiones. Los campos sin un = inicial se tratan como texto plano. El selector de expresiones se encarga de esto automáticamente por ti.

Gestionar workflows

Hay varias funciones que te ayudan a gestionar tus workflows existentes.

Ejecuciones

Cada vez que se ejecuta un workflow, Discourse registra una ejecución. Ve a Workflows → Executions para ver el historial.

Cada ejecución muestra la fecha y hora en que se completó y su estado:

  • Completed: Se ejecutó hasta el final sin errores.
  • Error: Falló en un nodo específico; haz clic en la ejecución para ver el error y los datos que lo causaron.
  • Running: Procesando actualmente.
  • Waiting: En pausa debido a un nodo Wait; esperando una respuesta en un formulario, modal, aprobación de chat; o un nodo Call Workflow esperando que se complete un sub-workflow.
  • Rate limited: El workflow se omitió debido a la limitación de tasa.
  • Skipped: El disparador se activó, pero el workflow no estaba publicado.

Puedes hacer clic en el botón Show para ver más en detalle la ejecución del workflow. Esto muestra cada paso del workflow, que puedes expandir para ver los detalles exactos, y la duración de ese paso.

En la parte inferior de la página, puedes ver la duración total del workflow. También puedes Exportar el registro si es necesario para compartirlo o solucionarlo.

Ajustes

En la pestaña Workflows → Settings, puedes:

  • Configurar un workflow de error que debe activarse si hay fallos cuando se ejecuta este workflow. Si el workflow tiene un disparador de error, manejará los errores según lo definido por ese disparador.
  • Establecer la zona horaria para los disparadores de programación. El workflow usará por defecto la zona horaria del sitio si no se establece esta opción.
  • Eliminar el workflow. :warning: Esto es permanente, por lo que debes considerar exportar tu workflow (accesible en el menú de tres puntos en la esquina superior derecha del constructor de workflows) antes de continuar.

Versiones

Cada vez que realices una actualización en el workflow, guardaremos la(s) versión(es) anterior(es). Esto facilita revertir cambios que no funcionaron como esperabas.

Exportar e importar workflows

Utiliza el menú de tres puntos en la esquina superior derecha del constructor de workflows para exportar un workflow como archivo JSON, e importar uno. Usos comunes: compartir un workflow con compañeros de equipo, o moverlo desde un sitio de prueba a producción.

Al importar se añaden los nodos del archivo al workflow que tengas abierto; no se crea un nuevo workflow. Para copiar un workflow, crea primero un workflow vacío y luego importa dentro de él. Los cambios importados se guardan como borrador hasta que los publiques.

Incluido en la exportación: nodos y su configuración, conexiones, notas adhesivas y definiciones de variables de workflow.

No transferidos, por lo que configura esto en el sitio de destino antes de publicar:

  • Credenciales: Las referencias de credenciales se eliminan al importar. Crea las credenciales en el sitio de destino y selecciónalas de nuevo en cada nodo.
  • Tablas de datos: Las tablas, columnas y filas no se exportan. Recréalas y selecciónalas en los nodos Data table.
  • Valores de variables: Las definiciones de variables de workflow se importan, pero no sus valores. Establécelos en la pestaña Variables del workflow. Si ya existe una variable con la misma clave, la importación mantiene la existente y muestra qué claves se omitieron. Las variables globales no se exportan.
  • Ajustes del workflow: El workflow de error y la zona horaria no se aplican. Configúralos de nuevo en la pestaña Settings.
  • Referencias específicas del sitio: Las IDs, nombres y URLs para categorías, grupos, usuarios, canales de chat, consultas de Data Explorer y workflows llamados se mantienen como están y pueden no coincidir con el sitio de destino. Las variables de workflow facilitan cambiarlos.

:light_bulb: Ejecuta manualmente el workflow importado y revisa el registro de Executions antes de publicarlo.

Variables

Hay dos tipos de variables:

  • Variables de workflow están limitadas a un solo workflow. Defínelas en la pestaña Variables del workflow y haz referencia a ellas con {{ $workflow_vars.key_name }}. Tienen un tipo (cadena, entero, booleano, enum, categoría, lista de categorías, grupo, lista de grupos, lista de etiquetas o lista), por lo que los valores se validan y seleccionan con el selector adecuado. Los cambios en definiciones y valores siguen el flujo de borrador/publicación del workflow.
  • Variables globales son compartidas por todos los workflows. Defínelas en Workflows → Variables y haz referencia a ellas con {{ $vars.key_name }}.

Usa variables de workflow para valores que cambian entre sitios o usos, como una categoría, un grupo o un destinatario, para que puedas reutilizar el workflow sin editar sus nodos.

Credenciales

Algunos nodos, como HTTP request o AI Agent, necesitan autenticarse con servicios externos. Almacena claves de API y secretos en Workflows → Credentials en lugar de pegarlas directamente en los campos del nodo. Las credenciales se cifran en reposo y se pueden reutilizar entre workflows.

Tipos de credenciales admitidos:

  • Basic Auth (usuario + contraseña)
  • Bearer token
  • Header auth (nombre y valor de cabecera personalizado)

Tablas de datos

Las tablas de datos son tablas estructuradas persistentes internas del plugin Workflows. Utiliza el nodo Data table para leer de ellas o escribir en ellas. Admiten tipos de columna string, number, boolean y date.

Las tablas de datos son útiles para:

  • Deduplicación: registrar qué usuarios o temas ya ha procesado un workflow
  • Estado: rastrear si un tema está en una etapa particular de un proceso
  • Búsquedas: almacenar mapeos (como ID de tema → miembro del personal asignado) que tus workflows pueden consultar

Ejecuciones

Puedes ver todas las ejecuciones de todos los workflows desde la pestaña Executions. El formato y la función son muy similares a las ejecuciones específicas del workflow, pero muestra todas las workflows para facilitar la supervisión.

Plantillas

Cuando creas un nuevo workflow, puedes comenzar desde una plantilla en lugar de un lienzo en blanco. Las plantillas son workflows pre-construidos para casos de uso comunes; están anotadas con notas adhesivas explicando cómo funcionan y son una buena manera de aprender el sistema.

:megaphone: ¿Interesado en ver más plantillas? Trabajaremos para ampliar la biblioteca de plantillas disponibles con el tiempo, pero háznos saber si hay una plantilla que te gustaría ver aquí para hacer más fácil tu uso de Workflows.

También puedes exportar cualquier workflow como un archivo JSON para compartirlo con otros o usarlo como tu propio punto de partida.

24 Me gusta

Hola, al intentar activar este plugin aparece el siguiente mensaje de error: No tienes permiso para modificar la configuración oculta: discourse_workflows_enabled

2 Me gusta

Por el momento, debe activarse desde /admin/config/upcoming-changes, no desde admin/plugins

3 Me gusta

Hola, si entiendo correctamente el propósito de estos flujos de trabajo, un ejemplo de plantilla que me gustaría es añadir un botón de administrador a los temas que elevaría el tema inmediatamente. ¿Es viable? :grinning_face:

1 me gusta

¡Hola!

¿Cómo aseguramos que “Build with AI” utilice un LLM en particular?
Al usar Google Gemini como LLM predeterminado en nuestro sistema, obtengo el siguiente error: Se recibió una carga útil JSON no válida. Nombre desconocido “additionalProperties” en ‘tools[0].function_declarations[5].parameters’: No se puede encontrar el campo

¡Gracias!

1 me gusta

¿Qué modelo de Gemini estás utilizando? Para cambiarlo, selecciona el agente de flujo de trabajo y reemplaza el LLM predeterminado en él.

1 me gusta

¡Hola, Sam! Gemini 3 Flash.

Encontré la configuración del flujo de trabajo y efectivamente estaba en Gemini Flash 3. Cambié a GPT Nano 5, pero sigo obteniendo el mismo error.

Incluso cambié la configuración predeterminada para todos a GPT Nano 5 y verifiqué la configuración individual del flujo de trabajo. También la establecí para que se anulara con GPT Nano 5.

Sin éxito. :frowning:

1 me gusta

¿Hay alguna posibilidad de que tengas acceso a Luna, Terra, 3.5 Flash o Sonnet?

El agente de IA del flujo de trabajo tiene bastantes herramientas, por lo que suele requerir un LLM reciente.

1 me gusta

Juro que Flash Lite funcionaba, pero no fue así. GPT Nano 5 sí funcionó definitivamente. Parece que este es un problema conocido incluso en WordPress. Aquí hay un enlace de referencia. Lo que debemos hacer es, siempre que usemos un proveedor de Gemini, eliminar el elemento additionalProperties del esquema de respuesta JSON: Remove `additionalProperties` from the JSON response schema - Pull Request #18 - WordPress/ai-provider-for-google - GitHub

uff, estoy desarrollando una implementación de la API de interacciones, así que creo que esto nos proporcionará un puente mucho más estable hacia los modelos de Gemini, con suerte para la próxima semana.

2 Me gusta

¡Genial y gracias por la rápida respuesta! Encontré un poco más de contenido, pero creo que ya te haces una idea. :wink:

Esta es la propia explicación de Gemini de Google. Espero que tenga sentido. No lo entiendo todo, pero sé que se atranca con esa propiedad. Jajaja.

En resumen: El error persiste porque Google utiliza dos motores completamente diferentes para el procesamiento de esquemas. Aunque Gemini admite el esquema JSON estándar para Salidas Estructuradas (response_json_schema), su motor de Llamadas a Funciones / Ejecución de Herramientas sigue utilizando el estricto analizador de Protobuf de OpenAPI 3.0 de Google, que rechaza o se atranca con additionalProperties.

1. Llamada a Herramientas vs. Salida Estructurada (La división de motores)

La API de Gemini de Google valida los esquemas en dos lugares separados:

  • Salidas Estructuradas (response_json_schema): Diseñadas para dar formato a la respuesta final del modelo. Utilizan el análisis estándar de esquemas JSON y manejan additionalProperties sin problemas.

  • Llamada a Herramientas / Funciones (tools[0].function_declarations): Diseñadas para pasar herramientas del sitio (como la búsqueda de Discourse AI, acciones de personajes o navegación web) al modelo. Este punto final analiza los esquemas y los convierte en el objeto Protobuf interno google.ai.generativelanguage.v1beta.Schema de Google.

Dado que el punto final de herramientas mapea los parámetros a un subconjunto heredado de OpenAPI 3.0, enviar additionalProperties en una declaración de función hace que el analizador de la API devuelva un error 400 Solicitud Incorrecta o LLAMADA_A_FUNCIÓN_MALFORMADA.

GitHub

2. Por qué marcos como Discourse lo inyectan

Los marcos de orquestación (Discourse AI, Protocolo de Contexto de Modelo/MCP, LangChain, Pydantic, Zod) generan automáticamente esquemas JSON para herramientas personalizadas:

  1. Valores predeterminados de aplicación estricta: Los generadores añaden automáticamente "additionalProperties": false para forzar una tipificación estricta de los parámetros.

  2. Mapas/Diccionarios dinámicos: Si un parámetro de herramienta utiliza un hash/diccionario de clave-valor (por ejemplo, dict[str, Any] o un Hash de Ruby), los generadores de esquemas producen "additionalProperties": { "type": "string" }.

  3. Carga no filtrada: Cuando Discourse envía estos esquemas de herramientas generados automáticamente al punto final de declaraciones de funciones de Google, el analizador de Protobuf de Gemini marca additionalProperties como un campo no válido o desconocido.

3. Cómo resolverlo en Discourse

Si ves este error en las llamadas a herramientas de Discourse AI:

  • Evita parámetros de hash/diccionario dinámicos: Asegúrate de que los parámetros de las herramientas personalizadas definan explícitamente cada clave esperada bajo properties en lugar de usar objetos abiertos.

  • Serializa datos dinámicos como cadenas: Si una herramienta debe aceptar pares clave-valor arbitrarios, define el parámetro como una CADENA (STRING) e instruye a la herramienta para que acepte una cadena JSON serializada.

  • Filtra additionalProperties en herramientas personalizadas: Si tienes herramientas de IA personalizadas definidas en /admin/plugins/discourse-ai/ai-tools, edita el esquema JSON de los parámetros para eliminar cualquier bloque "additionalProperties".

Acabo de crear una PR que añade soporte para la API de interacción; si tienes un entorno de pruebas, me gustaría que realizaras algunas pruebas adicionales.

¿Hay algún plan para permitir la recuperación de identificadores externos de usuario a través de flujos de trabajo? Me gustaría crear un formulario que verifique cierta información sobre el usuario actual en el sistema de proveedor de identidad antes de continuar, pero el nodo Obtener usuario no devuelve ningún campo external_id, al menos según lo que puedo ver.

Gracias por los comentarios, eso debería solucionarlo: FIX: supports optional data for workflow user node (#42400) · discourse/discourse@4d0c688 · GitHub

3 Me gusta

¿Existe alguna forma de convertir un user_id en un nombre de usuario? Estaba investigando un caso de uso que envía un mensaje personal al creador de un tema. Pero a partir del objeto topic solo puedo obtener el user_id, y la acción para el mensaje personal requiere un nombre de usuario en su lugar.

O alternativamente: si hubiera una manera de obtener la primera publicación usando el topic_id, también funcionaría, ya que veo que la publicación tiene un campo username.

1 me gusta

@thgl Sí, dado que tenemos un nodo data-explorer, es posible ejecutar cualquier tipo de consulta para obtener cualquier tipo de información (en este caso, hardcodeé el user_id, pero entiendes la idea):

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

2 Me gusta

@patrickemin No sé si ya lo has visto, pero he añadido todos los bloques de construcción necesarios para este caso de uso. Avísame si necesitas ayuda.

1 me gusta

¡Ah, eso es genial, gracias!

Bueno, no he encontrado la acción para asignar al botón de tema de administrador para ese caso de uso: