Перейти к содержимому

Состояния AI и workflow для разных получателей ​

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

Статус определяет приложение или workflow. Депешер сравнивает поля события; он не определяет состояние агента по тексту ответа и не возобновляет задачу. Здесь completed означает успешное завершение отслеживаемого этапа, а не проверку качества результата модели.

Подготовьте рабочий канал ​

  1. В организации создайте команду «Техническая команда». Выберите сотрудников, которые будут проверяющим и инициатором этой интеграции.
  2. Создайте входящий канал «AI и workflow» с пустыми базовыми получателями: команда, проверяющий и инициатор будут назначены через правила.
  3. В каталоге меток создайте workflow, ошибка, ожидание, готово и неизвестное.
  4. Создайте текстовый шаблон «Состояние задачи» и выберите его у канала:
text
{{json.source}} / {{json.run_id}}
Состояние: {{json.status}}
{{message}}

Получатели здесь заданы для одной интеграции. Если разные задачи принадлежат разным людям, добавьте проверяемый идентификатор проекта или инициатора и отдельные правила с явным выбором сотрудников. Значение run_id используется для поиска запуска; оно само по себе не назначает получателя и не устраняет повторы.

Настройте правила ​

Создайте три правила по условиям. В каждом выберите режим «Все условия»: JSON source → «В списке» → строки n8n и langgraph; JSON status → «Равно» → строка из таблицы. Эти значения чувствительны к регистру.

Во всех четырёх правилах добавьте «Взять текст из JSON», путь message. Затем задайте важность, весь набор меток и указанных получателей. Действие шаблона оставьте без переопределения, чтобы наследовать шаблон канала.

ПорядокЗначение statusВажностьМеткиПолучатели
1failedОшибка (error)workflow, ошибкаТолько «Техническая команда»
2waiting_for_inputПредупреждение (warning)workflow, ожиданиеТолько проверяющий
3completedИнформация (info)workflow, готовоТолько инициатор
DefaultЕсли другие правила не подошлиПредупреждение (warning)workflow, неизвестноеТолько «Техническая команда»

Default не имеет условий. Сохраните и подключите все четыре определения к каналу. После подключения техническая команда, проверяющий и инициатор настраивают личную доставку. Канал виден даже при отключённых правилах или подключениях; перед проверкой сообщений включите нужные источники и проверьте порядок.

Правило добавляет своих получателей к базе. Для результатов из таблицы база должна оставаться пустой: иначе все базовые получатели получат каждое состояние. Без активного default неизвестное событие при пустой базе не создаст назначений сотрудникам. Общий путь настройки — JSON-рецепт.

Сформируйте событие в источнике ​

Пример ошибки:

json
{
  "source": "langgraph",
  "run_id": "analysis-42",
  "status": "failed",
  "message": "Не удалось выполнить этап анализа"
}

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

Для n8n используйте успешную ветку и отдельный Error Trigger. Для LangGraph приложение различает исключение, возврат с __interrupt__ и обычное завершение вызова. waiting_for_input в n8n отправляйте из собственной ветки запроса решения; AI Agent не выдаёт такой статус автоматически.

JSON-отправитель для Python ​

Сохраните код как depesher_events.py рядом с приложением. Задайте переменные окружения DEPESHER_URL (адрес канала) и DEPESHER_TOKEN (токен без Bearer, если включена защита). Нужен Python 3.9 или новее; дополнительных пакетов для отправки не требуется.

python
import json
import os
from urllib.parse import urlsplit
from urllib.request import Request, urlopen


def send_event(source, status, run_id, message):
    url = os.environ["DEPESHER_URL"]
    if urlsplit(url).scheme != "https":
        raise ValueError("DEPESHER_URL должен использовать HTTPS")

    headers = {"Content-Type": "application/json; charset=utf-8"}
    token = os.environ.get("DEPESHER_TOKEN", "")
    if token:
        headers["Authorization"] = f"Bearer {token}"

    body = json.dumps(
        {
            "source": source,
            "run_id": str(run_id),
            "status": status,
            "message": message,
        },
        ensure_ascii=False,
        allow_nan=False,
    ).encode("utf-8")
    request = Request(url, data=body, headers=headers, method="POST")
    with urlopen(request, timeout=15) as response:
        if response.status != 202:
            raise RuntimeError(f"Депешер вернул HTTP {response.status}")

HTTP-ошибки и сетевые сбои выходят из функции как исключения. Вызвавшее приложение решает, как их записать и обработать. Автоматического повтора нет: повторная отправка может создать ещё одно сообщение. Ответ 202 подтверждает приём, внешнюю доставку проверяют отдельно.

Проверьте четыре ветки и неизвестное событие ​

В серверной проверке используйте application/json и пример выше. Затем заменяйте только указанные поля:

ВходОжидаемый результат
source: "langgraph", status: "failed"Техническая команда, error, workflow + ошибка
source: "langgraph", status: "waiting_for_input"Проверяющий, warning, workflow + ожидание
source: "n8n", status: "completed"Инициатор, info, workflow + готово
source: "n8n", status: "queued"Default, техническая команда, warning, workflow + неизвестное
source: "other", status: "failed"Default: источник не входит в список
Удалён statusDefault: отсутствующий путь не удовлетворяет сравнению

Итог первого события:

text
langgraph / analysis-42
Состояние: failed
Не удалось выполнить этап анализа

После сохранения настроек отправьте каждый вариант настоящим HTTP-запросом. Например, сохраните JSON в event.json и выполните:

bash
curl --include \
  --request POST \
  --header 'Content-Type: application/json' \
  --data-binary @event.json \
  'https://depesher.ru/w/ВАШ_PUBLIC_ID'

Если канал защищён, добавьте Bearer-токен по HTTP-инструкции. Назначенные сотрудники сверяют текст, метки, важность и основания назначения в «Моих уведомлениях», затем проверяют свои способы получения. При пересечении маршрутов одному человеку создаётся одно назначение на запрос.

Последовательно отправьте waiting_for_input и completed с одинаковым run_id: это два самостоятельных уведомления. Второе не закрывает первое и не подтверждает, что человек принял решение. Возобновление выполняется в исходном приложении.

Личный вариант и другие AI-инструменты ​

В личном контексте вместо команд и сотрудников выберите исходящие каналы: например, ошибка → Email и Telegram; ожидание → Telegram; завершение → Email. Для такого разделения снимите прямые назначения исходящих каналов: базовые связи получают каждое состояние. При пустой базе и отсутствии целей выбранного правила сообщение сохраняется только в личной истории. Пустое действие само по себе не отключает базовую отправку.

LangChain может сформировать failed и completed вокруг своего вызова. Статьи Codex, Claude Code, Cursor и OpenClaw описывают собственные события и адаптеры. Используйте только состояния, которые подтверждает конкретный источник; завершение хода не доказывает завершение всей задачи.

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