Перейти до основного вмісту

Інструменти чату

Chat може дозволити моделі викликати інструменти. Хід із ними запускає власний багатоетапний цикл: модель просить інструмент, Libre WebUI виконує його від імені й з дозволами користувача, повертає результат моделі та продовжує до відповіді — не більше восьми раундів і восьми викликів у кожному. Зупинка скасовує модель, поточний інструмент і очікування схвалення.

Виклики записуються як нормалізовані події (chat.tool-call.v1, chat.tool-result.v1, chat.approval.v1), які однаково проходять приватним WebSocket і постійним потоком, тож оновлення або повторне з’єднання відтворює той самий стан. Завершений хід зберігає виклики з обмеженим переглядом результатів у повідомленні асистента.

Увімкнення інструментів​

Типово інструменти вимкнено. Адміністратор відкриває їх у Налаштування → Керування користувачами → Доступ і політики → Доступ до інструментів лише адміністраторам або всім, після чого кожен хід вмикає їх гайковим ключем у редакторі. Селектор має загальний перемикач і прапорець кожного вбудованого інструмента та зареєстрованого сервера, тому хід отримує саме вибраний набір. Селектор може звузити інструменти профілю, але не розширити. Приватні чати ніколи не пропонують інструменти: зовнішня дія може залишати схвалення й аудит.

Перемикач Доступ до інструментів зберігається одразу. Клацніть його або перейдіть до нього клавішею Tab і перемкніть клавішею Space. Зміна доступу залишає вікно Налаштувань і позицію прокручування на місці.

Профіль асистента може обмежити пропозицію прив’язаними серверами, підмножиною вбудованих інструментів, навичками й колекціями знань.

Вбудовані інструменти​

Chat містить тринадцять власних інструментів; усі лише читають, крім змін Нотаток і Календаря, що проходять схвалення побічного ефекту:

  • web_search — налаштована адміністратором пошукова система з режимом доступу.
  • search_documents — гібридний пошук у документах і колекціях, зокрема наданих; профіль може звузити колекції, а кожен уривок має фрагмент і місце джерела.
  • list_documents — перелік документів області чату з ID, типами й розмірами.
  • read_document — обмежене вікно документа за ID і зміщенням із позначеним джерелом.
  • load_skill — повні інструкції навички за slug; опис містить маніфест увімкнених навичок, тому вони завантажуються лише за потреби. Для супровідних файлів додається їх перелік.
  • read_skill_file — один супровідний файл за slug і відносним шляхом.
  • list_notes — власні й надані нотатки з ID.
  • read_note — повний вміст однієї нотатки.
  • create_note — створення нотатки, потребує схвалення.
  • update_note — заміна вмісту зі збереженням попередньої версії, потребує схвалення.
  • list_calendar_events — власні й надані події в діапазоні мілісекунд епохи.
  • create_calendar_event — створення події, потребує схвалення.
  • delete_calendar_event — видалення події за ID, потребує схвалення.

Сервери інструментів​

Адміністратори реєструють зовнішні сервери в Налаштування → Інструменти; початкові шаблони заповнюють форму, зокрема безпечним публічним демо API:

  • OpenAPI: специфікація JSON OpenAPI 3.x завантажується один раз і фіксується дайджестом SHA-256. Кожна операція стає інструментом; GET вважається лише читанням, інші — побічним ефектом, доки адміністратор не змінить класифікацію. Виклик відтворюється із зафіксованої операції; аргументи моделі не вибирають місце призначення.
  • MCP (Streamable HTTP): список інструментів отримується через JSON-RPC і так само фіксується. annotations.readOnlyHint позначає читання. MCP через stdio навмисно не підтримується: зовнішні процеси не запускаються у вебпроцесі.

Зміна переліку набуває чинності лише після оновлення адміністратором, що просуває зафіксовану версію й зберігає перевизначення окремих інструментів. Доступність сервера може бути лише для адміністраторів, для всіх або за дозволами користувачів і груп спільної моделі ресурсів.

Облікові дані​

Сервери з автентифікацією використовують облікові дані окремих користувачів: bearer-токен або названий заголовок. Кожен секрет шифрується з додатковими автентифікованими даними, що прив’язують його до точних користувача й сервера, вводиться в Налаштування → Інструменти й ніколи не ділиться між обліковими записами.

Інтерактивний OAuth (MCP)​

Сервер MCP може також входити кожну людину під власним обліковим записом. Зареєструйте його з режимом автентифікації Інтерактивний OAuth, і Libre WebUI прочитає виклик WWW-Authenticate, яким відповідає сервер, пройде за ним до метаданих захищеного ресурсу, потім до метаданих сервера авторизації і зареєструє клієнта динамічно (RFC 7591), якщо сервер авторизації пропонує реєстрацію. Провайдери, що не реєструють клієнтів автоматично, приймають ID клієнта, наданий адміністратором, і необов’язковий секрет у формі реєстрації; секрет шифрується разом із виявленими кінцевими точками.

Далі кожна людина натискає Підключити на картці сервера й перенаправляється до провайдера. Потік використовує PKCE (S256) зі станом CSRF, а верифікатор PKCE зберігається в HttpOnly-cookie, прив’язаному до цього одного сервера. Зворотний виклик обмінює код на сервері, зберігає токени зашифрованими з тією самою прив’язкою до користувача й сервера, що й статичний секрет, і повертає браузер до застосунку з прапорцем стану — токени доступу й оновлення ніколи не потрапляють на сторінку. Токени доступу оновлюються автоматично за хвилину до завершення строку, один раз на людину й сервер, навіть коли кілька викликів інструментів змагаються. Коли оновлення неможливе, виклик інструмента повертається з проханням перепідключитися, а не провалюється анонімно. Відключити видаляє токени цієї людини й лишає реєстрацію на місці; видалення сервера забуває і виявлену конфігурацію.

Сервер, що відмовляє в неавтентифікованому переліку інструментів, усе одно реєструється: його перелік фіксується під час першого успішного підключення (і за будь-якого оновлення адміністратором), тож моделі нічого не пропонується, доки воно не відоме.

Політика вихідного трафіку​

Кожен запит сам визначає місце призначення, відмовляється від приватних, loopback і метаданих адрес та фіксує з’єднання на визначеній адресі, щоб DNS rebinding не перенаправив виклик. Перенаправлення відхиляються. Відповіді мають ліміт розміру, виклики — жорсткий тайм-аут. Точні внутрішні хости можна дозволити через TOOLS_PRIVATE_NETWORK_ALLOWLIST (список через кому); вони залишаються зафіксованими й обмеженими. Вивід повертається моделі як недовірений текст.

Схвалення​

Інструменти лише для читання запускаються без запиту. Побічний ефект призупиняє хід і пропонує: дозволити один раз, для цього чату, завжди для цього інструмента на сервері або відхилити. Рішення постійні — дозвіл «завжди» переживає перезапуск і відкликається в Налаштування → Інструменти — а очікування спливає за дві хвилини й виглядає моделі як відмова. Відмова й тайм-аут ніколи не виконують виклик. Кожне рішення й виклик залишають зредаговану подію аудиту безпеки.

Приклади​

Спочатку ввімкніть гайковий ключ; кожен приклад — звичайне повідомлення.

web_search — знайти відомості​

Що змінилося в останньому випуску SQLite? Перед відповіддю виконай веб-пошук.

Модель викликає web_search із запитом на кшталт {"query": "SQLite latest release changelog"}, картка показує отримані уривки, а відповідь посилається на знайдене. Потрібне налаштоване й дозволене веб-вишукування.

search_documents — запитати власні файли​

Завантажте PDF або додайте документи до колекції, потім:

Знайди в моїх документах умову розірвання й процитуй її точно.

Модель викликає search_documents із {"query": "termination clause"} та отримує уривки з позначеними джерелами.

load_skill — застосувати збережену навичку​

Створіть навичку в Налаштування → Навички, наприклад $release-notes, і напишіть:

Підготуй примітки до випуску для цієї різниці за допомогою $release-notes.

Модель бачить її в маніфесті, викликає load_skill {"slug": "release-notes"} і дотримується інструкцій. Символ $ у редакторі доповнює slug навичок.

Сервер OpenAPI — наприклад, погода​

  1. Налаштування → Інструменти → Зареєструвати сервер: ім’я Weather, тип OpenAPI, базовий URL https://api.example-weather.dev, URL специфікації https://api.example-weather.dev/openapi.json, автентифікація bearer.

  2. Специфікація фіксується, а операції стають інструментами, наприклад getForecast (GET, читання) і createAlert (POST, побічний ефект).

  3. Кожен користувач зберігає власний ключ API на картці сервера.

  4. У чаті:

    Який прогноз для Монреаля на ці вихідні?

    weather__getForecast {"city": "Montreal"} виконується одразу.

    Сповісти мене, якщо сьогодні вночі температура впаде нижче -20.

    weather__createAlert призупиняє хід із карткою Дозволити один раз, Дозволити для чату, Завжди дозволяти або Відхилити. До вибору нічого не надсилається.

Exa MCP — пошук і отримання вмісту з вебу​

У розділі Налаштування → Інструменти → Почніть із шаблону виберіть Exa, щоб попередньо заповнити реєстрацію MCP адресою:

https://mcp.exa.ai/mcp?tools=web_search_exa,web_fetch_exa

Адреса вибирає web_search_exa і web_fetch_exa через параметр вибору інструментів Exa. Шаблон не використовує автентифікації й типово обмежує доступ адміністраторами. Перевірте форму та виберіть Зберегти, щоб під’єднатися й закріпити перелік інструментів. Відкриття або скасування шаблону не звертається до Exa. Пошукові запити та запитані адреси надсилаються до Exa, коли ці інструменти виконуються.

Сервер MCP — наприклад, трекер задач​

  1. Налаштування → Інструменти → Зареєструвати сервер: ім’я Issues, тип MCP, URL https://mcp.example-tracker.dev/mcp, автентифікація header із X-Api-Key.

  2. Список фіксується; позначені сервером інструменти читання, як search_issues, виконуються одразу, інші, як create_issue, запитують дозвіл.

  3. У чаті:

    Знайди відкриті задачі зі словами «database lock» і створи нову з узагальненням закономірності.

    issues__search_issues виконується одразу; issues__create_issue показує точні аргументи до схвалення.

Змінні середовища​

ЗміннаДія
TOOLS_ACCESS_MODEФіксує функцію як admins або all-users і блокує перемикач.
TOOLS_PRIVATE_NETWORK_ALLOWLISTТочні хости, яким дозволено визначатися в приватні адреси, через кому.

Межі​

  • Виклики працюють через WebSocket і постійний шлях генерації збережених чатів. Приватний транспорт навмисно виключено, а старий потоковий REST не запускає цикл.
  • Згадки @model у каналі запускають той самий цикл проти каталогу учасника, який згадав модель, з однією відмінністю: запитувати нікого, тож інструмент із побічним ефектом без постійного схвалення відхиляється негайно замість очікування. Інструменти лише для читання працюють як завжди.
  • Агенти Work викликають ті самі сервери через той самий шлюз: лише запуски з доступом до мережі, сервери без збережених облікових даних відсіюються на етапі пропозиції, а інструменти з побічним ефектом проходять схвалення Work.
  • Gemini й моделі агентів CLI не отримують інструментів; Ollama, сумісні з OpenAI, Responses API та Anthropic отримують.
  • Інтерактивний OAuth доступний лише для MCP: сервер OpenAPI й далі використовує статичні облікові дані користувача. Потік — це authorization-code grant із PKCE; потоки device-code і client-credentials не пропонуються, а до сервера авторизації, що не публікує метаданих (або не має кінцевої точки реєстрації й адміністратор не надав ID клієнта), підключитися не можна.
  • Виявлені кінцеві точки OAuth мають бути https; звичайний http приймається лише для loopback, для провайдера, що працює на тій самій машині під час розробки.
  • URI перенаправлення походить із BASE_URL (або першого CORS_ORIGIN), тож це значення має бути адресою, яку браузер справді досягає, і має бути зареєстроване у провайдерів, що фіксують URI перенаправлення.