Approvals
Approval — это human-in-the-loop gate внутри workflow’а:
автоматика останавливается, ждёт пока назначенный человек
подтвердит или отклонит. Без UI-подтверждения — run в состоянии
awaiting_approval, ничего не идёт дальше.
Три стандартных use-case’а:
- Финансовые риски — «refund > 10 000 ₽ требует approval owner’а»
- Compliance — «массовые изменения в 1С проводит только бухгалтер»
- Качество LLM-output’а — «ответ AI-агента клиенту → approve менеджером → отправить»
Как добавить
Section titled “Как добавить”В editor’е → нода approval.request:
approval.request title = "Refund для сделки {{list.results.0.name}}" body = "Сумма: {{trigger.object.amount.value}} ₽" assignedTo = { kind: "role", role: "owner" } # или named user: # assignedTo = { kind: "user", userId: "uuid" } ttl = 86400 # seconds; expired → auto-rejectДве выходные ветки ноды:
- approved → run продолжается по этой ветке
- rejected → run продолжается по второй (обычно — fail / retry / уведомить кого-то что отказано)
Все pending-approvals собираются на /approvals:
- Filter’ы по space / process / status / assigned_role
- Каждая row открывается в drawer с deталями: trigger-payload, что просит agent, по какой сделке / заказу / run’у
- Кнопки Approve / Reject + опциональный comment
Approval-события записываются в audit trail: кто когда что.
| Role | Стандартно может approve |
|---|---|
owner | всё |
admin | всё, кроме delete account / space-plan change |
member | только approvals, where assignedTo.role == 'member' или assignedTo.userId == <их id> |
Custom-роли не поддерживаются в v1 — плоская трёхуровневая иерархия.
SLA / TTL
Section titled “SLA / TTL”ttl — сколько approval живёт до auto-reject’а. По умолчанию
24 часа (86400 sec). После — approval-request считается rejected
with reason TIMEOUT, run идёт по rejected-ветке.
Длинные TTL (недельные) ок, но помните: run всё это время висит в
awaiting_approval, не стареет сам по себе.
Re-request
Section titled “Re-request”Если approval отклонили по ошибке — выпустите новую revision с adjusted trigger’ом / workflow’ом, re-run failed runs. Старый rejected approval остаётся в audit’е навсегда.
Notifications
Section titled “Notifications”v1: approvals не слают push-уведомлений автоматически. Пока
оператор должен заходить в /approvals. Workaround — добавить
telegram.message.send параллельно approval.request:
approval.request (...)telegram.message.send (chat_id = <manager>, text = "⏳ Нужен approval: https://app.opora/approvals")Нативные notifications через email/Telegram/push — backlog’ом после B3 email-integration стабилизируется.
POST /approvals/<id>/approve— approvePOST /approvals/<id>/reject— reject (с опциональным comment’ом)GET /approvals?status=pending— list
Полная схема — API reference.
Связанное
Section titled “Связанное”- Runs & Traces —
awaiting_approvalstate в lifecycle’е - Cookbook → refund coordinator — end-to-end пример с approval’ом