Идемпотентные инструменты и побочные эффекты
Агент может повторить вызов — проектируйте инструменты так, чтобы два вызова не приводили к двойному списанию или повторной отправке письма.
«Идемпотентные инструменты и побочные эффекты» — бесплатный урок AI Agents на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Почему важна идемпотентность
Цикл агента может выполнять повторные попытки. Если инструмент отправляет электронное письмо или списывает деньги с банковской карты, повторная попытка дублирует действие. Идемпотентность превращает повторное выполнение действия X в отсутствие изменений, если X уже было выполнено.
Что такое идемпотентность
Операция является идемпотентной, если её выполнение N раз даёт тот же результат, что и однократное выполнение. Примеры:
- «Установить статус пользователя как активный» — идемпотентная операция (повторная установка активного статуса ничего не меняет)
- «Увеличить счётчик на 1» — НЕ является идемпотентной операцией (каждый вызов добавляет ещё 1)
Ключи идемпотентности
Для неидемпотентных операций (платежей, отправки электронных писем) используйте ключи идемпотентности:
import uuid
def create_payment(amount, idempotency_key):
# Stripe accepts this header — returns the existing payment if key was used
return stripe.Charge.create(
amount=amount,
currency='usd',
source=token,
idempotency_key=idempotency_key
)Создавайте ключи на основе намерения
Используйте хеш от (имени инструмента, аргументов, идентификатора запуска), чтобы одинаковые повторные попытки использовали один и тот же ключ:
import hashlib, json
def intent_key(tool_name, args, run_id):
payload = json.dumps([tool_name, args, run_id], sort_keys=True)
return hashlib.sha256(payload.encode()).hexdigest()
print(intent_key('transfer_money', {'to': 'acc2', 'amount': 100}, 'run-1'))
Инвентаризация побочных эффектов
Перечислите инструменты, у которых есть побочные эффекты:
- SEND электронного письма / SMS
- CHARGE / возврат средств
- CREATE / DELETE строк базы данных
- POST к внешним API, изменяющим состояние
Инструменты, предназначенные только для чтения, по своей сути идемпотентны. Сосредоточьтесь на операциях записи.
Оборачивайте инструменты с побочными эффектами
Добавьте слой идемпотентности в реализацию инструмента:
def send_email(to, subject, body, run_id):
key = intent_key('send_email', {'to': to, 'subject': subject, 'body': body}, run_id)
if redis.set(f'sent:{key}', 1, nx=True, ex=86400):
smtp.send(to, subject, body)
return {'sent': True}
return {'sent': False, 'reason': 'already-sent'}Подтверждайте действие перед выполнением
Для важных и потенциально опасных действий добавьте этап подтверждения:
def transfer_money(from_acc, to_acc, amount, confirmed=False):
if not confirmed:
return {'pending': True, 'msg': 'Call again with confirmed=True to proceed.'}
return {'pending': False, 'msg': f'Transferred {amount} from {from_acc} to {to_acc}.'}
print(transfer_money('acc1', 'acc2', 100))
print(transfer_money('acc1', 'acc2', 100, confirmed=True))
Двухфазные инструменты
Разделите инструменты на фазы «черновик» и «подтверждение»:
def draft_email(to, subject, body):
draft_id = save_draft(to, subject, body)
return {'draft_id': draft_id, 'preview': body[:200]}
def send_draft(draft_id):
return smtp.send(load_draft(draft_id))Компенсирующие действия
Если избежать побочного эффекта невозможно, определите инструмент «отмены»:
def refund_payment(payment_id):
return stripe.Refund.create(payment=payment_id)
# Now an erroneous create_payment can be undone.Журналы аудита
Каждый инструмент с побочными эффектами MUST записывать: кто его запустил, какие аргументы использовал, когда это произошло и каков результат. Используйте структурированные журналы, которые можно будет запросить позднее.
Бюджет побочных эффектов на один запуск
Для дополнительной безопасности ограничивайте число побочных эффектов за один запуск:
if state.side_effect_count >= 5:
return {'error': 'Side-effect budget exhausted for this run.'}Режим пробного запуска
Полезно во время разработки: инструменты записывают, что они WOULD сделать, но фактически этого не делают:
import os
os.environ['DRY_RUN'] = '1'
DRY_RUN = os.getenv('DRY_RUN') == '1'
def send_email(to, subject, body):
if DRY_RUN:
print(f'would send email to {to}')
return {'sent': False, 'dry_run': True}
print(f'sending email to {to}')
return {'sent': True, 'dry_run': False}
result = send_email('user@example.com', 'Hi', 'Hello there')
print(result)
Определение
Что означает «идемпотентный» применительно к инструменту?
Итоги
Определяйте побочные эффекты. Используйте ключи идемпотентности. Создавайте двухфазные инструменты и компенсирующие действия. Проводите аудит всего. Во время разработки используйте пробный запуск.
Часто задаваемые вопросы
Урок «Идемпотентные инструменты и побочные эффекты» бесплатный?
Да — полный текст урока «Идемпотентные инструменты и побочные эффекты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Идемпотентные инструменты и побочные эффекты»?
Агент может повторить вызов — проектируйте инструменты так, чтобы два вызова не приводили к двойному списанию или повторной отправке письма. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Идемпотентные инструменты и побочные эффекты»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Идемпотентные инструменты и побочные эффекты
- Повторные попытки с экспоненциальной задержкой
- Тайм-ауты и автоматические выключатели
- Проверка вывода инструментов (Pydantic)