Flujos de trabajo de Discourse

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

Workflows es un constructor de automatización visual que permite a los administradores crear automatizaciones avanzadas y de múltiples pasos utilizando un lienzo de arrastrar y soltar, conectando desencadenadores, 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ía del vocabulario utilizado en Workflows:

  • Flujo de trabajo (Workflow): Una automatización guardada compuesta por nodos conectados.
  • Nodo: Un solo paso en un flujo de trabajo: desencadenadores, condiciones, acciones y control de flujo / utilidades.
  • Desencadenador (Trigger): El punto de inicio de un flujo de trabajo. Un desencadenador puede ser manual o iniciado por un evento específico: creación de un tema, activación de un horario o llegada de un webhook.
  • Condición: Un nodo de enrutamiento que evalúa una regla y divide el flujo en ramas. Por ejemplo, un nodo Si enruta el flujo basándose en 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 (Item): Los datos que fluyen entre nodos. Los elementos son objetos JSON que puedes inspeccionar en los registros de ejecución y referenciar usando expresiones.
  • Expresión: Un valor dinámico escrito como {{ ... }} que se resuelve en tiempo de ejecución y se utiliza para referenciar datos de nodos anteriores, variables del flujo de trabajo o configuraciones del sitio.

Crear un flujo de trabajo

Para construir un flujo de trabajo:

  1. Ve a Admin > Plugins > Workflows y haz clic en Nuevo flujo de trabajo.

  1. Nombra tu flujo de trabajo.
  2. Haz clic en Agregar primer paso y elige tu desencadenador.

  1. Usa el botón + para agregar nodos adicionales.

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

  1. Cuando estés listo para ponerlo en producción, haz clic en Publicar.

:light_bulb: Consejos:

  • Usa notas adhesivas, ubicadas en el menú de tres puntos en la parte superior derecha del constructor, para documentar qué hace tu flujo de trabajo. Las notas adhesivas no tienen ningún efecto en el flujo de trabajo, pero hacen que las plantillas y los flujos de trabajo compartidos sean más fáciles de entender.
  • Usa el nodo de registro durante el desarrollo para enviar valores de depuración al registro de ejecución sin afectar el comportamiento del flujo de trabajo.
  • Puedes exportar e importar flujos de trabajo como JSON para compartirlos con compañeros de equipo o recrear flujos de trabajo de otros sitios.

Expresiones y datos dinámicos

Los campos que aceptan expresiones muestran un botón {/} en el editor. Haz clic en él para navegar por los datos disponibles del desencadenador y los 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
{{ $vars.my_variable }} El valor de una variable de flujo de trabajo llamada my_variable
{{ $site_settings.title }} El título de tu sitio
{{ $execution.id }} El ID único de la ejecución actual
{{ $('Node Name').item.json.property }} Salida de un nodo aguas arriba 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 maneja esto automáticamente por ti.

Gestionar flujos de trabajo

Hay varias funciones que te ayudan a gestionar tus flujos de trabajo existentes.

Ejecuciones

Cada vez que se ejecuta un flujo de trabajo, Discourse registra una ejecución. Ve a Workflows → Ejecuciones para ver el historial.

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

  • Completada: Se ejecutó hasta su finalización 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.
  • En ejecución: Procesando actualmente.
  • En espera: Pausado debido a un nodo de espera; esperando una respuesta en un formulario, modal, aprobación por chat; o un nodo Llamar flujo de trabajo esperando que se complete un subflujo de trabajo.
  • Limitado por tasa: El flujo de trabajo se omitió debido a la limitación de tasa.
  • Omitida: El desencadenador se activó, pero el flujo de trabajo no estaba publicado.

Puedes hacer clic en el botón Mostrar para una mirada más detallada a la ejecución del flujo de trabajo. Esto muestra cada paso del flujo de trabajo, 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 flujo de trabajo. También puedes Exportar el registro si es necesario para fines de compartir o solución de problemas.

Configuración

En la pestaña Workflows → Configuración, puedes:

  • Configurar un flujo de trabajo de error que debería activarse si hay algún fallo cuando se ejecute este flujo de trabajo. Si el flujo de trabajo tiene un desencadenador de error, manejará los errores según lo definido por ese desencadenador.
  • Establecer la zona horaria para los desencadenadores de horario. El flujo de trabajo utilizará la zona horaria del sitio por defecto si esto no está configurado.
  • Eliminar el flujo de trabajo. :warning: Esto es permanente, por lo que deberías considerar exportar tu flujo de trabajo (accesible en el menú de tres puntos en la esquina superior derecha del constructor de flujos de trabajo) antes de continuar.

Versiones

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

Variables

Las variables son pares clave-valor con alcance limitado a un solo flujo de trabajo. Defínelas en el panel Variables del flujo de trabajo y refiérete a ellas en cualquier lugar con {{ $vars.key_name }}. Usa variables para almacenar valores de configuración (como un ID de categoría o un nombre de usuario de destinatario) que quieras poder cambiar sin editar el gráfico del flujo de trabajo.

Credenciales

Algunos nodos, como la solicitud HTTP o el Agente de IA, necesitan autenticarse con servicios externos. Almacena claves API y secretos en Workflows → Credenciales en lugar de pegarlos directamente en los campos de los nodos. Las credenciales están cifradas en reposo y pueden reutilizarse entre flujos de trabajo.

Tipos de credenciales admitidos:

  • Autenticación básica (nombre de usuario + contraseña)
  • Token Bearer
  • Autenticación de encabezado (nombre y valor de encabezado personalizado)

Tablas de datos

Las tablas de datos son tablas estructuradas y persistentes internas del plugin Workflows. Usa el nodo Tabla de datos para leer 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 flujo de trabajo
  • Estado: rastrear si un tema está en una etapa particular de un proceso
  • Consultas: almacenar mapeos (como ID de tema → miembro del personal asignado) que tus flujos de trabajo pueden consultar

Ejecuciones

Puedes ver todas las ejecuciones de todos los flujos de trabajo desde la pestaña Ejecuciones. El formato y la función son muy similares a las ejecuciones específicas del flujo de trabajo, pero muestran en todos los flujos de trabajo para una supervisión más fácil.

Plantillas

Cuando crees un nuevo flujo de trabajo, puedes comenzar desde una plantilla en lugar de un lienzo en blanco. Las plantillas son flujos de trabajo preconstruidos para casos de uso comunes; están anotados con notas adhesivas que explican cómo funcionan y son una buena manera de aprender el sistema.

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

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

21 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: