Действия Discourse

:discourse2: Краткое содержание Discourse Workflows позволяет администраторам создавать сложные автоматизации с помощью визуального конструктора, чтобы автоматизировать практически любые действия в вашем сообществе.
:open_book: Руководство по установке Этот плагин включен в ядро Discourse. Нет необходимости устанавливать его отдельно.

Workflows — это визуальный конструктор автоматизации, который позволяет администраторам создавать сложные многошаговые автоматизации с помощью перетаскивания на холсте, соединяя триггеры, условия, действия и узлы управления потоком, чтобы автоматизировать практически все на вашем сайте Discourse.

:discourse: Discourse Workflows доступен на тарифных планах Business и Enterprise.

Ключевые концепции

Если вы знакомы с другими инструментами автоматизации, вы, вероятно, узнаете большинство терминов, используемых в Workflows:

  • Workflow (Рабочий процесс): Сохраненная автоматизация, состоящая из связанных узлов.
  • Node (Узел): Отдельный шаг в рабочем процессе: триггеры, условия, действия и узлы управления потоком / утилиты.
  • Trigger (Триггер): Начальная точка рабочего процесса. Триггер может быть запущен вручную или по конкретному событию — создание темы, срабатывание расписания или входящий вебхук.
  • Condition (Условие): Узел маршрутизации, который оценивает правило и разделяет поток на ветви. Например, узел If направляет поток на основе истинности или ложности оценки.
  • Action (Действие): Узел, который выполняет конкретное действие — создание поста, выдача значка, вызов внешнего API и т. д.
  • Item (Элемент): Данные, передаваемые между узлами. Элементы — это JSON-объекты, которые можно просматривать в журналах выполнения и обращаться к ним с помощью выражений.
  • Expression (Выражение): Динамическое значение, записанное как {{ ... }}, которое вычисляется во время выполнения и используется для ссылок на данные из предыдущих узлов, переменных или настроек сайта.

Создание рабочего процесса

Чтобы построить рабочий процесс:

  1. Перейдите в Администрирование > Плагины > Workflows и нажмите Новый рабочий процесс.

  1. Назовите ваш рабочий процесс.
  2. Нажмите Добавить первый шаг и выберите триггер.

  1. Используйте кнопку +, чтобы добавить дополнительные узлы.

  1. Дважды щелкните узел, чтобы настроить его. В панели конфигурации слева отображаются сведения о входных данных для узла, а справа — сведения о выходных данных. Возможно, вам потребуется запустить рабочий процесс один раз, чтобы увидеть все различные детали.

  1. Когда вы будете готовы к запуску, нажмите Опубликовать.

:light_bulb: Советы:

  • Используйте стикеры (липкие заметки), находящиеся в меню с тремя точками в правом верхнем углу конструктора, чтобы задокументировать, что делает ваш рабочий процесс. Стикерные заметки не влияют на рабочий процесс, но делают шаблоны и общие рабочие процессы более понятными.
  • Используйте узел журнала во время разработки, чтобы отправлять отладочные значения в журнал выполнения, не влияя на поведение рабочего процесса.
  • Вы можете экспортировать и импортировать рабочие процессы в формате JSON, чтобы делиться ими с коллегами или перемещать между сайтами. Ниже см. раздел Экспорт и импорт рабочих процессов, чтобы узнать, что переносится, а что нет.

Выражения и динамические данные

Поля, принимающие выражения, имеют кнопку {/} в редакторе. Нажмите на нее, чтобы просмотреть доступные данные из триггера и предыдущих узлов и вставить ссылку.

Общие выражения

Выражение Что возвращает
{{ $json.topic.title }} Название темы из текущего элемента
{{ $json.post.url }} URL поста из текущего элемента
{{ $json.user.username }} Имя пользователя, связанного с текущим элементом
{{ $workflow_vars.my_variable }} Значение переменной рабочего процесса с именем my_variable
{{ $vars.my_variable }} Значение глобальной переменной с именем my_variable
{{ $site_settings.title }} Название вашего сайта
{{ $execution.id }} Уникальный идентификатор текущего выполнения
{{ $('Node Name').item.json.property }} Вывод из конкретного вышестоящего узла, на который ссылается его имя на холсте

Статические и динамические значения

Поля, начинающиеся с =, трактуются как выражения. Поля без ведущего = трактуются как обычный текст. Выборщик выражений делает это за вас автоматически.

Управление рабочими процессами

Существует множество функций, которые помогают управлять существующими рабочими процессами.

Выполнения

Каждый раз, когда рабочий процесс выполняется, Discourse записывает выполнение. Перейдите в Workflows → Выполнения, чтобы посмотреть историю.

Каждое выполнение показывает дату и время завершения и его статус:

  • Завершено: Выполнено без ошибок.
  • Ошибка: Сбой на конкретном узле; нажмите на выполнение, чтобы увидеть ошибку и данные, вызвавшие ее.
  • Выполняется: В настоящее время обрабатывается.
  • Ожидание: Приостановлено из-за узла Wait; ожидание ответа в форме, модальном окне, утверждении в чате; или узел Call Workflow ожидает завершения подпроцесса.
  • Ограничение частоты запросов: Рабочий процесс был пропущен из-за ограничения частоты запросов.
  • Пропущено: Триггер сработал, но рабочий процесс не был опубликован.

Вы можете нажать кнопку Показать, чтобы более подробно ознакомиться с выполнением рабочего процесса. Это показывает каждый шаг рабочего процесса, который можно развернуть для просмотра точных деталей, а также продолжительность этого шага.

Внизу страницы вы можете увидеть общую продолжительность рабочего процесса. Вы также можете Экспортировать журнал, если это необходимо для обмена или устранения неполадок.

Настройки

На вкладке Workflows → Настройки вы можете:

  • Настроить рабочий процесс ошибок, который должен запускаться, если при выполнении этого рабочего процесса возникают ошибки. Если рабочий процесс имеет триггер ошибок, он будет обрабатывать ошибки, определенные этим триггером.
  • Установить часовой пояс для триггеров по расписанию. Если этот параметр не установлен, рабочий процесс по умолчанию использует часовой пояс сайта.
  • Удалить рабочий процесс. :warning: Это действие необратимо, поэтому перед продолжением рекомендуется экспортировать рабочий процесс (доступно в меню с тремя точками в правом верхнем углу конструктора).

Версии

Каждый раз, когда вы вносите изменения в рабочий процесс, мы сохраняем предыдущие версии. Это позволяет легко Вернуть изменения, которые сработали не так, как ожидалось.

Экспорт и импорт рабочих процессов

Используйте меню с тремя точками в правом верхнем углу конструктора рабочего процесса, чтобы Экспортировать рабочий процесс в файл JSON, и Импортировать, чтобы загрузить его. Частые случаи использования: обмен рабочим процессом с коллегами или перенос его с тестового сайта на производственный.

Импорт добавляет узлы из файла в открытый вами рабочий процесс; он не создает новый рабочий процесс. Чтобы скопировать рабочий процесс, сначала создайте пустой рабочий процесс, а затем импортируйте его. Импортированные изменения сохраняются как черновик до публикации.

Включено в экспорт: узлы и их конфигурация, соединения, стикеры и определения переменных рабочего процесса.

Не переносится, поэтому настройте эти элементы на сайте назначения перед публикацией:

  • Учетные данные: Ссылки на учетные данные удаляются при импорте. Создайте учетные данные на сайте назначения и снова выберите их в каждом узле.
  • Таблицы данных: Таблицы, столбцы и строки не экспортируются. Воссоздайте их и выберите в узлах «Таблица данных».
  • Значения переменных: Определения переменных рабочего процесса импортируются, но не их значения. Установите их на вкладке Переменные рабочего процесса. Если переменная с тем же ключом уже существует, импорт сохраняет существующую и показывает, какие ключи были пропущены. Глобальные переменные не экспортируются.
  • Настройки рабочего процесса: Рабочий процесс ошибок и часовой пояс не применяются. Установите их снова на вкладке Настройки.
  • Ссылки, специфичные для сайта: Идентификаторы, имена и URL-адреса категорий, групп, пользователей, каналов чата, запросов Data Explorer и вызываемых рабочих процессов сохраняются как есть и могут не совпадать с сайтом назначения. Переменные рабочего процесса облегчают их изменение.

:light_bulb: Запустите импортированный рабочий процесс вручную и проверьте журнал Выполнений перед его публикацией.

Переменные

Существует два вида переменных:

  • Переменные рабочего процесса имеют область действия только в рамках одного рабочего процесса. Определите их на вкладке Переменные рабочего процесса и обратитесь к ним с помощью {{ $workflow_vars.key_name }}. Они имеют тип (строка, целое число, булево, перечисление, категория, список категорий, группа, список групп, список тегов или список), поэтому значения проверяются и выбираются с помощью правильного селектора. Изменения определений и значений следуют черновому/публикационному потоку рабочего процесса.
  • Глобальные переменные используются всеми рабочими процессами. Определите их в Workflows → Переменные и обратитесь к ним с помощью {{ $vars.key_name }}.

Используйте переменные рабочего процесса для значений, которые меняются между сайтами или случаями использования, таких как категория, группа или получатель, чтобы вы могли повторно использовать рабочий процесс, не редактируя его узлы.

Учетные данные

Некоторые узлы — такие как HTTP-запрос или AI Agent — требуют аутентификации во внешних сервисах. Храните ключи API и секреты в Workflows → Учетные данные, а не вставляйте их непосредственно в поля узлов. Учетные данные шифруются при хранении и могут повторно использоваться в разных рабочих процессах.

Поддерживаемые типы учетных данных:

  • Basic Auth (имя пользователя + пароль)
  • Bearer token (токен Bearer)
  • Header auth (пользовательское имя заголовка и значение)

Таблицы данных

Таблицы данных — это постоянные структурированные таблицы, внутренние для плагина Workflows. Используйте узел Таблица данных для чтения из них или записи в них. Они поддерживают типы столбцов string (строка), number (число), boolean (логический) и date (дата).

Таблицы данных полезны для:

  • Дедупликации — записи того, каких пользователей или темы рабочий процесс уже обработал.
  • Состояния — отслеживания того, находится ли тема на определенном этапе процесса.
  • Поиска — хранения отображений (например, ID темы → назначенный сотрудник), которые ваши рабочие процессы могут запрашивать.

Выполнения

Вы можете просмотреть все выполнения всех рабочих процессов на вкладке Выполнения. Формат и функциональность очень похожи на специфичные для рабочего процесса выполнения, но показываются в разрезе всех рабочих процессов для более простого мониторинга.

Шаблоны

При создании нового рабочего процесса вы можете начать с шаблона, а не с пустого холста. Шаблоны — это готовые рабочие процессы для общих случаев использования — они снабжены стикерами, объясняющими, как они работают, и являются хорошим способом изучить систему.

:megaphone: Хотите увидеть больше шаблонов? Со временем мы будем расширять библиотеку доступных шаблонов, но, пожалуйста, сообщите нам, если есть шаблон, который вы хотели бы здесь видеть, чтобы упростить использование Workflows.

Вы также можете экспортировать любой рабочий процесс в файл JSON, чтобы поделиться им с другими или использовать его в качестве собственной отправной точки.

24 лайка

Привет, при попытке активировать этот плагин я получаю следующее сообщение об ошибке: У вас нет разрешения на изменение скрытых настроек: discourse_workflows_enabled

2 лайка

В настоящее время его необходимо включить в /admin/config/upcoming-changes, а не в admin/plugins

3 лайка

Привет! Если я правильно понимаю назначение этих рабочих процессов, то один из примеров шаблона, который я хотел бы предложить, — это добавить административную кнопку к темам, которая сразу же поднимает тему наверх. Реализуемо? :grinning_face:

1 лайк

Привет!

Как нам гарантировать, что функция «Build with AI» использует конкретную LLM?
При использовании Google Gemini в качестве LLM по умолчанию в нашей системе я получаю ошибку: Invalid JSON payload received. Unknown name “additionalProperties” at ‘tools[0].function_declarations[5].parameters’: Cannot find field

Спасибо!

1 лайк

Какую модель Gemini вы используете? Чтобы её изменить, выберите агента рабочего процесса и замените модель LLM по умолчанию.

1 лайк

Привет, Сэм! Gemini 3 Flash.

Я нашёл настройку рабочего процесса, и там действительно стоял Gemini Flash 3. Я переключился на GPT Nano 5, но ошибка всё равно остаётся.

Я даже изменил значение по умолчанию для всех пользователей на GPT Nano 5 и проверил индивидуальные настройки рабочего процесса. Там тоже установил переопределение на GPT Nano 5.

Но безрезультатно. :frowning:

1 лайк

Есть ли у вас доступ к Luna, Terra, 3.5 Flash или Sonnet?

В рабочем процессе ИИ-агента используется довольно много инструментов, поэтому, как правило, требуется современная языковая модель.

1 лайк

Я был уверен, что Flash Lite работал, но это не так. GPT Nano 5 определённо работал. Похоже, это известная проблема, которая возникает даже в WordPress. Вот ссылка для справки. Нам нужно делать следующее: при использовании провайдера Gemini необходимо удалять элемент additionalProperties из схемы JSON-ответа: Remove `additionalProperties` from the JSON response schema - Pull Request #18 - WordPress/ai-provider-for-google - GitHub

ой, я сейчас интенсивно занимаюсь переходом на API взаимодействий, так что, думаю, это обеспечит нам гораздо более стабильный мост к моделям Gemini, hopefully на следующей неделе.

2 лайка

Отлично, и спасибо за быстрый ответ! Я нашел еще немного контента, но думаю, вы уже поняли идею. :wink:

Это собственное объяснение от Gemini (Google). Надеюсь, всё понятно? Я не до конца понимаю все нюансы, но точно знаю, что проблема возникает из-за этого свойства. LOL.

Кратко: Ошибка сохраняется, потому что Google использует два совершенно разных движка для обработки схем. Хотя Gemini поддерживает стандартный JSON Schema для структурированных выходных данных (response_json_schema), его движок вызова функций / выполнения инструментов по-прежнему использует строгий парсер OpenAPI 3.0 Protobuf от Google, который отклоняет или «захлебывается» на additionalProperties.

1. Вызов инструментов против структурированного вывода (разделение движков)

API Gemini проверяет схемы в двух разных местах:

  • Структурированный вывод (response_json_schema): Предназначен для форматирования итогового ответа модели. Использует стандартный парсинг JSON Schema и корректно обрабатывает additionalProperties.

  • Вызов инструментов/функций (tools[0].function_declarations): Предназначен для передачи сайтовых инструментов (например, поиска Discourse AI, действий персонажей или веб-серфинга) модели. Этот эндпоинт преобразует схемы во внутренний Protobuf-объект google.ai.generativelanguage.v1beta.Schema от Google.

Поскольку эндпоинт инструментов отображает параметры на устаревшее подмножество OpenAPI 3.0, отправка additionalProperties в объявлении функции заставляет парсер API возвращать ошибку 400 Bad Request или MALFORMED_FUNCTION_CALL.

GitHub

2. Почему фреймворки, такие как Discourse, внедряют это свойство

Оркестровые фреймворки (Discourse AI, Model Context Protocol/MCP, LangChain, Pydantic, Zod) автоматически генерируют JSON-схемы для пользовательских инструментов:

  1. Строгие значения по умолчанию: Генераторы автоматически добавляют "additionalProperties": false, чтобы принудительно обеспечить строгую типизацию параметров.

  2. Динамические карты/словари: Если параметр инструмента использует хеш/словарь ключ-значение (например, dict[str, Any] или Ruby Hash), генераторы схем выводят "additionalProperties": { "type": "string" }.

  3. Неочищенный полезный груз: Когда Discourse отправляет эти автоматически сгенерированные схемы инструментов на эндпоинт объявлений функций Google, Protobuf-парсер Gemini помечает additionalProperties как недопустимое или неизвестное поле.

3. Как исправить это в Discourse

Если вы видите эту ошибку при вызове инструментов Discourse AI:

  • Избегайте динамических параметров Hash/Dict: Убедитесь, что параметры пользовательских инструментов явно определяют каждый ожидаемый ключ в разделе properties, вместо использования объектов с открытой структурой.

  • Сериализуйте динамические данные в строки: Если инструмент должен принимать произвольные пары ключ-значение, определите параметр как STRING и укажите инструменту принимать сериализованную JSON-строку.

  • Исключите additionalProperties в пользовательских инструментах: Если у вас есть пользовательские ИИ-инструменты, определенные в разделе /admin/plugins/discourse-ai/ai-tools, отредактируйте JSON-схему параметров, чтобы удалить любые блоки "additionalProperties".

Я только что создал PR, который добавляет поддержку Interaction API. Если у вас есть тестовая среда, буду благодарен за дополнительное тестирование.

Есть ли планы разрешить получение внешних идентификаторов пользователей через рабочие процессы? Я хотел бы создать форму, которая проверяет некоторую информацию о текущем пользователе в системе поставщика удостоверений перед продолжением, но узел «Получить пользователя», насколько я могу судить, не выводит поле external_id.

Спасибо за обратную связь, этого должно быть достаточно: FIX: supports optional data for workflow user node (#42400) · discourse/discourse@4d0c688 · GitHub

3 лайка

Есть ли способ преобразовать user_id в username? Я рассматриваю вариант использования, при котором создателю темы отправляется личное сообщение. Но из объекта topic я могу получить только user_id, а для отправки личного сообщения требуется username.

Или, как вариант, — если бы был способ получить первый пост по topic_id, это тоже сработало бы, так как в посте есть поле username.

1 лайк

@thgl Да, учитывая, что у нас есть узел data-explorer, можно выполнить запрос любого типа для получения любой информации (в данном случае я захардкодил user_id, но вы понимаете идею):

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

2 лайка

@patrickemin Не уверен, что вы уже это видели, но я добавил все необходимые строительные блоки для этого сценария использования. Дайте знать, если вам нужна помощь.

1 лайк

О, это здорово, спасибо!

Ну, я не нашёл действие для назначения на кнопку административной темы для этого сценария: