Акты Становления

004: Агент/Вызов

Представьте, что Инструмент — это как рецепт блюда. А Вызов — это тот же рецепт, но уже с конкретными продуктами и их количеством (params), готовый к приготовлению. Это конкретная команда о том, что нужно сделать.

Протокол Инструмента создаёт понятный для агентов язык, на котором описывается, что они умеют делать. Этот документ объясняет протокол Вызова, который основан на Инструментах и определяет, как именно выполняются действия.

Вызов — это готовый к работе Инструмент с заполненными параметрами. Если Инструменты описывают, что можно сделать в принципе, то Вызовы определяют, как это будет выполнено на деле.

На заметку

Запрос, порождающий набор Вызовов, называется Носителем. Носитель — это как моментальный снимок принятия решения, когда агент выбирает доступные Инструменты для формирования ответа.

Композиция и Контекст

Сам по себе Вызов — это простая структура с данными. Его настоящая сила проявляется, когда он работает вместе с другими протоколами, которые управляют его окружением. Эти протоколы включаются с помощью специальных мета-свойств (они начинаются с _) в схеме Инструмента. Так один и тот же объект Вызова может запускать совершенно разные процессы.

Давая этим мета-свойствам чёткий смысл, мы позволяем ИИ-модели активно участвовать в сборке этих процессов. Она может размышлять о разных комбинациях и создавать сложные и новые цепочки выполнения. Это уже не просто выбор инструмента, а динамическое дирижирование целым оркестром задач.

Tip

Следующий раздел объясняет связи с другими частями системы, о которых мы подробно поговорим позже. Не нужно забегать вперёд, мы всё рассмотрим по порядку. Вы всегда сможете вернуться к этому разделу.

  • Явное выполнение (_activity): Самое базовое расширение — это связь Вызова с конкретной функцией в коде. Свойство _activity — это сигнал, что Вызов должен быть выполнен по чётким инструкциям Действия, а не творчески домыслен ИИ-моделью.

  • Делегированное выполнение (_delegate): Вызов можно перепоручить внешнему исполнителю — Делегату. Свойство _delegate обычно содержит ссылку на сохранённый Запрос (часто это просто путь к файлу), что позволяет использовать этот запрос как готовый инструмент. Это создаёт изолированную «чистую комнату» для выполнения, предотвращая смешивание контекстов и обеспечивая настоящую независимость.

  • Наведение фокуса (_scopes): Протокол ОбластейВидимости контролирует, какая информация доступна для Вызова. Его основная задача — сфокусировать внимание ИИ-модели во время скрытого выполнения, указав, какие части общего контекста ей следует учитывать. Это предотвращает «растекание мысли» и делает результат более надёжным. При использовании с _delegate его роль становится еще важнее: он строго определяет весь контекст для изолированного выполнения делегата.

  • Сохранение результата (_outputPath): Вызов может сохранять свой результат, чтобы его можно было использовать позже. Свойство _outputPath указывает путь в постоянном Состоянии, куда должен быть записан результат Вызова. Это позволяет создавать многошаговые процессы, где результат одного Вызова становится входными данными для другого.

  • Выполнение для экземпляра (_instance): Вызов может быть нацелен на конкретный Экземпляр в запросе с несколькими экземплярами. Свойство _instance работает как уникальный идентификатор, фокусируя все операции этого Вызова (например, чтение данных из Состояния и запись в него) на определённом контексте. Это позволяет эффективно и параллельно обрабатывать несколько состояний одним и тем же набором инструментов.

Стратегии выполнения Вызовов

Когда агент создаёт несколько Вызовов, их можно выполнить по-разному, в зависимости от задачи:

// Выполнить один Вызов
const result = await Tool(call);

// Выполнить все Вызовы и дождаться всех результатов
const results = await Tool.all(calls);

// Выполнить все Вызовы и вернуть первый успешный результат
const result = await Tool.any(calls);

// Выполнить все Вызовы и вернуть результат самого быстрого (неважно, успешный или нет)
const result = await Tool.race(calls);

Эти подходы позволяют:

  • Точечный контроль: Обрабатывать Вызовы по одному, добавляя свою логику между ними.
  • Пакетная обработка: Выполнять независимые Вызовы параллельно для максимальной скорости.
  • Быстрое завершение: Останавливаться после первого успеха (.any()) или первого же результата (.race()).
  • «Всё или ничего»: Гарантировать, что все Вызовы в группе выполнятся успешно (.all()), сохраняя целостность данных.

Организация Вызовов в цикле

Хотя эти стратегии управляют выполнением одной пачки Вызовов, агентам часто нужно решать многошаговые задачи, где результат одного Вызова влияет на следующий. Для этого существует протокол более высокого уровня, который организует Запросы и Вызовы в последовательность.

Следующий документ, 005: Агент/Цикл, подробно описывает этот цикл выполнения.