Инструменты сессии

Цель: небольшой набор инструментов, который трудно неправильно использовать, чтобы агенты могли перечислять сессии, получать историю и отправлять в другую сессию.

Имена инструментов

  • sessions_list
  • sessions_history
  • sessions_send
  • sessions_spawn

Ключевая модель

  • Основной бакет прямого чата всегда буквальный ключ "main" (разрешается в основной ключ текущего агента).
  • Групповые чаты используют agent:<agentId>:<channel>:group:<id> или agent:<agentId>:<channel>:channel:<id> (передайте полный ключ).
  • Задания Cron используют cron:<job.id>.
  • Хуки используют hook:<uuid>, если явно не установлено.
  • Сессии узлов используют node-<nodeId>, если явно не установлено.

global и unknown - зарезервированные значения и никогда не перечисляются. Если session.scope = "global", мы делаем псевдоним для main для всех инструментов, чтобы вызывающие никогда не видели global.

sessions_list

Перечислите сессии как массив строк.

Параметры:

  • kinds?: string[] фильтр: любой из "main" | "group" | "cron" | "hook" | "node" | "other"
  • limit?: number максимум строк (по умолчанию: значение по умолчанию сервера, ограничение например 200)
  • activeMinutes?: number только сессии, обновленные в пределах N минут
  • messageLimit?: number 0 = без сообщений (по умолчанию 0); >0 = включить последние N сообщений

Поведение:

  • messageLimit > 0 получает chat.history для каждой сессии и включает последние N сообщений.
  • Результаты инструментов отфильтровываются в выводе списка; используйте sessions_history для сообщений инструментов.
  • При запуске в изолированной сессии агента инструменты сессии по умолчанию имеют видимость только порожденных (см. ниже).

Форма строки (JSON):

  • key: ключ сессии (string)
  • kind: main | group | cron | hook | node | other
  • channel: whatsapp | telegram | discord | signal | imessage | webchat | internal | unknown
  • displayName (метка отображения группы, если доступна)
  • updatedAt (мс)
  • sessionId
  • model, contextTokens, totalTokens
  • thinkingLevel, verboseLevel, systemSent, abortedLastRun
  • sendPolicy (переопределение сессии, если установлено)
  • lastChannel, lastTo
  • deliveryContext (нормализованный \{ channel, to, accountId \}, когда доступен)
  • transcriptPath (путь наилучшего усилия, полученный из директории хранилища + sessionId)
  • messages? (только когда messageLimit > 0)

sessions_history

Получить транскрипт для одной сессии.

Параметры:

  • sessionKey (обязательно; принимает ключ сессии или sessionId из sessions_list)
  • limit?: number максимум сообщений (сервер ограничивает)
  • includeTools?: boolean (по умолчанию false)

Поведение:

  • includeTools=false фильтрует сообщения role: "toolResult".
  • Возвращает массив сообщений в формате необработанного транскрипта.
  • При указании sessionId OpenClaw разрешает его в соответствующий ключ сессии (отсутствующие ids ошибка).

sessions_send

Отправить сообщение в другую сессию.

Параметры:

  • sessionKey (обязательно; принимает ключ сессии или sessionId из sessions_list)
  • message (обязательно)
  • timeoutSeconds?: number (по умолчанию >0; 0 = fire-and-forget)

Поведение:

  • timeoutSeconds = 0: поставить в очередь и вернуть \{ runId, status: "accepted" \}.
  • timeoutSeconds > 0: ждать до N секунд завершения, затем вернуть \{ runId, status: "ok", reply \}.
  • Если ожидание истекает: \{ runId, status: "timeout", error \}. Запуск продолжается; вызовите sessions_history позже.
  • Если запуск не работает: \{ runId, status: "error", error \}.
  • Запуски доставки объявлений завершаются после завершения основного запуска и являются наилучшим усилием; status: "ok" не гарантирует, что объявление было доставлено.
  • Ожидает через gateway agent.wait (на стороне сервера), поэтому переподключения не сбрасывают ожидание.
  • Контекст сообщения агент-агент внедряется для основного запуска.
  • После завершения основного запуска OpenClaw запускает цикл ответа-обратно:
    • Раунд 2+ чередуется между агентами-запросчиками и целевыми агентами.
    • Ответьте точно REPLY_SKIP, чтобы остановить пинг-понг.
    • Максимум ходов - session.agentToAgent.maxPingPongTurns (0–5, по умолчанию 5).
  • Когда цикл заканчивается, OpenClaw запускает шаг объявления агент-агент (только целевой агент):
    • Ответьте точно ANNOUNCE_SKIP, чтобы остаться молчаливым.
    • Любой другой ответ отправляется в целевой канал.
    • Шаг объявления включает исходный запрос + ответ раунда 1 + последний ответ пинг-понга.

Поле канала

  • Для групп channel - это канал, записанный в записи сессии.
  • Для прямых чатов channel отображается из lastChannel.
  • Для cron/hook/node channel - это internal.
  • Если отсутствует, channel - это unknown.

Безопасность / Политика отправки

Блокировка на основе политики по каналу/типу чата (не по id сессии).

{
  "session": {
    "sendPolicy": {
      "rules": [
        {
          "match": { "channel": "discord", "chatType": "group" },
          "action": "deny"
        }
      ],
      "default": "allow"
    }
  }
}

Переопределение времени выполнения (для каждой записи сессии):

  • sendPolicy: "allow" | "deny" (не установлено = наследовать конфигурацию)
  • Устанавливается через sessions.patch или только для владельца /send on|off|inherit (автономное сообщение).

Точки принудительного применения:

  • chat.send / agent (gateway)
  • логика доставки автоответа

sessions_spawn

Запустите запуск субагента в изолированной сессии и объявите результат обратно в канал чата запросчика.

Параметры:

  • task (обязательно)
  • label? (необязательно; используется для журналов/UI)
  • agentId? (необязательно; запустить под другим id агента, если разрешено)
  • model? (необязательно; переопределяет модель субагента; недопустимые значения ошибка)
  • runTimeoutSeconds? (по умолчанию 0; когда установлено, прерывает запуск субагента через N секунд)
  • cleanup? (delete|keep, по умолчанию keep)

Список разрешений:

  • agents.list[].subagents.allowAgents: список id агентов, разрешенных через agentId (["*"], чтобы разрешить любой). По умолчанию: только агент-запросчик.

Обнаружение:

  • Используйте agents_list, чтобы обнаружить, какие id агентов разрешены для sessions_spawn.

Поведение:

  • Запускает новую сессию agent:<agentId>:subagent:<uuid> с deliver: false.
  • Субагенты по умолчанию имеют полный набор инструментов минус инструменты сессии (настраивается через tools.subagents.tools).
  • Субагентам не разрешено вызывать sessions_spawn (без порождения субагент → субагент).
  • Всегда неблокирующий: немедленно возвращает \{ status: "accepted", runId, childSessionKey \}.
  • После завершения OpenClaw запускает шаг объявления субагента и публикует результат в канал чата запросчика.
  • Ответьте точно ANNOUNCE_SKIP во время шага объявления, чтобы остаться молчаливым.
  • Ответы объявлений нормализуются в Status/Result/Notes; Status берется из результата времени выполнения (не текста модели).
  • Сессии субагентов автоматически архивируются после agents.defaults.subagents.archiveAfterMinutes (по умолчанию: 60).
  • Ответы объявлений включают строку статистики (время выполнения, токены, sessionKey/sessionId, путь транскрипта и необязательную стоимость).

Видимость сессии песочницы

Изолированные сессии могут использовать инструменты сессии, но по умолчанию они видят только сессии, которые они породили через sessions_spawn.

Конфигурация:

{
  agents: {
    defaults: {
      sandbox: {
        // по умолчанию: "spawned"
        sessionToolsVisibility: "spawned" // или "all"
      }
    }
  }
}