Состояния AI и workflow для разных получателей
Длительная задача может закончиться, остановиться на ошибке или ждать решения человека. Приложение отправляет эти состояния как JSON в один входящий канал, а Депешер выбирает получателей и важность: ошибку получает техническая команда, запрос решения — проверяющий, готовый результат — инициатор.
Статус определяет приложение или workflow. Депешер сравнивает поля события; он не определяет состояние агента по тексту ответа и не возобновляет задачу. Здесь completed означает успешное завершение отслеживаемого этапа, а не проверку качества результата модели.
Подготовьте рабочий канал
- В организации создайте команду «Техническая команда». Выберите сотрудников, которые будут проверяющим и инициатором этой интеграции.
- Создайте входящий канал «AI и workflow» с пустыми базовыми получателями: команда, проверяющий и инициатор будут назначены через правила.
- В каталоге меток создайте
workflow,ошибка,ожидание,готовоинеизвестное. - Создайте текстовый шаблон «Состояние задачи» и выберите его у канала:
text
{{json.source}} / {{json.run_id}}
Состояние: {{json.status}}
{{message}}Получатели здесь заданы для одной интеграции. Если разные задачи принадлежат разным людям, добавьте проверяемый идентификатор проекта или инициатора и отдельные правила с явным выбором сотрудников. Значение run_id используется для поиска запуска; оно само по себе не назначает получателя и не устраняет повторы.
Настройте правила
Создайте три правила по условиям. В каждом выберите режим «Все условия»: JSON source → «В списке» → строки n8n и langgraph; JSON status → «Равно» → строка из таблицы. Эти значения чувствительны к регистру.
Во всех четырёх правилах добавьте «Взять текст из JSON», путь message. Затем задайте важность, весь набор меток и указанных получателей. Действие шаблона оставьте без переопределения, чтобы наследовать шаблон канала.
| Порядок | Значение status | Важность | Метки | Получатели |
|---|---|---|---|---|
| 1 | failed | Ошибка (error) | workflow, ошибка | Только «Техническая команда» |
| 2 | waiting_for_input | Предупреждение (warning) | workflow, ожидание | Только проверяющий |
| 3 | completed | Информация (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: источник не входит в список |
Удалён status | Default: отсутствующий путь не удовлетворяет сравнению |
Итог первого события:
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 описывают собственные события и адаптеры. Используйте только состояния, которые подтверждает конкретный источник; завершение хода не доказывает завершение всей задачи.
Для разборов смотрите историю, условия и диагностику доставки. Сохранённое событие отражает результат на момент приёма, повторная симуляция использует текущие настройки.