Многократные попытки для производственных ИИ-агентов
Многоуровневые попытки повтора для производственных ИИ-агентов: отсрочка вызовов больших языковых моделей, восстановление после ошибок инструментов, контрольные точки и надежные рабочие процессы, чтобы нестабильные API и сбои не прерывали выполнение задач.
Источники: Building Retries in Agents: How to Build AI Agents That Survive Failures
Попытки повторного выполнения агента, выдерживающие реальные сбои
Игровой агент с двумя инструментами и циклом while кажется надежным до первого ограничения скорости, нестабильного API или сбоя в процессе выполнения плана. В продакшене агентам требуется многоуровневая устойчивость — а не один блок try/except вокруг LLM.
Сбои не одинаковы
Классифицируйте сбои перед повторной попыткой:
- Временные ошибки LLM/API (429, 503, превышение времени ожидания)
- Ошибки инструментов, которые модель может исправить (неверные аргументы, отсутствующие поля)
- Логические тупики (неверный план), требующие перепланирования
- Сбои процессов/инфраструктуры, приводящие к потере данных в памяти
Слепые попытки повторного выполнения для неверных типов сбоев тратят деньги и усугубляют проблемы.
Уровень 1 — Повторная попытка вызова LLM
Запросы на завершение работы, являющиеся идемпотентными, используют экспоненциальное замедление с добавлением случайных задержек:
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import anthropic
llm_retry = retry(
stop=stop_after_attempt(2), # 2 total attempts (1 retry)
wait=wait_exponential(multiplier=2, min=4, max=60),
retry=retry_if_exception_type((
anthropic.RateLimitError, # 429
anthropic.APITimeoutError, # Timeout
anthropic.APIConnectionError, # Network errors
anthropic.InternalServerError, # 500s (often transient)
)),
)
@llm_retry
async def call_llm(messages, tools):
response = client.messages.create(
model="claude-sonnet-4-5-20250929",
messages=messages,
tools=tools,
)
return response
Ограничьте количество попыток; отображайте информированную ошибку при исчерпании лимита.
Уровень 2 — Позвольте модели обрабатывать ошибки инструментов
Возвращайте сбои инструментов в виде наблюдений, а не полных сбоев системы, чтобы агент мог скорректировать свои действия:
# Inside the agentic loop
for block in response.content:
if block.type == "tool_use":
try:
result = run_tool(block.name, block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": json.dumps(result),
})
except Exception as e:
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": f"Error: {str(e)}",
"is_error": True,
})
Циклы в стиле Claude Code рассматривают stderr/stdout как контекст для следующей мысли.
@agent.tool
async def process_document(ctx, file_path: str) -> dict:
"""Process a document through the enrichment pipeline."""
try:
result = await run_enrichment(file_path)
if result.status == "error":
raise RuntimeError(f"Processing failed: {result.error}")
return {
"status": "success",
"records_processed": result.count,
"output_path": result.output_path,
}
except Exception as e:
return {
"status": "error",
"error": str(e),
"traceback": traceback.format_exc(),
}
Уровень 3 — устойчивость на уровне агента
Постепенная сохранение состояния
Сохраняйте шаги плана, результаты работы инструментов и фрагменты диалога, чтобы после перезапуска можно было продолжить работу без повторения уже выполненных действий:
async def execute_with_resilience(agent, prompt, deps, max_retries=3):
"""Execute agent with checkpoint-based retry."""
message_history = []
for attempt in range(max_retries):
try:
result = await agent.run(
prompt,
deps=deps,
message_history=message_history, # Resume from last checkpoint
)
return result
except (RateLimitError, APITimeoutError, APIConnectionError) as e:
if attempt == max_retries - 1:
raise # Final attempt failed
# Checkpoint: save what we have so far
# How you access partial messages depends on your framework.
# PydanticAI exposes all_messages() on the result; other frameworks
# may store it differently. The key is: grab whatever history exists.
if hasattr(e, '_partial_messages'):
message_history = e._partial_messages
# Also save context that tools have accumulated
save_checkpoint({
"message_history": message_history,
"context_fields": deps.get_context_snapshot(),
})
wait_time = min(2 ** attempt * 5, 60)
logger.warning(
f"Agent run failed (attempt {attempt + 1}/{max_retries}), "
f"retrying in {wait_time}s with {len(message_history)} messages"
)
await asyncio.sleep(wait_time)
Особенно важно сохранять состояние после успешного выполнения действий инструментов.
Уровень 4 — сбои инфраструктуры и Temporal
Надежные рабочие процессы особенно полезны, когда шаги должны сохраняться даже при сбое процессора:
# After each successful tool call, save a checkpoint
async def on_tool_complete(tool_name, result, current_messages):
"""Called after each tool completes successfully."""
save_checkpoint({
"message_history": current_messages,
"last_completed_tool": tool_name,
"context_fields": get_current_context(),
})
logger.info(f"Checkpoint saved after {tool_name}")
Где помогает Temporal
Длительные процессы утверждения, работа с участием человека, многочасовые цепочки действий инструментов.
Где возникают сложности
Простые чат-агенты могут не нуждаться в движке рабочих процессов; операционные затраты могут превысить риски.
Когда его использовать
Используйте Temporal (или аналогичные решения), когда побочные эффекты должны происходить ровно один раз и длиться дольше срока жизни процесса. Избегайте их для коротких агентов запросов/ответов с недорогими механизмами повторных попыток.
Более легкий производственный паттерн
Многие команды сочетают: повторные попытки работы с LLM + отслеживание ошибок инструментов + точки контроля в Redis/DB + систему надзора, которая возобновляет работу с последнего завершенного шага — без полной оркестрации рабочего процесса с самого начала.
from temporalio.common import RetryPolicy
TOOL_RETRY_POLICY = RetryPolicy(
maximum_attempts=2,
initial_interval=timedelta(seconds=5),
backoff_coefficient=2.0,
)
Чек-лист
SandboxRestrictions.default.with_passthrough_modules(
"anthropic", "httpx", "httpcore", "os", "anyio",
"anyio._backends", "anyio._backends._asyncio", "threading",
"pydantic_ai", "pydantic_ai.agent",
"pydantic_ai.durable_exec", "pydantic_ai.durable_exec.temporal",
"pydantic_graph", "pydantic_graph.beta", "fitz", # ... and more
)
- Задержка повторных попыток при временных ошибках LLM
- Ошибки инструментов в виде сообщений, а не молчаливого прекращения работы
- Создание точек контроля после изменения параметров инструментов
- Таймауты и лимиты количества шагов
- Ключи идемпотентности при записи данных
- Метрики: частота повторных попыток, задержка выполнения шагов, уровень отказов
Что дальше
Добавьте тесты на устойчивость: прерывайте работу процесса во время выполнения инструмента, вводите ошибки 429 и проверяйте поведение при возобновлении работы. Устойчивость — это функция продукта для агентов, а не дополнительный элемент.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и лимит суммы в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и максимальная сумма в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и максимальная сумма в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и максимальная сумма в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и максимальная сумма в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и максимальная сумма в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и максимальная сумма в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.
Лимит шагов и максимальная сумма в долларах за одну попытку; переключатели отключения находятся рядом с регуляторами повторных попыток.