Gateway
Инструменты вызывают API
OpenClaw Gateway предоставляет конечную точку HTTP для прямого вызова одного инструмента. Она всегда включена и использует аутентификацию Gateway вместе с политикой инструментов. Как и в OpenAI-совместимом интерфейсе /v1/*, аутентификация Bearer с общим секретом считается доверенным операторским доступом ко всему Gateway.
POST /tools/invoke- Тот же порт, что и у Gateway (мультиплексирование WS + HTTP):
http://<gateway-host>:<port>/tools/invoke - Максимальный размер тела запроса по умолчанию: 2 МБ
Аутентификация
Использует конфигурацию аутентификации Gateway.
Распространённые варианты аутентификации HTTP:
- аутентификация с общим секретом (
gateway.auth.mode="token"или"password"):Authorization: Bearer <token-or-password> - доверенная HTTP-аутентификация с идентификационными данными (
gateway.auth.mode="trusted-proxy"): направьте запрос через настроенный прокси-сервер с поддержкой идентификации и позвольте ему добавить необходимые заголовки идентификации - открытая аутентификация для приватного входящего трафика (
gateway.auth.mode="none"): заголовок аутентификации не требуется
Примечания:
mode="token"используетgateway.auth.token(илиOPENCLAW_GATEWAY_TOKEN).mode="password"используетgateway.auth.password(илиOPENCLAW_GATEWAY_PASSWORD).mode="trusted-proxy"требует, чтобы HTTP-запрос поступал от настроенного доверенного источника прокси; для loopback-прокси на том же хосте необходимо явно указатьgateway.auth.trustedProxy.allowLoopback = true.- Внутренние вызывающие стороны на том же хосте, которые обходят прокси, могут использовать
gateway.auth.password/OPENCLAW_GATEWAY_PASSWORDкак локальный прямой резервный вариант. Любые признаки в заголовкахForwarded,X-Forwarded-*илиX-Real-IPвместо этого оставляют запрос на пути доверенного прокси. - Если настроен
gateway.auth.rateLimitи происходит слишком много ошибок аутентификации, конечная точка возвращает429сRetry-After.
Граница безопасности (важно)
Считайте эту конечную точку интерфейсом полного операторского доступа к экземпляру Gateway.
- HTTP-аутентификация Bearer здесь не является моделью с узкой областью доступа для каждого пользователя.
- Действительный токен или пароль Gateway для этой конечной точки следует считать учётными данными владельца или оператора.
- В режимах аутентификации с общим секретом (
tokenиpassword) конечная точка восстанавливает обычные полные операторские права по умолчанию, даже если вызывающая сторона отправляет заголовокx-openclaw-scopesс более узкой областью доступа. - При аутентификации с общим секретом прямые вызовы инструментов через эту конечную точку также считаются обращениями от владельца-отправителя.
- Доверенные режимы HTTP с идентификационными данными (аутентификация через доверенный прокси или
gateway.auth.mode="none"для приватного входящего трафика) учитываютx-openclaw-scopes, если он присутствует, а иначе используют обычный набор операторских областей доступа по умолчанию. - Оставляйте эту конечную точку доступной только через loopback, tailnet или приватный входящий трафик; не предоставляйте к ней прямой доступ из общедоступного интернета.
Матрица аутентификации:
| Режим аутентификации | Поведение |
|---|---|
token или password + Authorization: Bearer ... |
Подтверждает владение общим операторским секретом Gateway. Игнорирует более узкий x-openclaw-scopes. Восстанавливает полный набор операторских областей доступа по умолчанию: operator.admin, operator.approvals, operator.pairing, operator.read, operator.talk.secrets, operator.write. Считает прямые вызовы инструментов обращениями от владельца-отправителя. |
Доверенный HTTP с идентификационными данными (аутентификация через доверенный прокси или mode="none" для приватного входящего трафика) |
Аутентифицирует внешнюю доверенную идентичность или границу развёртывания. Учитывает x-openclaw-scopes, если он присутствует. Если заголовок отсутствует, использует обычный набор операторских областей доступа по умолчанию. Семантика владельца утрачивается только в том случае, если вызывающая сторона явно сужает области доступа и не включает operator.admin. |
Тело запроса
{ "tool": "sessions_list", "action": "json", "args": {}, "sessionKey": "main", "dryRun": false}Поля:
tool/name(строка, обязательно): имя вызываемого инструмента. Если отправлены оба поля, приоритет имеетname.action(строка, необязательно): объединяется сargs.action, если схема инструмента поддерживает свойствоactionи вargsоно ещё не задано.args(объект, необязательно): аргументы, специфичные для инструмента.sessionKey(строка, необязательно): ключ целевого сеанса. Если он не указан или равен"main", Gateway использует настроенный ключ основного сеанса (учитываяsession.mainKeyи агента по умолчанию либоglobalв глобальной области сеанса).agentId(строка, необязательно): определяет ключ сеанса для указанного агента. Возвращает ошибку400, если значение конфликтует с явно заданнымsessionKey, который уже сопоставлен другому агенту.idempotencyKey(строка, необязательно): используется для формирования стабильного идентификатора вызова инструмента.dryRun(логическое значение, необязательно): зарезервировано для будущего использования; в настоящее время игнорируется.
Поведение политики и маршрутизации
Доступность инструментов фильтруется через ту же цепочку политик, которую используют агенты Gateway:
tools.profile/tools.byProvider.profiletools.allow/tools.byProvider.allowagents.<id>.tools.allow/agents.<id>.tools.byProvider.allow- групповые политики (если ключ сеанса сопоставлен группе или каналу)
- политика субагента (при вызове с ключом сеанса субагента)
Если инструмент запрещён политикой, конечная точка возвращает 404.
Важные замечания о границах:
- Подтверждения выполнения являются операторскими защитными мерами, а не отдельной границей авторизации для этой конечной точки HTTP. Если инструмент доступен здесь посредством аутентификации Gateway и политики инструментов,
/tools/invokeне добавляет дополнительный запрос подтверждения для каждого вызова. - Если здесь доступен
exec, считайте его изменяющим состояние интерфейсом оболочки. Запретwrite,edit,apply_patchили HTTP-инструментов записи в файловую систему не делает выполнение команд оболочки доступным только для чтения. - Не передавайте учётные данные Bearer для Gateway недоверенным вызывающим сторонам. Если требуется разделение между границами доверия, запускайте отдельные экземпляры Gateway (в идеале от имени разных пользователей ОС или на разных хостах).
Gateway HTTP также по умолчанию применяет жёсткий список запретов (даже если политика сеанса разрешает инструмент):
| Инструмент | Причина |
|---|---|
exec |
Прямое выполнение команд (поверхность RCE) |
spawn |
Создание произвольных дочерних процессов (поверхность RCE) |
shell |
Выполнение команд оболочки (поверхность RCE) |
fs_write |
Произвольное изменение файлов на хосте |
fs_delete |
Произвольное удаление файлов на хосте |
fs_move |
Произвольное перемещение или переименование файлов на хосте |
apply_patch |
Применение исправлений может перезаписывать произвольные файлы |
sessions_spawn |
Оркестрация сеансов; удалённый запуск агентов представляет собой RCE |
sessions_send |
Внедрение сообщений между сеансами |
cron |
Уровень управления постоянной автоматизацией |
gateway |
Уровень управления Gateway; предотвращает изменение конфигурации через HTTP |
nodes |
Ретрансляция команд Node может обращаться к system.run на сопряжённых хостах |
cron, gateway и nodes также доступны только владельцу: даже вне этого списка запретов по умолчанию вызывающие стороны без прав владельца не могут вызывать их через этот интерфейс.
Настройте общий список запретов с помощью gateway.tools:
{ gateway: { tools: { // Дополнительные инструменты, блокируемые через HTTP /tools/invoke deny: ["browser"], // Удаление инструментов из списка запретов по умолчанию для вызывающих сторон с правами владельца или администратора allow: ["gateway"], }, },}gateway.tools.allow переопределяет доступность, а не повышает область доступа. В режимах HTTP с идентификационными данными cron, gateway и nodes остаются недоступными вызывающим сторонам без идентичности владельца или администратора (operator.admin), даже если они указаны в gateway.tools.allow. Аутентификация Bearer с общим секретом по-прежнему подчиняется приведённому выше правилу полного доверенного операторского доступа.
Чтобы групповые политики могли определить контекст, можно дополнительно задать:
x-openclaw-message-channel: <channel>(пример:slack,telegram)x-openclaw-account-id: <accountId>(если существует несколько учётных записей)x-openclaw-message-to: <target>(цель доставки для политики инструмента сообщений)x-openclaw-thread-id: <threadId>(контекст ветки для политики инструмента сообщений)
Ответы
| Статус | Значение |
|---|---|
200 |
{ ok: true, result } |
400 |
{ ok: false, error: { type, message } } (недопустимый запрос или ошибка входных данных инструмента) |
401 |
Не авторизовано |
403 |
{ ok: false, error: { type, message, requiresApproval? } } (вызов инструмента заблокирован политикой) |
404 |
Инструмент недоступен (не найден или отсутствует в списке разрешённых) |
405 |
Метод не разрешён |
408 |
Истекло время ожидания чтения тела запроса |
413 |
Размер тела запроса превысил максимальный размер полезной нагрузки |
429 |
Аутентификация ограничена по частоте запросов (задан Retry-After) |
500 |
{ ok: false, error: { type, message } } (неожиданная ошибка выполнения инструмента; сообщение очищено от конфиденциальных данных) |
Пример
curl -sS http://127.0.0.1:18789/tools/invoke \ -H 'Authorization: Bearer secret' \ -H 'Content-Type: application/json' \ -d '{ "tool": "sessions_list", "action": "json", "args": {} }'