Глава 10

Автономность измеряется бюджетом

Фраза "работай до результата" звучит гибко, но границы не задаёт. Автономность агента измеряется не доверием, а бюджетом: runtime ограничивает число model turns, число tool calls, стеновое время, размер результатов, стоимость и классы допустимых действий. Без этих пределов один запрос может уйти в дорогой бесконечный цикл, а вы узнаете об этом по счёту от провайдера.

Бюджет - это обычная константа плюс таймер, обрывающий run.

TypeScript
export const AGENT_BUDGET = {
  maxModelTurns: 6,
  maxToolCalls: 10,
  maxWallTimeMs: 25_000,
  maxToolResultBytes: 24_000,
  maxRepeatedCall: 2
} as const;

const controller = new AbortController();
const timeout = setTimeout(function abortRun() {
  controller.abort("agent_timeout");
}, AGENT_BUDGET.maxWallTimeMs);

try {
  return await runWithSignal(controller.signal);
} finally {
  clearTimeout(timeout);
}

Отдельный вопрос - что исполнять параллельно, а что строго по очереди. Здесь важно не перепутать уровни.

Ситуация · Исполнение · Почему

  • Два независимых read tool - Параллельно; Снижается latency без конфликта состояния
  • Второй вызов зависит от первого - Последовательно; Модель должна увидеть первый результат
  • Два preview одного заказа - Последовательно или deduplicate; Избегаем разных расчетов и лишней нагрузки
  • Любой commit - Вне свободного loop; Нужны approval, idempotency и транзакция

Логика проста: два независимых read-tool можно звать параллельно и снизить latency; зависимый вызов идёт после того, как модель увидела первый результат; любой commit вообще выходит из свободного loop - ему нужны approval, idempotency и транзакция. И одно различение, которое экономит и деньги, и нервы.

Parallel tool calling не равно parallel agents. Первое означает несколько независимых функций в одном model turn. Второе создаёт отдельные контексты, результаты и стоимость. Добавляйте multi-agent только при ясном разделении ответственности, а не ради ускорения.

Бюджет ограничил, что агент может. Теперь решим, что он обязан помнить - и здесь провайдерский state не заменяет ваш собственный журнал.

Ссылки