Несчастный случай, который всегда случается в конце концов Дайте ИИ-агенту инструмент побочного действия — отправьте электронное письмо, создайте платеж, напишите запись — и рано или поздно повторная попытка запустит его дважды. Срабатывает тайм-аут, платформа повторяет попытку, и теперь ваш клиент...
Несчастный случай, который всегда случается в конце концов
Дайте ИИ-агенту инструмент побочного действия — отправьте электронное письмо, создайте платеж, напишите запись — и рано или поздно повторная попытка запустит его дважды. Срабатывает тайм-аут, платформа повторяет попытку, и теперь ваш клиент получил два электронных письма, а в вашей книге есть два платежа.
Это не проблема «будь осторожнее». Это отсутствующий механизм: ключ идемпотентности.
Узор
Сгенерируйте один ключ для каждой логической операции (например, UUID).
Перед выполнением запишите ключ на стороне сервера.
Если тот же ключ придет снова, не выполняйте — верните первый результат.
Минимальная форма:
# ключ = uuid для каждой операции
# INSERT (ключ, результат) с UNIQUE(ключ)
# при конфликте: вернуть сохраненный результат без повторного запуска
Для производства добавьте:
Привязка полезных данных — хешируйте полезные данные с ключом, чтобы перехватить повторное использование ключа с другим телом.
Ворота одобрения — опасные действия ждут одобрения человека; перед ним ничего не бежит.
Исходящие — никогда не отправляйте напрямую. Очередь первая; диспетчер отправляет только утвержденные строки ровно один раз.
Автоматический выключатель — жесткие ограничения на шаги и расходы, поэтому застрявшая петля не может сжечь более 50 долларов за ночь (настоящая, обычная авария).
Проверьте свой собственный код — бесплатный инструмент
Я опубликовал бесплатный сервер MCP