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

008: Агент/Переменные

Это специальная строка (текст), которая выглядит как †<тип>.<путь>. Она используется в параметрах Вызова инструмента, чтобы агент мог быстро найти нужную информацию в своей памяти, не копируя её целиком.

Переменные работают поверх системы Данных и позволяют информации двигаться и меняться. Они делают данные «живыми» с помощью двух основных действий:

  • Чтение: Ссылка на информацию, которая уже есть у агента (например, в Состоянии или во Входных данных), без необходимости переписывать её в параметры Вызова инструмента.
  • Запись: Сохранение результата работы инструмента в объект Данных (чаще всего в Состояние), чтобы его можно было использовать на следующих шагах работы агента.

Чтение из контекста

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

Ссылка — это простая строка, которая начинается со знака кинжала (). Её формат: †<тип>.<путь>, где <тип> — это вид сообщения с Данными (например, state для состояния или input для входных данных), а <путь> — это «адрес» нужной информации внутри этого сообщения.

Параметры инструмента с переменными

{
  "_tool": "greetUser",
  "userName": "†input.userName"
}

Как бы это выглядело в коде

// "Поприветствуй пользователя,
// имя которого лежит во входных данных по адресу userName"
greetUser({
  userName: input.userName,
});

Запись в контекст

Чтобы сохранить результат работы инструмента, Вызов может содержать специальное свойство _outputPath. Эта строка — Путь для вывода — говорит системе, куда именно положить результат, чтобы он был доступен на следующих шагах. Обычно результат сохраняют в объект Состояния (например, по пути †state.user.summary).

_outputPath можно определить двумя способами. Это позволяет гибко настраивать, как будет работать инструмент.

Гибкий путь (решает ИИ)

В этом режиме ИИ сам решает, куда сохранить результат во время работы. Это делает инструмент очень гибким.

// Схема инструмента разрешает любую
// строку для _outputPath
{
  "_outputPath": {
    "type": "string",
    "description": "Путь для сохранения сводки о пользователе.",
    "pattern": "^†"
  }
}

Жёсткий путь (прописан заранее)

Этот подход заставляет инструмент всегда записывать результат в одно и то же, заранее определённое место. Это делает его работу предсказуемой.

// Схема инструмента закрепляет
// одно конкретное значение для _outputPath
{
  "_outputPath": {
    "type": "string",
    "const": "†state.user.summary"
  }
}

Декларативная связь

Главная сила Переменных в том, что они позволяют описывать действия с данными, которых ещё нет. Например, можно создать Вызов инструмента, который будет работать с информацией из Входных данных, даже если эти данные ещё не получены. Это позволяет создавать универсальные, как бы «шаблонные» цепочки действий.

Эта идея позволяет связывать Вызовы инструментов друг с другом. Один Вызов инструмента может использовать ссылку на переменную, которая указывает на _outputPath (результат) предыдущего вызова в той же цепочке. Так создаётся поток данных, где результат работы одного инструмента становится входными данными для следующего.

Такая «сборка наперёд» становится особенно мощной, когда Пути для вывода используются для описания возможных исходов событий.

Альтернативные пути (Ветвление)

Использование || (означает «ИЛИ») в _outputPath позволяет инструменту объявить, какие у него могут быть результаты. Логика самого инструмента решит, по какому пути записать ответ.

// Если `verifyUser` (проверка пользователя) пройдёт успешно,
// результат запишется в `state.user.verified`;
// в противном случае — в `state.user.failed`.
{
  "_tool": "verifyUser",
  "userId": "perfect-stranger",
  "_outputPath": "†state.user.verified || †state.user.failed"
}

Одновременные пути (Разделение)

Использование && (означает «И») в _outputPath даёт команду записать один и тот же результат сразу в несколько мест.

// Записываем результат одновременно
// в объекты `user` и `audit` внутри состояния.
{
  "_tool": "generateSummary",
  "text": "Длинный текст здесь...",
  "_outputPath": "†state.user.summary && †state.audit.summary"
}

Эта возможность описать целую последовательность действий — включая сложные ветвления и разделения потоков — с данными, которых ещё нет, и лежит в основе декларативного планирования. Она позволяет ИИ составить полный план действий (граф потока данных), который можно проверить, одобрить и использовать повторно ещё до того, как будет запущен реальный код. Эта мощная способность к планированию возникает из того, как Переменные сочетаются с другими ключевыми понятиями:

Взаимодействие с другими частями системы

  • Данные: Переменные — это механизм, который делает сообщения с Данными интерактивными. Ссылки на переменные читают из сообщений (таких как Входные данные или Состояние), а Пути для вывода записывают данные обратно, создавая цикл, в котором информацию можно постоянно получать и изменять.

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

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

  • План: Переменные — это основа, на которой работает система Планов. Сообщение с Планом содержит схему Вызовов инструментов, где связи между ними создаются с помощью ссылок на переменные, указывающих на Пути для вывода. Это позволяет агенту описать целый рабочий процесс в виде единой и понятной структуры данных.

От временных связей к постоянной памяти

Переменные позволяют связывать данные с инструментами в рамках одного конкретного запроса. Но чтобы создавать сложных агентов, которые выполняют задачи в несколько шагов, нужна более надёжная память — «черновик», где результаты могут храниться и быть доступны в течение всей работы агента.

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