Workflows do Discourse

:discourse2: Resumo O Discourse Workflows permite que administradores criem automações avançadas por meio de um construtor visual para automatizar quase tudo em sua comunidade.
:open_book: Guia de Instalação Este plugin está incluído no núcleo do Discourse. Não é necessário instalar o plugin separadamente.

O Workflows é um construtor visual de automação que permite que administradores criem automações avançadas e de múltiplas etapas usando um canvas de arrastar e soltar — conectando gatilhos, condições, ações e nós de controle de fluxo para automatizar quase qualquer coisa em seu site Discourse.

:discourse: O Discourse Workflows está disponível nos planos Business ou Enterprise.

Conceitos principais

Se você estiver familiarizado com outras ferramentas de automação, provavelmente reconhecerá a maior parte do vocabulário usado no Workflows:

  • Workflow: Uma automação salva composta por nós conectados.
  • Nó: Um único passo em um workflow: gatilhos, condições, ações e utilitários de controle de fluxo.
  • Gatilho: O ponto de partida de um workflow. Um gatilho pode ser manual ou iniciado por um evento específico — a criação de um tópico, a execução de um agendamento ou um webhook recebido.
  • Condição: Um nó de roteamento que avalia uma regra e divide o fluxo em ramificações. Por exemplo, um nó If direciona o fluxo com base em uma avaliação verdadeira ou falsa.
  • Ação: Um nó que realiza uma tarefa específica — criar um post, conceder uma medalha, chamar uma API externa, etc.
  • Item: Os dados que fluem entre os nós. Os itens são objetos JSON que você pode inspecionar nos logs de execução e referenciar usando expressões.
  • Expressão: Um valor dinâmico escrito como {{ ... }} que é resolvido em tempo de execução e usado para referenciar dados de nós anteriores, variáveis ou configurações do site.

Criando um workflow

Para criar um workflow:

  1. Vá para Admin > Plugins > Workflows e clique em Novo workflow.

  1. Dê um nome ao seu workflow.
  2. Clique em Adicionar primeira etapa e escolha seu gatilho.

  1. Use o botão + para adicionar nós adicionais.

  1. Clique duas vezes em um nó para configurá-lo. No painel de configuração, os detalhes sobre as entradas do nó serão mostrados no lado esquerdo e os detalhes sobre as saídas do nó serão mostrados no lado direito da tela. Você pode precisar executar o workflow uma vez antes de ver todos os detalhes variados.

  1. Quando estiver pronto para colocar em produção, clique em Publicar.

:light_bulb: Dicas:

  • Use notas adesivas, localizadas no menu de três pontos no canto superior direito do construtor, para documentar o que seu workflow faz. As notas não têm nenhum efeito no workflow, mas tornam os modelos e workflows compartilhados mais fáceis de entender.
  • Use o nó de log durante o desenvolvimento para enviar valores de depuração para o log de execução sem impactar o comportamento do workflow.
  • Você pode exportar e importar workflows como JSON para compartilhá-los com colegas da equipe ou movê-los entre sites. Veja Exportando e importando workflows abaixo para saber o que é e o que não é transferido.

Expressões e dados dinâmicos

Os campos que aceitam expressões exibem um botão {/} no editor. Clique nele para navegar pelos dados disponíveis do gatilho e dos nós anteriores e inserir uma referência.

Expressões comuns

Expressão O que retorna
{{ $json.topic.title }} O título do tópico do item atual
{{ $json.post.url }} A URL do post do item atual
{{ $json.user.username }} O nome de usuário do usuário associado ao item atual
{{ $workflow_vars.my_variable }} O valor de uma variável de workflow chamada my_variable
{{ $vars.my_variable }} O valor de uma variável global chamada my_variable
{{ $site_settings.title }} O título do seu site
{{ $execution.id }} O ID exclusivo da execução atual
{{ $('Node Name').item.json.property }} Saída de um nó anterior específico, referenciado pelo seu nome no canvas

Valores estáticos e dinâmicos

Campos que começam com = são tratados como expressões. Campos sem um = inicial são tratados como texto simples. O seletor de expressões cuida disso automaticamente para você.

Gerenciando workflows

Existem vários recursos que ajudam você a gerenciar seus workflows existentes.

Execuções

Sempre que um workflow é executado, o Discourse registra uma execução. Vá para Workflows → Execuções para ver o histórico.

Cada execução mostra a data e hora em que foi concluída e seu status:

  • Concluída: Executada até o fim sem erros.
  • Erro: Falhou em um nó específico; clique na execução para ver o erro e os dados que o causaram.
  • Executando: Atualmente sendo processada.
  • Aguardando: Pausada devido a um nó de Espera; aguardando uma resposta em um formulário, modal, aprovação de chat; ou um nó de Chamada de Workflow aguardando a conclusão de um sub-workflow.
  • Limitada por taxa: O workflow foi ignorado devido ao limite de taxa.
  • Ignorada: O gatilho foi disparado, mas o workflow não estava publicado.

Você pode clicar no botão Mostrar para ter uma visão mais detalhada da execução do workflow. Isso mostra cada etapa do workflow, que você pode expandir para ver os detalhes exatos, e a duração dessa etapa.

Na parte inferior da página, você pode ver a duração total do workflow. Você também pode Exportar o log, se necessário, para fins de compartilhamento ou solução de problemas.

Configurações

Na aba Workflows → Configurações, você pode:

  • Configurar um workflow de erro que deve ser disparado se houver falhas durante a execução deste workflow. Se o workflow tiver um gatilho de erro, ele lidará com os erros conforme definido por esse gatilho.
  • Definir o fuso horário para gatilhos agendados. O workflow usará por padrão o fuso horário do site se isso não estiver definido.
  • Excluir o workflow. :warning: Esta ação é permanente, então você deve considerar exportar seu workflow (acessível no menu de três pontos no canto superior direito do construtor de workflows) antes de prosseguir.

Versões

Sempre que você fizer uma atualização no workflow, salvaremos a(s) versão(ões) anterior(es). Isso facilita Reverter alterações que não funcionaram como você esperava.

Exportando e importando workflows

Use o menu de três pontos no canto superior direito do construtor de workflows para Exportar um workflow como um arquivo JSON e Importar para carregar um. Usos comuns: compartilhar um workflow com colegas da equipe ou movê-lo de um site de staging para produção.

Importar adiciona os nós do arquivo ao workflow que você tem aberto; ele não cria um novo workflow. Para copiar um workflow, crie um workflow vazio primeiro e depois importe para ele. As alterações importadas são salvas como rascunho até que você publique.

Incluídos na exportação: nós e sua configuração, conexões, notas adesivas e definições de variáveis de workflow.

Não transferidos, então configure-os no site de destino antes de publicar:

  • Credenciais: as referências de credenciais são removidas na importação. Crie as credenciais no site de destino e selecione-as novamente em cada nó.
  • Tabelas de dados: tabelas, colunas e linhas não são exportadas. Recrie-as e selecione-as nos nós de Tabela de Dados.
  • Valores de variáveis: as definições de variáveis de workflow são importadas, mas não seus valores. Defina-as na aba Variáveis do workflow. Se uma variável com a mesma chave já existir, a importação manterá a existente e mostrará quais chaves foram ignoradas. Variáveis globais não são exportadas.
  • Configurações do workflow: o workflow de erro e o fuso horário não são aplicados. Configure-os novamente na aba Configurações.
  • Referências específicas do site: IDs, nomes e URLs de categorias, grupos, usuários, canais de chat, consultas do Data Explorer e workflows chamados são mantidos como estão e podem não corresponder ao site de destino. Variáveis de workflow facilitam a alteração desses valores.

:light_bulb: Execute o workflow importado manualmente e verifique o log de Execuções antes de publicá-lo.

Variáveis

Existem dois tipos de variáveis:

  • Variáveis de workflow têm escopo limitado a um único workflow. Defina-as na aba Variáveis do workflow e referencie-as com {{ $workflow_vars.key_name }}. Elas têm um tipo (string, inteiro, booleano, enum, categoria, lista de categorias, grupo, lista de grupos, lista de tags ou lista), então os valores são validados e selecionados com o seletor correto. Alterações nas definições e valores seguem o fluxo de rascunho/publicação do workflow.
  • Variáveis globais são compartilhadas por todos os workflows. Defina-as em Workflows → Variáveis e referencie-as com {{ $vars.key_name }}.

Use variáveis de workflow para valores que mudam entre sites ou usos, como uma categoria, um grupo ou um destinatário, para que você possa reutilizar o workflow sem editar seus nós.

Credenciais

Alguns nós — como solicitação HTTP ou Agente de IA — precisam autenticar com serviços externos. Armazene chaves de API e segredos em Workflows → Credenciais em vez de colá-los diretamente nos campos dos nós. As credenciais são criptografadas em repouso e podem ser reutilizadas em vários workflows.

Tipos de credenciais suportados:

  • Autenticação Básica (nome de usuário + senha)
  • Token Bearer
  • Autenticação por Cabeçalho (nome e valor de cabeçalho personalizados)

Tabelas de dados

As tabelas de dados são tabelas estruturadas persistentes internas do plugin Workflows. Use o nó Tabela de dados para ler delas ou escrever nelas. Elas suportam tipos de colunas string, number, boolean e date.

As tabelas de dados são úteis para:

  • Deduplicação — registrar quais usuários ou tópicos um workflow já processou
  • Estado — rastrear se um tópico está em uma determinada etapa de um processo
  • Buscas — armazenar mapeamentos (como ID do tópico → membro da equipe atribuído) que seus workflows podem consultar

Execuções

Você pode visualizar todas as execuções de todos os workflows na aba Execuções. O formato e a função são muito semelhantes às execuções específicas do workflow, mas mostram informações de todos os workflows para facilitar o monitoramento.

Modelos

Quando você cria um novo workflow, pode começar a partir de um modelo em vez de um canvas em branco. Os modelos são workflows pré-construídos para casos de uso comuns — eles são anotados com notas adesivas explicando como funcionam e são uma ótima maneira de aprender o sistema.

:megaphone: Interessado em ver mais modelos? Trabalharemos para expandir a biblioteca de modelos disponíveis com o tempo, mas, por favor, nos avise se houver um modelo que você gostaria de ver aqui para facilitar seu uso do Workflows.

Você também pode exportar qualquer workflow como um arquivo JSON para compartilhá-lo com outras pessoas ou usá-lo como seu próprio ponto de partida.

24 Curtiram

Olá, ao tentar ativar este plugin, recebi a seguinte mensagem de erro: Você não tem permissão para alterar as configurações ocultas: discourse_workflows_enabled

2 Curtiram

No momento, deve ser ativado em /admin/config/upcoming-changes, não em admin/plugins

3 Curtiram

Oi, se eu entendi bem o propósito desses Workflows, um exemplo de modelo que eu gostaria é adicionar um botão de administrador aos tópicos que faria o tópico subir imediatamente. É viável? :grinning_face:

1 Curtiu

Olá!

Como garantimos que o “Build with AI” utilize um LLM específico?
Ao usar o Google Gemini como LLM padrão em nosso sistema, estou recebendo o seguinte erro: Carga útil JSON inválida recebida. Nome desconhecido “additionalProperties” em ‘tools[0].function_declarations[5].parameters’: Não é possível encontrar o campo

Obrigado!

1 Curtiu

Qual modelo do Gemini você está usando? Para alterá-lo, selecione o agente de fluxo de trabalho e substitua o LLM padrão por outro.

1 Curtiu

E aí, Sam! Gemini 3 Flash.

Encontrei a configuração de fluxo de trabalho e realmente estava como Gemini Flash 3. Mudei para o GPT Nano 5, mas continuo recebendo o mesmo erro.

Mudei até o padrão para todos para GPT Nano 5 e verifiquei a configuração individual do fluxo de trabalho. Configurei para substituir pelo GPT Nano 5 também.

Mas nada disso funcionou. :frowning:

1 Curtiu

Há alguma chance de você ter acesso ao Luna, Terra, 3.5 Flash ou Sonnet?

O agente de IA do fluxo de trabalho tem bastante ferramentas, então geralmente requer um LLM mais recente.

1 Curtiu

Jurei que o Flash Lite funcionava, mas não funcionou. O GPT Nano 5 definitivamente funcionou. Parece que este é um problema conhecido, mesmo no WordPress. Aqui está um link para referência. O que precisamos fazer é, sempre que estivermos usando um provedor Gemini, remover o item additionalProperties do JSON Response Schema: Remove `additionalProperties` from the JSON response schema - Pull Request #18 - WordPress/ai-provider-for-google - GitHub

caramba, estou desenvolvendo uma migração para a API de interações, então acho que isso deve nos proporcionar uma integração muito mais estável com os modelos Gemini, espero que na próxima semana.

2 Curtiram

Incrível e obrigado pela resposta rápida! Encontrei mais alguns conteúdos, mas acho que você já entendeu a ideia. :wink:

Esta é a própria explicação do Gemini, da Google. Espero que faça sentido? Eu não entendo tudo, mas sei que ele engasga com essa propriedade. LOL.

TL;DR: O erro persiste porque a Google usa dois motores completamente diferentes para processamento de esquemas. Embora o Gemini suporte o JSON Schema padrão para Saídas Estruturadas (response_json_schema), seu motor de Chamada de Função / Execução de Ferramenta ainda usa o parser Protobuf OpenAPI 3.0 rigoroso da Google, que rejeita ou engasga com additionalProperties.

1. Chamada de Ferramenta vs. Saída Estruturada (A Divisão dos Motores)

A API Gemini da Google valida esquemas em dois lugares separados:

  • Saídas Estruturadas (response_json_schema): Projetada para formatar a resposta final do modelo. Usa a análise padrão do JSON Schema e lida com additionalProperties de forma limpa.

  • Chamada de Ferramenta / Função (tools[0].function_declarations): Projetada para passar ferramentas de site (como pesquisa de IA do Discourse, ações de persona ou navegação na web) para o modelo. Este endpoint analisa esquemas para o objeto Protobuf interno google.ai.generativelanguage.v1beta.Schema da Google.

Como o endpoint de ferramenta mapeia parâmetros para um subconjunto legado do OpenAPI 3.0, enviar additionalProperties em uma declaração de função faz com que o parser da API retorne um 400 Bad Request ou MALFORMED_FUNCTION_CALL.

GitHub

2. Por Que Frameworks Como o Discourse o Injetam

Frameworks de orquestração (Discourse AI, Model Context Protocol/MCP, LangChain, Pydantic, Zod) geram automaticamente esquemas JSON para ferramentas personalizadas:

  1. Padrões de Execução Rigorosa: Os geradores adicionam automaticamente "additionalProperties": false para forçar a tipagem rigorosa de parâmetros.

  2. Mapas/Dicionários Dinâmicos: Se um parâmetro de ferramenta usar um hash/dicionário de chave-valor (por exemplo, dict[str, Any] ou um Hash do Ruby), os geradores de esquema produzem "additionalProperties": { "type": "string" }.

  3. Carga Não Sanitizada: Quando o Discourse envia esses esquemas de ferramenta gerados automaticamente para o endpoint de declarações de função da Google, o parser Protobuf do Gemini sinaliza additionalProperties como um campo inválido ou desconhecido.

3. Como Resolver Isso no Discourse

Se você estiver vendo esse erro nas chamadas de ferramentas do Discourse AI:

  • Evite Parâmetros de Hash/Dict Dinâmicos: Certifique-se de que os parâmetros de ferramentas personalizadas definam explicitamente cada chave esperada sob properties, em vez de usar objetos de abertura livre.

  • Serialize Dados Dinâmicos como Strings: Se uma ferramenta precisar aceitar pares chave-valor arbitrários, defina o parâmetro como STRING e instrua a ferramenta a aceitar uma string JSON serializada.

  • Filtre additionalProperties em Ferramentas Personalizadas: Se você tiver ferramentas de IA personalizadas definidas em /admin/plugins/discourse-ai/ai-tools, edite o esquema JSON do parâmetro para remover quaisquer blocos "additionalProperties".

Acabei de criar um PR que adiciona suporte à API de interação. Se você tiver um ambiente de teste, ficaria grato por mais testes.

Há planos para permitir a recuperação de IDs de usuários externos por meio de fluxos de trabalho? Gostaria de criar um formulário que verifique algumas informações sobre o usuário atual no sistema de provedor de identidade antes de continuar, mas o nó “Obter Usuário” não parece retornar nenhum campo external_id, pelo que pude observar.

Obrigado pelo feedback, isso deve resolver: FIX: supports optional data for workflow user node (#42400) · discourse/discourse@4d0c688 · GitHub

3 Curtiram

Existe alguma maneira de converter um user_id em username? Eu estava analisando um caso de uso que envia uma mensagem pessoal ao criador de um tópico. Mas a partir do objeto topic, só consigo obter o user_id, e a ação para mensagem pessoal exige um username.

Ou, alternativamente, se houvesse uma maneira de obter a primeira publicação usando o topic_id, também funcionaria, pois vejo que a publicação tem um campo username.

1 Curtiu

@thgl Sim, já que temos um nó de explorador de dados, é possível fazer qualquer tipo de consulta para obter qualquer tipo de informação (neste caso, eu fixei o user_id, mas você entende a ideia):

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

2 Curtiram

@patrickemin Não tenho certeza se você já viu, mas adicionei todos os blocos de construção necessários para esse caso de uso. Me avise se precisar de ajuda.

1 Curtiu

Ah, isso é muito legal, obrigado!

Bem, não encontrei a ação para atribuir ao botão de tópico de administrador para esse caso de uso: