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

013: Агент/Области видимости

Механизм, который позволяет передать для выполнения заданную часть информации (контекста) из родительской среды. Свойство _scopes работает как «белый список», определяя ограниченный и безопасный набор данных, к которым может получить доступ Вызов.

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

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

Предоставление и запрос контекста

Предоставленный контекст

Вызов инструмента

Родительский контекст

ввод

состояние

_scopes: ['input']

Выполнить инструмент

Одобрение человеком

Схема свойства _scopes определяет, как предоставляется контекст: статически (заранее) или динамически (по запросу) во время выполнения.

  • Статические области видимости (Предоставление контекста): Схема _scopes может быть постоянным значением (const), что означает, что контекст предоставляется заранее. Разработчик жёстко прописал, какую именно информацию может видеть инструмент.

    {
      "_scopes": {
        "const": ["input"]
      }
    }
    
  • Динамические области видимости (Запрос контекста): Схема _scopes может быть более гибкой, позволяя запрашивать контекст. ИИ-модель сама решает, какие из доступных областей ей нужны для создания Вызова.

    {
      "_scopes": {
        "type": "array",
        "items": {
          "enum": ["state", "input"]
        }
      }
    }
    

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

Роль областей видимости в композиции вызовов

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

  • Скрытое выполнение: При стандартном скрытом выполнении _scopes служат «подсказкой», чтобы сфокусировать внимание ИИ-модели на нужных частях родительского контекста. Это скорее рекомендация, а не строгий фильтр, но она крайне важна для повышения надёжности и экономичности работы ИИ, так как убирает шум от лишних данных. См. пример Устранение неоднозначности с помощью областей видимости.

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

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

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

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

Примеры

Пример: Устранение неоднозначности с помощью областей видимости

Неоднозначный контекст

В этом примере контекст неоднозначен. В нём есть два разных пользователя: currentUser в state и mentionedUser в input. Агенту нужно отправить сообщение, но неясно, кому.

[
  {
    "type": "state",
    "currentUser": { "id": "user_A", "name": "Алиса" }
  },
  {
    "type": "input",
    "mentionedUser": { "id": "user_B", "name": "Борис" },
    "instruction": "Отправь приветственное сообщение упомянутому выше пользователю."
  }
]

`Вызов` с областью видимости

Добавляя _scopes: ["input"], вызывающий даёт важную подсказку. Он говорит ИИ-модели сосредоточиться на данных из input, что устраняет неоднозначность и гарантирует, что сообщение будет отправлено правильному получателю — Борису.

{
  "_tool": "sendMessage",
  "_scopes": ["input"],
  "recipientId": "user_B",
  "message": "Добро пожаловать, Борис!"
}

Пример: Предоставление контекста для Действия

Здесь Действию нужен доступ к контекстной информации, которая не является прямым параметром инструмента. Инструмент logEvent принимает только eventName, но для правильной работы базовому действию также нужно знать userId.

`Вызов` с областью видимости

Вызов прост и содержит только eventName. Однако свойство _scopes: ["state"] указывает исполняющей среде передать объект state действию.

{
  "_tool": "logEvent",
  "_scopes": ["state"],
  "eventName": "user_login"
}

Реализация Действия (TypeScript)

Действие регистрируется с функцией, которая извлекает свои параметры напрямую из вызова и контекста области видимости. Это обеспечивает чистый и прямой доступ как к eventName, так и к userId.

// Параметры деструктурируются для прямого доступа к 'eventName'
// из вызова и 'state' из контекста области видимости.
Activity.register('logEvent', async ({ eventName }, { state }) => {
  const userId = state.userId;
  await analytics.track(eventName, { userId });
});

Пример: Определение области видимости для контекста Делегата

При делегировании _scopes определяют, какая часть родительского контекста будет добавлена к собственному внутреннему контексту делегата. Здесь высокоуровневый Оркестратор делегирует задачу, передавая весь объект state специализированному делегату Summarizer.

Родительский `Вызов` с областью видимости

У агента Оркестратор есть свой собственный контекст. Он делает Вызов, который определяет state для включения в контекст делегата.

// Контекст и вызов Оркестратора
[
  {
    "type": "state",
    "articleText": "Длинная и сложная статья..."
  },
  {
    "_tool": "summarizeArticle",
    "_delegate": "SummarizerAgent",
    "_scopes": ["state"]
  }
]

Контекст подзапроса Делегата

Среда выполнения Summarizer состоит из его собственного внутреннего контекста и данных, полученных из родительской области видимости. Это обеспечивает модульность, предоставляя при этом необходимую информацию.

// Контекст, созданный для подзапроса Summarizer
[
  // Внутренний контекст Summarizer
  {
    "type": "system",
    "message": "Ты — эксперт в составлении кратких summarizing."
  },
  // Добавляется контекст из родительской области видимости
  {
    "type": "state",
    "articleText": "Длинная и сложная статья..."
  }
]

Пример: Экземплирование с делегатами в областях видимости

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

Родительский контекст и решение

У родительского агента есть два отдельных экземпляра State. Он генерирует решение с двумя Вызовами к translatorDelegate. Каждый вызов нацелен на свой экземпляр и правильно ограничивает область видимости только state для этого экземпляра.

// РОДИТЕЛЬСКИЙ КОНТЕКСТ
[
  { "type": "state", "_instance": "①", "text": "Привет" },
  { "type": "state", "_instance": "②", "text": "Bonjour" }
]

// РЕШЕНИЕ ИИ-МОДЕЛИ
{
  "calls": [
    {
      "_tool": "translate",
      "_delegate": "translatorDelegate",
      "_instance": "①",
      "_scopes": ["state"]
    },
    {
      "_tool": "translate",
      "_delegate": "translatorDelegate",
      "_instance": "②",
      "_scopes": ["state"]
    }
  ]
}

Контексты подзапросов делегатов

Исполняющая среда создаёт два независимых подзапроса. Свойства _instance и _scopes работают вместе, чтобы каждый делегат получил только свой, правильно ограниченный state.

// КОНТЕКСТ ДЛЯ ДЕЛЕГАТА ①
[
  { "type": "system", "message": "Ты — переводчик." },
  { "type": "state", "text": "Привет" }
]

// КОНТЕКСТ ДЛЯ ДЕЛЕГАТА ②
[
  { "type": "system", "message": "Ты — переводчик." },
  { "type": "state", "text": "Bonjour" }
]