Claude Certified Architect · Модуль 2 · Урок 2.2
Структурированные ответы об ошибках для MCP-инструментов
Суть
Общая ошибка («Operation failed») — глухая стена: агент не может рассудить, как восстанавливаться. Структурированная ошибка несёт категорию (transient/validation/business/permission), флаг повторяемости (isRetryable) и человекочитаемое сообщение.
Пустой результат — не ошибка
Пустой результат успешного запроса — это успех, а не ошибка; пометка isError: true сбивает логику решений агента и плодит лишние повторы. Нарушения бизнес-правил не повторяемы (isRetryable: false) — иначе бесконечный цикл повторов. Частичные результаты упавшей операции ценны: их стоит включить в partialResults.
{
"isError": true,
"errorCategory": "transient",
"isRetryable": true,
"message": "Сервис заказов превысил тайм-аут. Повтор безопасен.",
"attemptedQuery": "order_id: ORD-8821",
"partialResults": null
}Anti-patterns
| Ловушка | Почему не работает | Верный паттерн |
|---|---|---|
| Возвращать общий статус «Operation failed» | Скрывает тип сбоя и повторяемость — агент не решит, что делать | Вернуть errorCategory + isRetryable + описательное сообщение |
Возвращать isError: true на пустой результат | Пустой результат валидного запроса — успех, не ошибка; провоцирует повторы | Успех с пустым массивом; isError — только для реальных сбоев |
| Субагент рушит весь процесс при тайм-ауте | Уничтожает всю проделанную работу; у координатора могли быть стратегии | Сначала локальный повтор; иначе структурированная ошибка + частичные результаты |
| Помечать нарушение бизнес-правила повторяемым | Бесконечные повторы — правило не «разрешится» при повторе | isRetryable: false + понятное клиенту сообщение |
Exam traps
| Ловушка | Почему не работает | Верный паттерн |
|---|---|---|
| Считать общий статус достаточным для восстановления | Агент не поймёт, есть ли смысл в повторе — зациклится или зависнет | Каждая ошибка несёт категорию, повторяемость и контекст |
| Трактовать пустой результат как состояние ошибки | Портит сигнал, по которому координатор решает продолжать | Успех с пустым массивом — валидное завершение |
Практическое задание (T2)
- Transient: тайм-аут 5с возвращает повторяемую ошибку с запросом и любыми частичными результатами.
- Validation: отсутствующий/неверный
order_id— неповторяемая ошибка с указанием конкретного поля. - Business: возврат >$500 — неповторяемая ошибка с понятным клиенту объяснением политики.
- Permission: истёкший токен — структурированная ошибка, ведущая координатор к повторной аутентификации.
- Empty: клиент без заказов — успех с пустым массивом, НЕ ошибка.
Проверка знаний
Многоагентная исследовательская система
Поисковый субагент упал по тайм-ауту на сложной теме. Как организовать возврат сбоя координатору для разумного восстановления?
Верный ответ: A
A верно. Структурированный контекст даёт координатору выбор: повтор с изменённым запросом, альтернатива или работа с частичными данными. B — после повторов общий статус скрывает контекст. C — маскировка сбоя под успех мешает восстановлению. D — завершение всего процесса теряет проделанную работу.
Агент поддержки клиентов
process_refund вызван на $750 при лимите $500; инструмент вернул {"error": "Operation failed"}. Агент повторяет 4 раза и зависает. Что исправить?
Верный ответ: B
B верно. Нарушение бизнес-правила неповторяемо: isRetryable: false велит агенту немедленно остановиться и эскалировать. Понятное сообщение позволяет объяснить причину. A — заплатка без объяснения. C — это business-ошибка, не validation; повторяемость породит лишние повторы. D вероятностна.
Агент поддержки клиентов
search_orders возвращает {"isError": true, "message": "No orders found"}, когда у клиента нет истории заказов. Координатор повторяет, считая сбой временным. Причина и решение?
Верный ответ: B
B верно. Пустой результат — валидный исход, не сбой. Инструмент должен вернуть {"orders": [], "total": 0} со статусом успеха. Пометка ошибкой портит сигнал решений. A — разбор строк хрупок. C лечит симптом. D вероятностна и не чинит испорченный сигнал данных.