0Pricing
AI Agents · Урок

Обнаружение ошибок инструментов и восстановление

Если инструмент возвращает ошибку 500, передайте её модели, чтобы она попробовала другой подход, а не завершила работу с ошибкой.

«Обнаружение ошибок инструментов и восстановление» — бесплатный урок AI Agents на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Инструменты дают сбой: план действий

Любой реальный инструмент иногда даёт сбой:

  • Тайм-ауты сети
  • Ограничения частоты запросов
  • Неверные аргументы от модели
  • Недоступность внешнего сервиса
  • Недействительные учётные данные

Агенты в рабочей среде должны корректно восстанавливаться после сбоев.

Всегда возвращайте результат, не выбрасывайте исключения

Внутри цикла агента перехватывайте все ошибки инструментов и возвращайте их как содержимое. Никогда не позволяйте исключению прервать цикл:

def safe_dispatch(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
        return TOOLS[tool_call.function.name](**args)
    except json.JSONDecodeError:
        return {'error': 'Arguments are not valid JSON.'}
    except KeyError:
        return {'error': f'Unknown tool: {tool_call.function.name}'}
    except Exception as e:
        return {'error': f'{type(e).__name__}: {e}'}

Структурированный формат ошибки

Используйте единообразную структуру, чтобы модель распознавала ошибки:

error = {'ok': False, 'error_type': 'TimeoutError', 'error_message': 'Tavily timed out after 10s', 'retryable': True}
print(error)

Отличайте повторяемые ошибки от постоянных

Некоторые ошибки требуют повтора (тайм-аут), а другие — нет (404). Сообщите модели:

if isinstance(e, requests.Timeout):
    return {'ok': False, 'retryable': True, 'error': str(e)}
if isinstance(e, ValueError):
    return {'ok': False, 'retryable': False, 'error': str(e)}

Автоматический повтор временных ошибок

Для сетевых вызовов используйте повторы с экспоненциальной задержкой:

from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type

@retry(
    wait=wait_exponential(multiplier=1, max=10),
    stop=stop_after_attempt(3),
    retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def web_search(query):
    return requests.get('https://api.tavily.com/search', ...).json()

Проверка аргументов

Перед вызовом инструмента проверьте аргументы с помощью модели Pydantic:

from pydantic import BaseModel, ValidationError

class SearchArgs(BaseModel):
    query: str
    k: int = 5

try:
    args = SearchArgs.model_validate_json(tool_call.function.arguments)
except ValidationError as e:
    return {'error': f'Bad arguments: {e}'}

Покажите модели ошибку

Добавьте ошибку как результат инструмента и снова вызовите модель. Модель часто исправляет себя:

messages.append({
    'role': 'tool',
    'tool_call_id': tc.id,
    'content': json.dumps({'error': 'Argument k must be an integer'})
})
# Next model call: 'Sorry, let me retry with k=5...'

Избегайте бесконечных циклов ошибок

Некоторые модели, увидев ошибку, повторяют тот же неверный вызов. Ограничивайте цикл и обнаруживайте повторы:

recent_calls = []
for tc in msg.tool_calls:
    key = (tc.function.name, tc.function.arguments)
    if recent_calls.count(key) >= 3:
        return 'Agent stuck in retry loop, aborting.'
    recent_calls.append(key)

Восстановление с учётом инструмента

Для заведомо нестабильных инструментов реализуйте логику повторных попыток ВНУТРИ инструмента, а не в цикле:

def search_with_fallback(query):
    try:
        return tavily_search(query)
    except Exception:
        return bing_search(query)   # secondary provider

Ограничивайте время ожидания каждого вызова

Для каждого внешнего вызова необходимо задать время ожидания. Иначе один медленный сервис заблокирует всего агента:

import requests
response = requests.get(url, timeout=10)  # 10s

# For LLM calls:
from openai import OpenAI
client = OpenAI(timeout=30.0)

Размыкатели цепи

Если инструмент неоднократно завершается с ошибкой, «разомкните» цепь и не используйте его некоторое время:

import time

class CircuitOpen(Exception):
    pass

def circuit(failure_threshold=5, recovery_timeout=60):
    def decorator(func):
        state = {'failures': 0, 'open_until': 0}
        def wrapper(*args, **kwargs):
            if time.time() < state['open_until']:
                raise CircuitOpen('circuit is open')
            try:
                result = func(*args, **kwargs)
                state['failures'] = 0
                return result
            except Exception:
                state['failures'] += 1
                if state['failures'] >= failure_threshold:
                    state['open_until'] = time.time() + recovery_timeout
                raise
        return wrapper
    return decorator

@circuit(failure_threshold=3, recovery_timeout=1)
def fragile_tool(x):
    if x < 0:
        raise ValueError('bad input')
    return x * 2

for x in [1, -1, -1, -1, -1]:
    try:
        print('ok', fragile_tool(x))
    except CircuitOpen as e:
        print('blocked:', e)
    except ValueError as e:
        print('failed:', e)

Журналирование ошибок с контекстом

Записывайте достаточно данных, чтобы впоследствии выполнить отладку: имя инструмента, аргументы, тип ошибки, трассировку стека, идентификатор запроса, идентификатор пользователя и идентификатор трассировки. Передавайте эти данные в инструмент наблюдаемости.

Корректное ухудшение работы

Если критически важный инструмент недоступен, честно сообщите об этом пользователю, а не делайте вид, что агент успешно выполнил задачу:

if all_search_tools_failed:
    return 'I was unable to search the web right now. Please try again in a few minutes.'

Шаблон обработки ошибок инструментов

Как безопаснее всего обрабатывать исключения инструментов внутри цикла агента?

Итоги

Инструменты завершаются с ошибками. Перехватывайте ошибки, классифицируйте их, представляйте как содержимое и позволяйте агенту восстановиться. Для надёжности в рабочей среде добавьте ограничения времени ожидания, повторные попытки и размыкатели цепи.

Часто задаваемые вопросы

Урок «Обнаружение ошибок инструментов и восстановление» бесплатный?

Да — полный текст урока «Обнаружение ошибок инструментов и восстановление» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Обнаружение ошибок инструментов и восстановление»?

Если инструмент возвращает ошибку 500, передайте её модели, чтобы она попробовала другой подход, а не завершила работу с ошибкой. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Обнаружение ошибок инструментов и восстановление»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. ReAct: шаблон «рассуждение + действие»
  2. Реализация ReAct с нуля
  3. Распространённые наборы инструментов (веб, калькулятор, RAG)
  4. Обнаружение ошибок инструментов и восстановление
← Назад к AI Agents