0Pricing
AI Agents · Урок

Идемпотентные инструменты и побочные эффекты

Агент может повторить вызов — проектируйте инструменты так, чтобы два вызова не приводили к двойному списанию или повторной отправке письма.

«Идемпотентные инструменты и побочные эффекты» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Идемпотентные инструменты и побочные эффекты
  2. Повторные попытки с экспоненциальной задержкой
  3. Тайм-ауты и автоматические выключатели
  4. Проверка вывода инструментов (Pydantic)
← Назад к AI Agents