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-запит надходив із налаштованого джерела довіреного проксі; проксі local 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, якщо він наявний, а інакше використовують звичайний набір операторських областей доступу за замовчуванням.
  • Залишайте цю кінцеву точку доступною лише через local 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.

Тіло запиту

json
{  "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.profile
  • tools.allow / tools.byProvider.allow
  • agents.<id>.tools.allow / agents.<id>.tools.byProvider.allow
  • групові політики (якщо ключ сеансу відповідає групі або каналу)
  • політика підлеглого агента (під час виклику з ключем сеансу підлеглого агента)

Якщо політика не дозволяє інструмент, кінцева точка повертає 404.

Важливі примітки щодо межі:

  • Підтвердження виконання команд є операторськими запобіжниками, а не окремою межею авторизації для цієї HTTP-кінцевої точки. Якщо інструмент доступний тут через автентифікацію Gateway і політику інструментів, /tools/invoke не додає окремого запиту підтвердження для кожного виклику.
  • Якщо exec доступний тут, розглядайте його як інтерфейс оболонки, що може змінювати стан. Заборона write, edit, apply_patch або HTTP-інструментів запису до файлової системи не робить виконання команд в оболонці доступом лише для читання.
  • Не надавайте bearer-облікові дані Gateway недовіреним викликам. Якщо потрібно розділити межі довіри, запускайте окремі екземпляри Gateway (бажано від імені окремих користувачів ОС або на окремих хостах).

HTTP-інтерфейс Gateway також за замовчуванням застосовує жорсткий список заборон (навіть якщо політика сеансу дозволяє інструмент):

Інструмент Причина
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:

json5
{  gateway: {    tools: {      // Additional tools to block over HTTP /tools/invoke      deny: ["browser"],      // Remove tools from the default deny list for owner/admin callers      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 } } (неочікувана помилка виконання інструмента; повідомлення очищено)

Приклад

bash
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": {}  }'

Пов’язані матеріали

Was this useful?
On this page

On this page