diff --git a/docs/uk/channels/msteams.md b/docs/uk/channels/msteams.md index 85f45ab85..88762e6af 100644 --- a/docs/uk/channels/msteams.md +++ b/docs/uk/channels/msteams.md @@ -1,30 +1,34 @@ --- read_when: - Робота над функціями каналу Microsoft Teams -summary: Стан підтримки бота Microsoft Teams, можливості та конфігурація +summary: Статус підтримки, можливості та конфігурація бота Microsoft Teams title: Microsoft Teams x-i18n: - generated_at: "2026-04-29T05:36:34Z" + generated_at: "2026-04-29T07:51:49Z" model: gpt-5.5 provider: openai - source_hash: 62dfb6787c86b3aa1baef632654986621fc706ecd1f1c96b83b97b6d6c564d7a + source_hash: 535bd7f9713f221572a99ae3a7a39d7acdd5a1e41c2d79a43d4caf9c2ce2b159 source_path: channels/msteams.md workflow: 16 --- -Стан: підтримуються текст + вкладення DM; надсилання файлів у каналах/групах потребує `sharePointSiteId` + дозволів Graph (див. [Надсилання файлів у групових чатах](#sending-files-in-group-chats)). Опитування надсилаються через Adaptive Cards. Дії повідомлень надають явний `upload-file` для надсилань, де файл є першим. +Статус: підтримуються текст + вкладення в DM; надсилання файлів у канали/групи потребує `sharePointSiteId` + дозволів Graph (див. [Надсилання файлів у групових чатах](#sending-files-in-group-chats)). Опитування надсилаються через Adaptive Cards. Дії повідомлень надають явний `upload-file` для надсилання, де файл є основним. -## Вбудований plugin +## Вбудований Plugin -Microsoft Teams постачається як вбудований plugin у поточних випусках OpenClaw, тому окреме встановлення у звичайній пакетованій збірці не потрібне. +Microsoft Teams постачається як вбудований Plugin у поточних випусках OpenClaw, тому +окреме встановлення у звичайній пакетній збірці не потрібне. -Якщо ви використовуєте старішу збірку або власне встановлення, яке виключає вбудований Teams, встановіть поточний npm-пакет, коли його буде опубліковано: +Якщо ви використовуєте старішу збірку або власне встановлення, що виключає вбудований Teams, +встановіть поточний npm-пакет, коли його буде опубліковано: ```bash openclaw plugins install @openclaw/msteams ``` -Якщо npm повідомляє, що пакет, яким володіє OpenClaw, застарів, використовуйте поточну пакетовану збірку OpenClaw або шлях до локального checkout, доки не буде опубліковано новіший npm-пакет. +Якщо npm повідомляє, що пакет, яким володіє OpenClaw, застарілий, використовуйте поточну пакетну +збірку OpenClaw або локальний шлях checkout, доки не буде +опубліковано новіший npm-пакет. Локальний checkout (під час запуску з git-репозиторію): @@ -36,9 +40,9 @@ openclaw plugins install ./path/to/local/msteams-plugin ## Швидке налаштування -[`@microsoft/teams.cli`](https://www.npmjs.com/package/@microsoft/teams.cli) обробляє реєстрацію бота, створення manifest і генерацію облікових даних однією командою. +[`@microsoft/teams.cli`](https://www.npmjs.com/package/@microsoft/teams.cli) обробляє реєстрацію бота, створення маніфесту та генерування облікових даних однією командою. -**1. Встановіть і увійдіть** +**1. Встановіть і ввійдіть** ```bash npm install -g @microsoft/teams.cli@preview @@ -47,12 +51,12 @@ teams status # verify you're logged in and see your tenant info ``` -Teams CLI зараз перебуває у preview. Команди та flags можуть змінюватися між випусками. +Teams CLI зараз перебуває в preview. Команди та прапорці можуть змінюватися між випусками. -**2. Запустіть tunnel** (Teams не може дістатися localhost) +**2. Запустіть тунель** (Teams не може дістатися до localhost) -Встановіть і автентифікуйте devtunnel CLI, якщо ви ще цього не зробили ([посібник для початку роботи](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/get-started)). +Встановіть і автентифікуйте devtunnel CLI, якщо ще цього не зробили ([посібник із початку роботи](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/get-started)). ```bash # One-time setup (persistent URL across sessions): @@ -65,7 +69,7 @@ devtunnel host my-openclaw-bot ``` -`--allow-anonymous` потрібен, оскільки Teams не може автентифікуватися з devtunnels. Кожен вхідний запит бота все одно автоматично перевіряється Teams SDK. +`--allow-anonymous` потрібен, бо Teams не може автентифікуватися з devtunnels. Кожен вхідний запит бота все одно автоматично перевіряється Teams SDK. Альтернативи: `ngrok http 3978` або `tailscale funnel 3978` (але вони можуть змінювати URL у кожній сесії). @@ -81,9 +85,9 @@ teams app create \ Ця одна команда: - Створює застосунок Entra ID (Azure AD) -- Генерує client secret -- Збирає й завантажує manifest застосунку Teams (з іконками) -- Реєструє бота (за замовчуванням керується Teams — підписка Azure не потрібна) +- Генерує клієнтський секрет +- Збирає та завантажує маніфест застосунку Teams (з іконками) +- Реєструє бота (типово керований Teams — передплата Azure не потрібна) Вивід покаже `CLIENT_ID`, `CLIENT_SECRET`, `TENANT_ID` і **Teams App ID** — занотуйте їх для наступних кроків. Він також запропонує встановити застосунок безпосередньо в Teams. @@ -107,7 +111,7 @@ teams app create \ **5. Встановіть застосунок у Teams** -`teams app create` запропонує встановити застосунок — виберіть "Install in Teams". Якщо ви пропустили це, посилання можна отримати пізніше: +`teams app create` запропонує встановити застосунок — виберіть "Встановити в Teams". Якщо ви пропустили це, посилання можна отримати пізніше: ```bash teams app get --install-link @@ -119,23 +123,23 @@ teams app get --install-link teams app doctor ``` -Це запускає діагностику реєстрації бота, конфігурації застосунку AAD, чинності manifest і налаштування SSO. +Це запускає діагностику реєстрації бота, конфігурації застосунку AAD, чинності маніфесту та налаштування SSO. -Для production-розгортань розгляньте використання [федеративної автентифікації](/uk/channels/msteams#federated-authentication-certificate-plus-managed-identity) (сертифікат або managed identity) замість client secrets. +Для production-розгортань розгляньте використання [федеративної автентифікації](/uk/channels/msteams#federated-authentication-certificate-plus-managed-identity) (сертифікат або керована ідентичність) замість клієнтських секретів. -Групові чати за замовчуванням заблоковані (`channels.msteams.groupPolicy: "allowlist"`). Щоб дозволити відповіді в групах, задайте `channels.msteams.groupAllowFrom` або використайте `groupPolicy: "open"`, щоб дозволити будь-якого учасника (з обов’язковою згадкою). +Групові чати типово заблоковані (`channels.msteams.groupPolicy: "allowlist"`). Щоб дозволити відповіді в групах, задайте `channels.msteams.groupAllowFrom` або використайте `groupPolicy: "open"`, щоб дозволити будь-якому учаснику (з вимогою згадки). ## Цілі - Спілкуватися з OpenClaw через DM, групові чати або канали Teams. -- Зберігати детермінований routing: відповіді завжди повертаються в канал, з якого вони надійшли. -- За замовчуванням використовувати безпечну поведінку каналів (згадки обов’язкові, якщо не налаштовано інакше). +- Зберігати детерміновану маршрутизацію: відповіді завжди повертаються до каналу, з якого вони надійшли. +- Типово використовувати безпечну поведінку каналів (згадки обов’язкові, якщо не налаштовано інакше). ## Записи конфігурації -За замовчуванням Microsoft Teams дозволено записувати оновлення конфігурації, спричинені `/config set|unset` (потрібно `commands.config: true`). +Типово Microsoft Teams дозволено записувати оновлення конфігурації, спричинені `/config set|unset` (потребує `commands.config: true`). Вимкніть за допомогою: @@ -147,18 +151,18 @@ teams app doctor ## Контроль доступу (DM + групи) -**Доступ DM** +**Доступ до DM** -- За замовчуванням: `channels.msteams.dmPolicy = "pairing"`. Невідомі відправники ігноруються, доки їх не схвалено. +- Типово: `channels.msteams.dmPolicy = "pairing"`. Невідомі відправники ігноруються, доки їх не схвалять. - `channels.msteams.allowFrom` має використовувати стабільні object ID AAD. -- Не покладайтеся на зіставлення UPN/display-name для allowlists — вони можуть змінюватися. OpenClaw за замовчуванням вимикає пряме зіставлення імен; вмикайте його явно через `channels.msteams.dangerouslyAllowNameMatching: true`. +- Не покладайтеся на зіставлення UPN/відображуваного імені для allowlist — вони можуть змінюватися. OpenClaw типово вимикає пряме зіставлення імен; увімкніть його явно через `channels.msteams.dangerouslyAllowNameMatching: true`. - Майстер може зіставляти імена з ID через Microsoft Graph, коли облікові дані це дозволяють. -**Доступ груп** +**Доступ до груп** -- За замовчуванням: `channels.msteams.groupPolicy = "allowlist"` (заблоковано, доки ви не додасте `groupAllowFrom`). Використовуйте `channels.defaults.groupPolicy`, щоб перевизначити стандартне значення, коли воно не задане. -- `channels.msteams.groupAllowFrom` контролює, які відправники можуть запускати обробку в групових чатах/каналах (резервно використовує `channels.msteams.allowFrom`). -- Задайте `groupPolicy: "open"`, щоб дозволити будь-якого учасника (за замовчуванням усе ще з обов’язковою згадкою). +- Типово: `channels.msteams.groupPolicy = "allowlist"` (заблоковано, якщо ви не додасте `groupAllowFrom`). Використайте `channels.defaults.groupPolicy`, щоб перевизначити типове значення, коли воно не задане. +- `channels.msteams.groupAllowFrom` контролює, які відправники можуть запускати обробку в групових чатах/каналах (із fallback до `channels.msteams.allowFrom`). +- Задайте `groupPolicy: "open"`, щоб дозволити будь-якому учаснику (типово все одно з вимогою згадки). - Щоб не дозволяти **жодних каналів**, задайте `channels.msteams.groupPolicy: "disabled"`. Приклад: @@ -176,12 +180,12 @@ teams app doctor **Teams + allowlist каналів** -- Обмежуйте відповіді груп/каналів, перелічуючи teams і канали в `channels.msteams.teams`. -- Ключі мають використовувати стабільні team ID і channel conversation ID. -- Коли `groupPolicy="allowlist"` і наявний allowlist teams, приймаються лише перелічені teams/канали (з обов’язковою згадкою). +- Обмежуйте відповіді в групах/каналах, перелічуючи команди та канали в `channels.msteams.teams`. +- Ключі мають використовувати стабільні ID команд і conversation ID каналів. +- Коли `groupPolicy="allowlist"` і наявний allowlist Teams, приймаються лише перелічені команди/канали (з вимогою згадки). - Майстер налаштування приймає записи `Team/Channel` і зберігає їх для вас. -- Під час запуску OpenClaw зіставляє назви team/channel і user allowlist з ID (коли дозволи Graph це дозволяють) - і записує mapping у журнал; нерозв’язані назви team/channel зберігаються як введені, але за замовчуванням ігноруються для routing, якщо не ввімкнено `channels.msteams.dangerouslyAllowNameMatching: true`. +- Під час запуску OpenClaw зіставляє імена команд/каналів та імена allowlist користувачів з ID (коли дозволи Graph це дозволяють) + і записує зіставлення в журнал; нерозв’язані імена команд/каналів зберігаються як введені, але типово ігноруються для маршрутизації, якщо не ввімкнено `channels.msteams.dangerouslyAllowNameMatching: true`. Приклад: @@ -205,40 +209,40 @@ teams app doctor
Ручне налаштування (без Teams CLI) -Якщо ви не можете використовувати Teams CLI, бота можна налаштувати вручну через Azure Portal. +Якщо ви не можете використовувати Teams CLI, ви можете налаштувати бота вручну через Azure Portal. ### Як це працює -1. Переконайтеся, що Microsoft Teams plugin доступний (вбудований у поточні випуски). +1. Переконайтеся, що Microsoft Teams Plugin доступний (вбудований у поточні випуски). 2. Створіть **Azure Bot** (App ID + secret + tenant ID). 3. Зберіть **пакет застосунку Teams**, який посилається на бота й містить дозволи RSC нижче. -4. Завантажте/встановіть застосунок Teams у team (або в personal scope для DM). -5. Налаштуйте `msteams` у `~/.openclaw/openclaw.json` (або env vars) і запустіть gateway. -6. Gateway за замовчуванням слухає webhook-трафік Bot Framework на `/api/messages`. +4. Завантажте/встановіть застосунок Teams у команду (або personal scope для DM). +5. Налаштуйте `msteams` у `~/.openclaw/openclaw.json` (або змінних середовища) і запустіть Gateway. +6. Gateway типово слухає трафік Webhook Bot Framework на `/api/messages`. ### Крок 1: Створіть Azure Bot -1. Перейдіть до [Create Azure Bot](https://portal.azure.com/#create/Microsoft.AzureBot) -2. Заповніть вкладку **Basics**: +1. Перейдіть до [Створити Azure Bot](https://portal.azure.com/#create/Microsoft.AzureBot) +2. Заповніть вкладку **Основи**: | Поле | Значення | | ------------------ | -------------------------------------------------------- | - | **Bot handle** | Ім’я вашого бота, напр., `openclaw-msteams` (має бути унікальним) | - | **Subscription** | Виберіть вашу підписку Azure | - | **Resource group** | Створіть нову або використайте наявну | - | **Pricing tier** | **Free** для dev/testing | - | **Type of App** | **Single Tenant** (рекомендовано - див. примітку нижче) | - | **Creation type** | **Create new Microsoft App ID** | + | **Дескриптор бота** | Ім’я вашого бота, напр., `openclaw-msteams` (має бути унікальним) | + | **Передплата** | Виберіть вашу передплату Azure | + | **Група ресурсів** | Створіть нову або використайте наявну | + | **Ціновий рівень** | **Free** для розробки/тестування | + | **Тип застосунку** | **Single Tenant** (рекомендовано - див. примітку нижче) | + | **Тип створення** | **Create new Microsoft App ID** | -Створення нових multi-tenant ботів було deprecated після 2025-07-31. Використовуйте **Single Tenant** для нових ботів. +Створення нових мультитенантних ботів застаріло після 2025-07-31. Використовуйте **Single Tenant** для нових ботів. 3. Натисніть **Review + create** → **Create** (зачекайте ~1-2 хвилини) ### Крок 2: Отримайте облікові дані -1. Перейдіть до ресурсу Azure Bot → **Configuration** +1. Перейдіть до вашого ресурсу Azure Bot → **Configuration** 2. Скопіюйте **Microsoft App ID** → це ваш `appId` 3. Натисніть **Manage Password** → перейдіть до App Registration 4. У **Certificates & secrets** → **New client secret** → скопіюйте **Value** → це ваш `appPassword` @@ -247,9 +251,9 @@ teams app doctor ### Крок 3: Налаштуйте Messaging Endpoint 1. В Azure Bot → **Configuration** -2. Задайте **Messaging endpoint** як ваш webhook URL: +2. Задайте **Messaging endpoint** як URL вашого Webhook: - Production: `https://your-domain.com/api/messages` - - Локальна розробка: використовуйте tunnel (див. [Локальна розробка](#local-development-tunneling) нижче) + - Локальна розробка: використайте тунель (див. [Локальна розробка](#local-development-tunneling) нижче) ### Крок 4: Увімкніть канал Teams @@ -257,7 +261,7 @@ teams app doctor 2. Натисніть **Microsoft Teams** → Configure → Save 3. Прийміть Terms of Service -### Крок 5: Зберіть manifest застосунку Teams +### Крок 5: Зберіть маніфест застосунку Teams - Додайте запис `bot` з `botId = `. - Scopes: `personal`, `team`, `groupChat`. @@ -286,24 +290,24 @@ teams app doctor ### Крок 7: Запустіть Gateway -Канал Teams запускається автоматично, коли plugin доступний і існує конфігурація `msteams` з обліковими даними. +Канал Teams запускається автоматично, коли Plugin доступний і конфігурація `msteams` існує з обліковими даними.
-## Федеративна автентифікація (сертифікат плюс managed identity) +## Федеративна автентифікація (сертифікат плюс керована ідентичність) -> Додано у 2026.3.24 +> Додано у 2026.4.11 -Для production-розгортань OpenClaw підтримує **федеративну автентифікацію** як безпечнішу альтернативу client secrets. Доступні два методи: +Для production-розгортань OpenClaw підтримує **федеративну автентифікацію** як безпечнішу альтернативу клієнтським секретам. Доступні два методи: ### Варіант A: Автентифікація на основі сертифіката -Використовуйте PEM-сертифікат, зареєстрований у вашій реєстрації застосунку Entra ID. +Використайте PEM-сертифікат, зареєстрований у вашій реєстрації застосунку Entra ID. **Налаштування:** -1. Згенеруйте або отримайте сертифікат (формат PEM із private key). -2. В Entra ID → App Registration → **Certificates & secrets** → **Certificates** → завантажте public certificate. +1. Згенеруйте або отримайте сертифікат (PEM-формат із приватним ключем). +2. В Entra ID → App Registration → **Certificates & secrets** → **Certificates** → завантажте публічний сертифікат. **Конфігурація:** @@ -322,26 +326,26 @@ teams app doctor } ``` -**Env vars:** +**Змінні середовища:** - `MSTEAMS_AUTH_TYPE=federated` - `MSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem` ### Варіант B: Azure Managed Identity -Використовуйте Azure Managed Identity для автентифікації без пароля. Це ідеально для розгортань в інфраструктурі Azure (AKS, App Service, Azure VMs), де доступна managed identity. +Використовуйте Azure Managed Identity для автентифікації без пароля. Це ідеально для розгортань в інфраструктурі Azure (AKS, App Service, Azure VMs), де доступна керована ідентичність. **Як це працює:** -1. Pod/VM бота має managed identity (system-assigned або user-assigned). -2. **Federated identity credential** пов’язує managed identity з реєстрацією застосунку Entra ID. -3. Під час виконання OpenClaw використовує `@azure/identity` для отримання токенів з Azure IMDS endpoint (`169.254.169.254`). -4. Токен передається в Teams SDK для автентифікації бота. +1. Pod/VM бота має керовану ідентичність (system-assigned або user-assigned). +2. **Федеративні облікові дані ідентичності** зв’язують керовану ідентичність із реєстрацією застосунку Entra ID. +3. Під час виконання OpenClaw використовує `@azure/identity`, щоб отримувати токени з endpoint Azure IMDS (`169.254.169.254`). +4. Токен передається до Teams SDK для автентифікації бота. **Передумови:** -- Інфраструктура Azure з увімкненою managed identity (AKS workload identity, App Service, VM) -- Federated identity credential, створений у реєстрації застосунку Entra ID +- Інфраструктура Azure з увімкненою керованою ідентичністю (AKS workload identity, App Service, VM) +- Федеративні облікові дані ідентичності, створені в реєстрації застосунку Entra ID - Мережевий доступ до IMDS (`169.254.169.254:80`) з pod/VM **Конфігурація (system-assigned managed identity):** @@ -385,12 +389,12 @@ teams app doctor - `MSTEAMS_USE_MANAGED_IDENTITY=true` - `MSTEAMS_MANAGED_IDENTITY_CLIENT_ID=` (лише для призначеної користувачем) -### Налаштування ідентичності робочого навантаження AKS +### Налаштування AKS Workload Identity Для розгортань AKS, що використовують ідентичність робочого навантаження: -1. **Увімкніть ідентичність робочого навантаження** у своєму кластері AKS. -2. **Створіть облікові дані федеративної ідентичності** в реєстрації застосунку Entra ID: +1. **Увімкніть ідентичність робочого навантаження** у вашому кластері AKS. +2. **Створіть облікові дані федеративної ідентичності** для реєстрації застосунку Entra ID: ```bash az ad app federated-credential create --id --parameters '{ @@ -401,7 +405,7 @@ teams app doctor }' ``` -3. **Додайте анотацію до облікового запису служби Kubernetes** з ID клієнта застосунку: +3. **Додайте анотацію до сервісного облікового запису Kubernetes** з клієнтським ID застосунку: ```yaml apiVersion: v1 @@ -420,21 +424,21 @@ teams app doctor azure.workload.identity/use: "true" ``` -5. **Забезпечте мережевий доступ** до IMDS (`169.254.169.254`) — якщо використовується NetworkPolicy, додайте правило вихідного трафіку, яке дозволяє трафік до `169.254.169.254/32` на порту 80. +5. **Забезпечте мережевий доступ** до IMDS (`169.254.169.254`) — якщо використовуєте NetworkPolicy, додайте правило вихідного трафіку, що дозволяє трафік до `169.254.169.254/32` на порту 80. ### Порівняння типів автентифікації -| Метод | Конфігурація | Переваги | Недоліки | -| ---------------------- | --------------------------------------------- | ---------------------------------- | --------------------------------------------- | -| **Секрет клієнта** | `appPassword` | Просте налаштування | Потрібна ротація секретів, менш безпечно | -| **Сертифікат** | `authType: "federated"` + `certificatePath` | Немає спільного секрету в мережі | Накладні витрати на керування сертифікатами | -| **Керована ідентичність** | `authType: "federated"` + `useManagedIdentity` | Без паролів, немає секретів для керування | Потрібна інфраструктура Azure | +| Метод | Конфігурація | Переваги | Недоліки | +| ---------------------- | --------------------------------------------- | ------------------------------------- | ----------------------------------------------- | +| **Клієнтський секрет** | `appPassword` | Просте налаштування | Потрібна ротація секрету, менш безпечно | +| **Сертифікат** | `authType: "federated"` + `certificatePath` | Немає спільного секрету через мережу | Додаткове керування сертифікатами | +| **Керована ідентичність** | `authType: "federated"` + `useManagedIdentity` | Без паролів, не потрібно керувати секретами | Потрібна інфраструктура Azure | -**Поведінка за замовчуванням:** Коли `authType` не встановлено, OpenClaw за замовчуванням використовує автентифікацію через секрет клієнта. Наявні конфігурації продовжують працювати без змін. +**Поведінка за замовчуванням:** Якщо `authType` не задано, OpenClaw за замовчуванням використовує автентифікацію через клієнтський секрет. Наявні конфігурації продовжують працювати без змін. ## Локальна розробка (тунелювання) -Teams не може отримати доступ до `localhost`. Використовуйте постійний тунель розробки, щоб ваша URL-адреса залишалася незмінною між сеансами: +Teams не може звертатися до `localhost`. Використовуйте постійний dev-тунель, щоб ваша URL-адреса залишалася однаковою між сеансами: ```bash # One-time setup: @@ -447,7 +451,7 @@ devtunnel host my-openclaw-bot Альтернативи: `ngrok http 3978` або `tailscale funnel 3978` (URL-адреси можуть змінюватися в кожному сеансі). -Якщо URL-адреса вашого тунелю зміниться, оновіть endpoint: +Якщо URL-адреса вашого тунелю змінилася, оновіть endpoint: ```bash teams app update --endpoint "https:///api/messages" @@ -466,45 +470,45 @@ teams app doctor **Надішліть тестове повідомлення:** 1. Установіть застосунок Teams (скористайтеся посиланням для встановлення з `teams app get --install-link`) -2. Знайдіть бота в Teams і надішліть DM -3. Перевірте журнали Gateway на вхідну активність +2. Знайдіть бота в Teams і надішліть приватне повідомлення +3. Перевірте журнали Gateway на наявність вхідної активності ## Змінні середовища -Усі ключі конфігурації натомість можна встановити через змінні середовища: +Усі ключі конфігурації можна натомість задати через змінні середовища: - `MSTEAMS_APP_ID` - `MSTEAMS_APP_PASSWORD` - `MSTEAMS_TENANT_ID` - `MSTEAMS_AUTH_TYPE` (необов’язково: `"secret"` або `"federated"`) - `MSTEAMS_CERTIFICATE_PATH` (федеративна + сертифікат) -- `MSTEAMS_CERTIFICATE_THUMBPRINT` (необов’язково, не потрібно для автентифікації) +- `MSTEAMS_CERTIFICATE_THUMBPRINT` (необов’язково, не потрібне для автентифікації) - `MSTEAMS_USE_MANAGED_IDENTITY` (федеративна + керована ідентичність) - `MSTEAMS_MANAGED_IDENTITY_CLIENT_ID` (лише MI, призначена користувачем) ## Дія з інформацією про учасника -OpenClaw надає дію `member-info` на основі Graph для Microsoft Teams, щоб агенти й автоматизації могли отримувати відомості про учасників каналу (відображуване ім’я, email, роль) безпосередньо з Microsoft Graph. +OpenClaw надає дію `member-info` на основі Graph для Microsoft Teams, щоб агенти й автоматизації могли отримувати відомості про учасників каналу (відображуване ім’я, електронну пошту, роль) безпосередньо з Microsoft Graph. Вимоги: - Дозвіл RSC `Member.Read.Group` (уже є в рекомендованому маніфесті) - Для пошуків між командами: дозвіл Graph Application `User.Read.All` зі згодою адміністратора -Дія обмежується `channels.msteams.actions.memberInfo` (за замовчуванням: увімкнено, коли доступні облікові дані Graph). +Дію обмежує `channels.msteams.actions.memberInfo` (за замовчуванням: увімкнено, коли доступні облікові дані Graph). ## Контекст історії -- `channels.msteams.historyLimit` керує тим, скільки останніх повідомлень каналу/групи додається до промпта. -- Резервно використовується `messages.groupChat.historyLimit`. Установіть `0`, щоб вимкнути (за замовчуванням 50). -- Отримана історія потоку фільтрується за списками дозволених відправників (`allowFrom` / `groupAllowFrom`), тому початкове наповнення контексту потоку включає лише повідомлення від дозволених відправників. -- Контекст цитованих вкладень (`ReplyTo*`, отриманий із HTML-відповіді Teams) наразі передається в отриманому вигляді. -- Іншими словами, списки дозволених визначають, хто може запускати агента; сьогодні фільтруються лише окремі допоміжні шляхи контексту. -- Історію DM можна обмежити за допомогою `channels.msteams.dmHistoryLimit` (ходи користувача). Перевизначення для окремих користувачів: `channels.msteams.dms[""].historyLimit`. +- `channels.msteams.historyLimit` керує тим, скільки останніх повідомлень каналу/групи загортаються в prompt. +- Якщо не задано, використовується `messages.groupChat.historyLimit`. Установіть `0`, щоб вимкнути (за замовчуванням 50). +- Отримана історія thread фільтрується за списками дозволених відправників (`allowFrom` / `groupAllowFrom`), тому ініціалізація контексту thread включає лише повідомлення від дозволених відправників. +- Контекст цитованих вкладень (`ReplyTo*`, отриманий із HTML-відповіді Teams) наразі передається як отримано. +- Іншими словами, списки дозволених відправників визначають, хто може запускати агента; сьогодні фільтруються лише окремі додаткові шляхи контексту. +- Історію приватних повідомлень можна обмежити за допомогою `channels.msteams.dmHistoryLimit` (ходи користувача). Перевизначення для окремих користувачів: `channels.msteams.dms[""].historyLimit`. ## Поточні дозволи Teams RSC (маніфест) -Це **наявні resourceSpecific дозволи** в нашому маніфесті застосунку Teams. Вони застосовуються лише всередині команди/чату, де встановлено застосунок. +Це **наявні resourceSpecific дозволи** у нашому маніфесті застосунку Teams. Вони застосовуються лише всередині команди/чату, де встановлено застосунок. **Для каналів (область команди):** @@ -528,7 +532,7 @@ teams app rsc add ChannelMessage.Read.Group --type Application ## Приклад маніфесту Teams (відредаговано) -Мінімальний коректний приклад з обов’язковими полями. Замініть ID та URL-адреси. +Мінімальний дійсний приклад із потрібними полями. Замініть ID та URL-адреси. ```json5 { @@ -581,12 +585,12 @@ teams app rsc add ChannelMessage.Read.Group --type Application - `bots[].botId` **має** збігатися з Azure Bot App ID. - `webApplicationInfo.id` **має** збігатися з Azure Bot App ID. - `bots[].scopes` має включати поверхні, які ви плануєте використовувати (`personal`, `team`, `groupChat`). -- `bots[].supportsFiles: true` потрібен для обробки файлів в особистій області. -- `authorization.permissions.resourceSpecific` має включати читання/надсилання каналу, якщо вам потрібен трафік каналу. +- `bots[].supportsFiles: true` потрібне для обробки файлів в особистій області. +- `authorization.permissions.resourceSpecific` має включати читання/надсилання каналів, якщо вам потрібен трафік каналів. ### Оновлення наявного застосунку -Щоб оновити вже встановлений застосунок Teams (наприклад, щоб додати дозволи RSC): +Щоб оновити вже встановлений застосунок Teams (наприклад, додати дозволи RSC): ```bash # Download, edit, and re-upload the manifest @@ -596,77 +600,77 @@ teams app manifest upload manifest.json # Version is auto-bumped if content changed ``` -Після оновлення повторно встановіть застосунок у кожній команді, щоб нові дозволи набули чинності, і **повністю закрийте та перезапустіть Teams** (а не просто закрийте вікно), щоб очистити кешовані метадані застосунку. +Після оновлення перевстановіть застосунок у кожній команді, щоб нові дозволи набули чинності, і **повністю закрийте та перезапустіть Teams** (не просто закрийте вікно), щоб очистити кешовані метадані застосунку.
-Ручне оновлення маніфесту (без CLI) +Оновлення маніфесту вручну (без CLI) -1. Оновіть свій `manifest.json` новими налаштуваннями +1. Оновіть ваш `manifest.json` новими налаштуваннями 2. **Збільште поле `version`** (наприклад, `1.0.0` → `1.1.0`) -3. **Повторно заархівуйте** маніфест з іконками (`manifest.json`, `outline.png`, `color.png`) +3. **Повторно запакуйте в zip** маніфест з іконками (`manifest.json`, `outline.png`, `color.png`) 4. Завантажте новий zip: - - **Teams Admin Center:** застосунки Teams → керування застосунками → знайдіть свій застосунок → завантажити нову версію - - **Sideload:** у Teams → застосунки → керування своїми застосунками → завантажити власний застосунок + - **Teams Admin Center:** застосунки Teams → Керування застосунками → знайдіть ваш застосунок → Завантажити нову версію + - **Sideload:** у Teams → Застосунки → Керування вашими застосунками → Завантажити власний застосунок
## Можливості: лише RSC проти Graph -### З **лише Teams RSC** (застосунок встановлено, без дозволів Graph API) +### З **лише Teams RSC** (застосунок установлено, дозволів Graph API немає) Працює: -- Читання **текстового** вмісту повідомлення каналу. -- Надсилання **текстового** вмісту повідомлення каналу. -- Отримання файлових вкладень **особистих (DM)** повідомлень. +- Читання **текстового** вмісту повідомлень каналу. +- Надсилання **текстового** вмісту повідомлень каналу. +- Отримання файлових вкладень у **особистих (DM)** повідомленнях. -НЕ працює: +Не працює: -- **Зображення або вміст файлів** каналу/групи (payload містить лише HTML-заглушку). +- **Вміст зображень або файлів** у каналах/групах (payload містить лише HTML-заглушку). - Завантаження вкладень, збережених у SharePoint/OneDrive. -- Читання історії повідомлень (поза подією live Webhook). +- Читання історії повідомлень (поза live-подією Webhook). ### З **Teams RSC + дозволами Microsoft Graph Application** Додає: -- Завантаження розміщеного вмісту (зображень, вставлених у повідомлення). +- Завантаження hosted contents (зображень, вставлених у повідомлення). - Завантаження файлових вкладень, збережених у SharePoint/OneDrive. -- Читання історії повідомлень каналу/чату через Graph. +- Читання історії повідомлень каналів/чатів через Graph. ### RSC проти Graph API -| Можливість | Дозволи RSC | Graph API | -| ---------------------- | -------------------- | -------------------------------------- | +| Можливість | Дозволи RSC | Graph API | +| ----------------------- | -------------------- | -------------------------------------- | | **Повідомлення в реальному часі** | Так (через Webhook) | Ні (лише опитування) | | **Історичні повідомлення** | Ні | Так (можна запитувати історію) | -| **Складність налаштування** | Лише маніфест застосунку | Потрібні згода адміністратора + потік токена | -| **Працює офлайн** | Ні (має бути запущено) | Так (запит у будь-який час) | +| **Складність налаштування** | Лише маніфест застосунку | Потрібна згода адміністратора + token flow | +| **Працює офлайн** | Ні (має бути запущено) | Так (запит у будь-який час) | -**Підсумок:** RSC призначено для прослуховування в реальному часі; Graph API — для історичного доступу. Щоб наздогнати пропущені повідомлення під час офлайну, потрібен Graph API з `ChannelMessage.Read.All` (потребує згоди адміністратора). +**Підсумок:** RSC призначений для прослуховування в реальному часі; Graph API — для доступу до історії. Щоб наздогнати пропущені повідомлення під час офлайну, потрібен Graph API з `ChannelMessage.Read.All` (потрібна згода адміністратора). -## Медіа та історія через Graph (потрібно для каналів) +## Медіа й історія з увімкненим Graph (потрібно для каналів) Якщо вам потрібні зображення/файли в **каналах** або ви хочете отримувати **історію повідомлень**, потрібно ввімкнути дозволи Microsoft Graph і надати згоду адміністратора. -1. В Entra ID (Azure AD) **App Registration** додайте **Application permissions** Microsoft Graph: - - `ChannelMessage.Read.All` (вкладення каналу + історія) +1. У **реєстрації застосунку** Entra ID (Azure AD) додайте **дозволи Application** Microsoft Graph: + - `ChannelMessage.Read.All` (вкладення каналів + історія) - `Chat.Read.All` або `ChatMessage.Read.All` (групові чати) 2. **Надайте згоду адміністратора** для tenant. -3. Збільште **версію маніфесту** застосунку Teams, повторно завантажте його та **повторно встановіть застосунок у Teams**. +3. Збільште **версію маніфесту** застосунку Teams, повторно завантажте його та **перевстановіть застосунок у Teams**. 4. **Повністю закрийте та перезапустіть Teams**, щоб очистити кешовані метадані застосунку. -**Додатковий дозвіл для згадок користувачів:** @mentions користувачів працюють одразу для користувачів у розмові. Однак, якщо ви хочете динамічно шукати та згадувати користувачів, які **не перебувають у поточній розмові**, додайте дозвіл `User.Read.All` (Application) і надайте згоду адміністратора. +**Додатковий дозвіл для згадок користувачів:** User @mentions працюють одразу для користувачів у розмові. Однак, якщо ви хочете динамічно шукати й згадувати користувачів, яких **немає в поточній розмові**, додайте дозвіл `User.Read.All` (Application) і надайте згоду адміністратора. ## Відомі обмеження -### Таймаути Webhook +### Тайм-аути Webhook Teams доставляє повідомлення через HTTP Webhook. Якщо обробка триває занадто довго (наприклад, повільні відповіді LLM), ви можете побачити: -- Таймаути Gateway -- Повторне надсилання повідомлення Teams (що спричиняє дублікати) -- Втрачені відповіді +- Тайм-аути Gateway +- Teams повторно надсилає повідомлення (що спричиняє дублікати) +- Відкинуті відповіді OpenClaw обробляє це, швидко повертаючи відповідь і проактивно надсилаючи відповіді, але дуже повільні відповіді все одно можуть спричиняти проблеми. @@ -674,68 +678,68 @@ OpenClaw обробляє це, швидко повертаючи відпові Markdown у Teams обмеженіший, ніж у Slack або Discord: -- Базове форматування працює: **bold**, _italic_, `code`, links +- Базове форматування працює: **жирний**, _курсив_, `code`, посилання - Складний markdown (таблиці, вкладені списки) може відображатися некоректно -- Adaptive Cards підтримуються для опитувань і семантичних надсилань презентацій (див. нижче) +- Adaptive Cards підтримуються для опитувань і надсилання семантичних презентацій (див. нижче) ## Конфігурація -Ключові налаштування (див. `/gateway/configuration` для спільних шаблонів каналів): +Ключові налаштування (спільні шаблони каналів див. у `/gateway/configuration`): - `channels.msteams.enabled`: увімкнути/вимкнути канал. - `channels.msteams.appId`, `channels.msteams.appPassword`, `channels.msteams.tenantId`: облікові дані бота. -- `channels.msteams.webhook.port` (типово `3978`) -- `channels.msteams.webhook.path` (типово `/api/messages`) -- `channels.msteams.dmPolicy`: `pairing | allowlist | open | disabled` (типово: pairing) -- `channels.msteams.allowFrom`: список дозволених DM (рекомендовано AAD object IDs). Майстер під час налаштування перетворює імена на ID, коли доступний Graph. -- `channels.msteams.dangerouslyAllowNameMatching`: аварійний перемикач для повторного ввімкнення змінюваного зіставлення UPN/відображуваного імені та прямої маршрутизації за назвою команди/каналу. +- `channels.msteams.webhook.port` (за замовчуванням `3978`) +- `channels.msteams.webhook.path` (за замовчуванням `/api/messages`) +- `channels.msteams.dmPolicy`: `pairing | allowlist | open | disabled` (за замовчуванням: pairing) +- `channels.msteams.allowFrom`: allowlist для особистих повідомлень (рекомендовано AAD object IDs). Майстер під час налаштування зіставляє імена з ID, коли доступний Graph. +- `channels.msteams.dangerouslyAllowNameMatching`: аварійний перемикач для повторного ввімкнення змінного зіставлення за UPN/відображуваним іменем і прямої маршрутизації за назвою команди/каналу. - `channels.msteams.textChunkLimit`: розмір фрагмента вихідного тексту. -- `channels.msteams.chunkMode`: `length` (типово) або `newline`, щоб ділити за порожніми рядками (межами абзаців) перед фрагментацією за довжиною. -- `channels.msteams.mediaAllowHosts`: список дозволених хостів для вхідних вкладень (типово домени Microsoft/Teams). -- `channels.msteams.mediaAuthAllowHosts`: список дозволених хостів для додавання заголовків Authorization під час повторних спроб отримання медіа (типово хости Graph + Bot Framework). -- `channels.msteams.requireMention`: вимагати @mention у каналах/групах (типово true). +- `channels.msteams.chunkMode`: `length` (за замовчуванням) або `newline`, щоб розділяти за порожніми рядками (межами абзаців) перед поділом за довжиною. +- `channels.msteams.mediaAllowHosts`: allowlist для хостів вхідних вкладень (за замовчуванням домени Microsoft/Teams). +- `channels.msteams.mediaAuthAllowHosts`: allowlist для додавання заголовків Authorization під час повторних спроб медіа (за замовчуванням хости Graph + Bot Framework). +- `channels.msteams.requireMention`: вимагати @mention у каналах/групах (за замовчуванням true). - `channels.msteams.replyStyle`: `thread | top-level` (див. [Стиль відповіді](#reply-style-threads-vs-posts)). - `channels.msteams.teams..replyStyle`: перевизначення для окремої команди. - `channels.msteams.teams..requireMention`: перевизначення для окремої команди. -- `channels.msteams.teams..tools`: типові перевизначення політики інструментів для окремої команди (`allow`/`deny`/`alsoAllow`), які використовуються, коли немає перевизначення каналу. -- `channels.msteams.teams..toolsBySender`: типові перевизначення політики інструментів для окремої команди й відправника (підтримується шаблон `"*"`). +- `channels.msteams.teams..tools`: стандартні перевизначення політики інструментів для окремої команди (`allow`/`deny`/`alsoAllow`), які використовуються, коли перевизначення каналу відсутнє. +- `channels.msteams.teams..toolsBySender`: стандартні перевизначення політики інструментів для окремої команди й окремого відправника (підтримується wildcard `"*"`). - `channels.msteams.teams..channels..replyStyle`: перевизначення для окремого каналу. - `channels.msteams.teams..channels..requireMention`: перевизначення для окремого каналу. - `channels.msteams.teams..channels..tools`: перевизначення політики інструментів для окремого каналу (`allow`/`deny`/`alsoAllow`). -- `channels.msteams.teams..channels..toolsBySender`: перевизначення політики інструментів для окремого каналу й відправника (підтримується шаблон `"*"`). +- `channels.msteams.teams..channels..toolsBySender`: перевизначення політики інструментів для окремого каналу й окремого відправника (підтримується wildcard `"*"`). - Ключі `toolsBySender` мають використовувати явні префікси: `id:`, `e164:`, `username:`, `name:` (застарілі ключі без префікса все ще зіставляються лише з `id:`). -- `channels.msteams.actions.memberInfo`: увімкнути або вимкнути дію отримання інформації про учасника на основі Graph (типово: увімкнено, коли доступні облікові дані Graph). -- `channels.msteams.authType`: тип автентифікації — `"secret"` (типово) або `"federated"`. -- `channels.msteams.certificatePath`: шлях до файлу сертифіката PEM (федеративна автентифікація + автентифікація сертифікатом). +- `channels.msteams.actions.memberInfo`: увімкнути або вимкнути дію інформації про учасника на основі Graph (за замовчуванням: увімкнено, коли доступні облікові дані Graph). +- `channels.msteams.authType`: тип автентифікації — `"secret"` (за замовчуванням) або `"federated"`. +- `channels.msteams.certificatePath`: шлях до файлу PEM-сертифіката (федеративна автентифікація + автентифікація за сертифікатом). - `channels.msteams.certificateThumbprint`: відбиток сертифіката (необов’язково, не потрібен для автентифікації). -- `channels.msteams.useManagedIdentity`: увімкнути автентифікацію керованою ідентичністю (федеративний режим). -- `channels.msteams.managedIdentityClientId`: ID клієнта для керованої ідентичності, призначеної користувачем. -- `channels.msteams.sharePointSiteId`: ID сайту SharePoint для завантаження файлів у групових чатах/каналах (див. [Надсилання файлів у групових чатах](#sending-files-in-group-chats)). +- `channels.msteams.useManagedIdentity`: увімкнути автентифікацію через керовану ідентичність (федеративний режим). +- `channels.msteams.managedIdentityClientId`: client ID для user-assigned managed identity. +- `channels.msteams.sharePointSiteId`: SharePoint site ID для завантаження файлів у групових чатах/каналах (див. [Надсилання файлів у групових чатах](#sending-files-in-group-chats)). ## Маршрутизація та сеанси - Ключі сеансів відповідають стандартному формату агента (див. [/concepts/session](/uk/concepts/session)): - - Прямі повідомлення використовують спільний головний сеанс (`agent::`). - - Повідомлення каналів/груп використовують ID розмови: + - Особисті повідомлення спільно використовують головний сеанс (`agent::`). + - Повідомлення каналів/груп використовують conversation id: - `agent::msteams:channel:` - `agent::msteams:group:` -## Стиль відповіді: потоки проти дописів +## Стиль відповіді: гілки проти дописів -Teams нещодавно запровадив два стилі інтерфейсу каналів поверх однієї базової моделі даних: +Teams нещодавно запровадив два стилі інтерфейсу каналів поверх тієї самої базової моделі даних: -| Стиль | Опис | Рекомендований `replyStyle` | -| ------------------------ | --------------------------------------------------------- | --------------------------- | -| **Posts** (класичний) | Повідомлення відображаються як картки з гілками відповідей під ними | `thread` (типово) | -| **Threads** (як у Slack) | Повідомлення йдуть лінійно, більше схоже на Slack | `top-level` | +| Стиль | Опис | Рекомендований `replyStyle` | +| ------------------------ | --------------------------------------------------------- | ------------------------ | +| **Posts** (класичний) | Повідомлення відображаються як картки з гілковими відповідями під ними | `thread` (за замовчуванням) | +| **Threads** (як у Slack) | Повідомлення йдуть лінійно, більше схоже на Slack | `top-level` | **Проблема:** Teams API не показує, який стиль інтерфейсу використовує канал. Якщо використати неправильний `replyStyle`: -- `thread` у каналі зі стилем Threads → відповіді відображаються незручно вкладеними -- `top-level` у каналі зі стилем Posts → відповіді відображаються як окремі дописи верхнього рівня замість гілки +- `thread` у каналі зі стилем Threads → відповіді виглядають незручно вкладеними +- `top-level` у каналі зі стилем Posts → відповіді відображаються як окремі дописи верхнього рівня, а не в гілці -**Рішення:** Налаштуйте `replyStyle` для кожного каналу відповідно до того, як налаштовано канал: +**Рішення:** Налаштуйте `replyStyle` для кожного каналу залежно від того, як налаштовано канал: ```json5 { @@ -760,37 +764,37 @@ Teams нещодавно запровадив два стилі інтерфей **Поточні обмеження:** -- **DMs:** Зображення та файлові вкладення працюють через файлові API бота Teams. -- **Канали/групи:** Вкладення зберігаються в сховищі M365 (SharePoint/OneDrive). Навантаження Webhook містить лише HTML-заглушку, а не фактичні байти файлу. **Дозволи Graph API обов’язкові** для завантаження вкладень каналу. -- Для явних надсилань, де файл є основним, використовуйте `action=upload-file` з `media` / `filePath` / `path`; необов’язковий `message` стає супровідним текстом/коментарем, а `filename` перевизначає назву завантаженого файлу. +- **Особисті повідомлення:** Зображення та файлові вкладення працюють через файлові API бота Teams. +- **Канали/групи:** Вкладення зберігаються в сховищі M365 (SharePoint/OneDrive). Корисне навантаження Webhook містить лише HTML-заглушку, а не фактичні байти файлу. **Для завантаження вкладень каналів потрібні дозволи Graph API**. +- Для явного надсилання, де файл є основним вмістом, використовуйте `action=upload-file` з `media` / `filePath` / `path`; необов’язковий `message` стає супровідним текстом/коментарем, а `filename` перевизначає назву завантаженого файлу. -Без дозволів Graph повідомлення каналів із зображеннями отримуватимуться лише як текст (вміст зображення недоступний боту). -Типово OpenClaw завантажує медіа лише з імен хостів Microsoft/Teams. Перевизначте за допомогою `channels.msteams.mediaAllowHosts` (використайте `["*"]`, щоб дозволити будь-який хост). -Заголовки Authorization додаються лише для хостів у `channels.msteams.mediaAuthAllowHosts` (типово хости Graph + Bot Framework). Тримайте цей список суворим (уникайте багатотенантних суфіксів). +Без дозволів Graph повідомлення каналу із зображеннями будуть отримані лише як текст (вміст зображення недоступний боту). +За замовчуванням OpenClaw завантажує медіа лише з імен хостів Microsoft/Teams. Перевизначте через `channels.msteams.mediaAllowHosts` (використовуйте `["*"]`, щоб дозволити будь-який хост). +Заголовки Authorization додаються лише для хостів у `channels.msteams.mediaAuthAllowHosts` (за замовчуванням хости Graph + Bot Framework). Тримайте цей список суворим (уникайте суфіксів для кількох tenant). ## Надсилання файлів у групових чатах -Боти можуть надсилати файли в DMs за допомогою потоку FileConsentCard (вбудовано). Однак **надсилання файлів у групових чатах/каналах** потребує додаткового налаштування: +Боти можуть надсилати файли в особистих повідомленнях за допомогою потоку FileConsentCard (вбудовано). Однак **надсилання файлів у групових чатах/каналах** потребує додаткового налаштування: -| Контекст | Як надсилаються файли | Потрібне налаштування | -| ------------------------ | --------------------------------------------- | ---------------------------------------------- | -| **DMs** | FileConsentCard → користувач приймає → бот завантажує | Працює без додаткових налаштувань | -| **Групові чати/канали** | Завантаження в SharePoint → посилання для спільного доступу | Потрібні `sharePointSiteId` + дозволи Graph | -| **Зображення (будь-який контекст)** | Вбудовано у форматі Base64 | Працює без додаткових налаштувань | +| Контекст | Як надсилаються файли | Потрібне налаштування | +| ------------------------ | -------------------------------------------- | ----------------------------------------------- | +| **Особисті повідомлення** | FileConsentCard → користувач приймає → бот завантажує | Працює одразу | +| **Групові чати/канали** | Завантаження в SharePoint → поширення посилання | Потрібні `sharePointSiteId` + дозволи Graph | +| **Зображення (будь-який контекст)** | Inline у кодуванні Base64 | Працює одразу | ### Чому груповим чатам потрібен SharePoint -Боти не мають персонального диска OneDrive (кінцева точка Graph API `/me/drive` не працює для ідентичностей застосунків). Щоб надсилати файли в групові чати/канали, бот завантажує їх на **сайт SharePoint** і створює посилання для спільного доступу. +Боти не мають персонального диска OneDrive (endpoint Graph API `/me/drive` не працює для application identities). Щоб надсилати файли в групових чатах/каналах, бот завантажує їх на **сайт SharePoint** і створює посилання для спільного доступу. ### Налаштування 1. **Додайте дозволи Graph API** в Entra ID (Azure AD) → App Registration: - `Sites.ReadWrite.All` (Application) - завантаження файлів у SharePoint - - `Chat.Read.All` (Application) - необов’язково, вмикає посилання для спільного доступу на рівні користувачів + - `Chat.Read.All` (Application) - необов’язково, вмикає посилання для спільного доступу на рівні користувача -2. **Надайте згоду адміністратора** для тенанта. +2. **Надайте згоду адміністратора** для tenant. -3. **Отримайте ID свого сайту SharePoint:** +3. **Отримайте свій SharePoint site ID:** ```bash # Via Graph Explorer or curl with a valid token: @@ -819,40 +823,40 @@ Teams нещодавно запровадив два стилі інтерфей ### Поведінка спільного доступу -| Дозвіл | Поведінка спільного доступу | -| --------------------------------------- | --------------------------------------------------- | -| Лише `Sites.ReadWrite.All` | Посилання для всієї організації (доступ має будь-хто в організації) | -| `Sites.ReadWrite.All` + `Chat.Read.All` | Посилання для окремих користувачів (доступ мають лише учасники чату) | +| Дозвіл | Поведінка спільного доступу | +| --------------------------------------- | --------------------------------------------------------- | +| Лише `Sites.ReadWrite.All` | Посилання для спільного доступу в межах організації (доступ має будь-хто в організації) | +| `Sites.ReadWrite.All` + `Chat.Read.All` | Посилання для спільного доступу на рівні користувача (доступ мають лише учасники чату) | -Спільний доступ для окремих користувачів безпечніший, оскільки доступ до файлу мають лише учасники чату. Якщо дозволу `Chat.Read.All` немає, бот повертається до спільного доступу для всієї організації. +Спільний доступ на рівні користувача безпечніший, оскільки лише учасники чату можуть отримати доступ до файлу. Якщо дозволу `Chat.Read.All` немає, бот повертається до спільного доступу в межах організації. ### Резервна поведінка -| Сценарій | Результат | -| ------------------------------------------------ | -------------------------------------------------- | -| Груповий чат + файл + налаштований `sharePointSiteId` | Завантаження в SharePoint, надсилання посилання для спільного доступу | -| Груповий чат + файл + немає `sharePointSiteId` | Спроба завантаження в OneDrive (може не вдатися), надсилання лише тексту | -| Особистий чат + файл | Потік FileConsentCard (працює без SharePoint) | -| Будь-який контекст + зображення | Вбудовано у форматі Base64 (працює без SharePoint) | +| Сценарій | Результат | +| ------------------------------------------------- | -------------------------------------------------- | +| Груповий чат + файл + налаштований `sharePointSiteId` | Завантаження в SharePoint, надсилання посилання для спільного доступу | +| Груповий чат + файл + без `sharePointSiteId` | Спроба завантаження в OneDrive (може завершитися помилкою), надсилання лише тексту | +| Особистий чат + файл | Потік FileConsentCard (працює без SharePoint) | +| Будь-який контекст + зображення | Inline у кодуванні Base64 (працює без SharePoint) | ### Місце зберігання файлів -Завантажені файли зберігаються в папці `/OpenClawShared/` у типовій бібліотеці документів налаштованого сайту SharePoint. +Завантажені файли зберігаються в папці `/OpenClawShared/` у стандартній бібліотеці документів налаштованого сайту SharePoint. ## Опитування (Adaptive Cards) -OpenClaw надсилає опитування Teams як Adaptive Cards (нативного API опитувань Teams немає). +OpenClaw надсилає опитування Teams як Adaptive Cards (нативного Teams poll API немає). - CLI: `openclaw message poll --channel msteams --target conversation: ...` - Голоси записуються Gateway у `~/.openclaw/msteams-polls.json`. - Gateway має залишатися онлайн, щоб записувати голоси. -- Опитування поки що не публікують автоматично зведення результатів (за потреби перегляньте файл сховища). +- Опитування поки що не публікують підсумки результатів автоматично (за потреби перегляньте файл сховища). ## Картки презентацій -Надсилайте семантичні презентаційні навантаження користувачам або розмовам Teams за допомогою інструмента `message` або CLI. OpenClaw відображає їх як Teams Adaptive Cards із загального контракту презентацій. +Надсилайте семантичні презентаційні payload користувачам або розмовам Teams за допомогою інструмента `message` або CLI. OpenClaw відтворює їх як Teams Adaptive Cards із загального контракту презентацій. -Параметр `presentation` приймає семантичні блоки. Коли вказано `presentation`, текст повідомлення необов’язковий. +Параметр `presentation` приймає семантичні блоки. Коли надано `presentation`, текст повідомлення необов’язковий. **Інструмент агента:** @@ -882,12 +886,12 @@ openclaw message send --channel msteams \ Цілі MSTeams використовують префікси, щоб розрізняти користувачів і розмови: -| Тип цілі | Формат | Приклад | +| Тип цілі | Формат | Приклад | | ------------------- | -------------------------------- | --------------------------------------------------- | -| Користувач (за ID) | `user:` | `user:40a1a0ed-4ff2-4164-a219-55518990c197` | -| Користувач (за іменем) | `user:` | `user:John Smith` (потрібен Graph API) | -| Група/канал | `conversation:` | `conversation:19:abc123...@thread.tacv2` | -| Група/канал (raw) | `` | `19:abc123...@thread.tacv2` (якщо містить `@thread`) | +| Користувач (за ID) | `user:` | `user:40a1a0ed-4ff2-4164-a219-55518990c197` | +| Користувач (за іменем) | `user:` | `user:John Smith` (потрібен Graph API) | +| Група/канал | `conversation:` | `conversation:19:abc123...@thread.tacv2` | +| Група/канал (raw) | `` | `19:abc123...@thread.tacv2` (якщо містить `@thread`) | **Приклади CLI:** @@ -930,17 +934,17 @@ openclaw message send --channel msteams --target "conversation:19:abc...@thread. ``` -Без префікса `user:` імена за замовчуванням визначаються як групи або команди. Завжди використовуйте `user:`, коли адресуєте повідомлення людям за відображуваним іменем. +Без префікса `user:` імена за замовчуванням розпізнаються як групи або команди. Завжди використовуйте `user:`, коли націлюєтеся на людей за відображуваним іменем. -## Проактивні повідомлення +## Проактивний обмін повідомленнями -- Проактивні повідомлення можливі лише **після** того, як користувач уже взаємодіяв, бо саме тоді ми зберігаємо посилання на розмову. -- Див. `/gateway/configuration` щодо `dmPolicy` і контролю через список дозволених. +- Проактивні повідомлення можливі лише **після** взаємодії користувача, оскільки в цей момент ми зберігаємо посилання на розмову. +- Див. `/gateway/configuration` щодо `dmPolicy` і керування списком дозволених. ## Ідентифікатори команд і каналів (поширена пастка) -Параметр запиту `groupId` в URL Teams **НЕ** є ідентифікатором команди, який використовується для конфігурації. Натомість витягуйте ідентифікатори зі шляху URL: +Параметр запиту `groupId` в URL Teams **НЕ** є ідентифікатором команди, який використовується для конфігурації. Натомість витягайте ідентифікатори зі шляху URL: **URL команди:** @@ -960,66 +964,66 @@ https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?gr **Для конфігурації:** -- Team ID = сегмент шляху після `/team/` (URL-декодований, наприклад, `19:Bk4j...@thread.tacv2`) -- Channel ID = сегмент шляху після `/channel/` (URL-декодований) +- Ідентифікатор команди = сегмент шляху після `/team/` (URL-декодований, наприклад, `19:Bk4j...@thread.tacv2`) +- Ідентифікатор каналу = сегмент шляху після `/channel/` (URL-декодований) - **Ігноруйте** параметр запиту `groupId` ## Приватні канали Боти мають обмежену підтримку в приватних каналах: -| Функція | Стандартні канали | Приватні канали | -| ---------------------------- | ----------------- | --------------------------- | -| Встановлення бота | Так | Обмежено | -| Повідомлення в реальному часі (webhook) | Так | Може не працювати | -| Дозволи RSC | Так | Можуть поводитися інакше | -| @згадки | Так | Якщо бот доступний | -| Історія Graph API | Так | Так (за наявності дозволів) | +| Функція | Стандартні канали | Приватні канали | +| ---------------------------- | ----------------- | ------------------------------- | +| Встановлення бота | Так | Обмежено | +| Повідомлення в реальному часі (webhook) | Так | Може не працювати | +| Дозволи RSC | Так | Можуть поводитися інакше | +| @згадки | Так | Якщо бот доступний | +| Історія Graph API | Так | Так (за наявності дозволів) | **Обхідні рішення, якщо приватні канали не працюють:** 1. Використовуйте стандартні канали для взаємодії з ботом -2. Використовуйте особисті повідомлення - користувачі завжди можуть писати боту напряму +2. Використовуйте DM - користувачі завжди можуть написати боту напряму 3. Використовуйте Graph API для доступу до історії (потрібен `ChannelMessage.Read.All`) ## Усунення несправностей ### Поширені проблеми -- **Зображення не відображаються в каналах:** відсутні дозволи Graph або згода адміністратора. Перевстановіть застосунок Teams і повністю закрийте та знову відкрийте Teams. -- **Немає відповідей у каналі:** згадки потрібні за замовчуванням; задайте `channels.msteams.requireMention=false` або налаштуйте окремо для команди/каналу. -- **Невідповідність версії (Teams досі показує старий маніфест):** видаліть і повторно додайте застосунок, а потім повністю закрийте Teams, щоб оновити стан. -- **401 Unauthorized від webhook:** очікувано під час ручного тестування без Azure JWT - означає, що endpoint доступний, але автентифікація не пройшла. Для коректного тестування використовуйте Azure Web Chat. +- **Зображення не відображаються в каналах:** відсутні дозволи Graph або згода адміністратора. Перевстановіть застосунок Teams і повністю закрийте/знову відкрийте Teams. +- **Немає відповідей у каналі:** за замовчуванням потрібні згадки; встановіть `channels.msteams.requireMention=false` або налаштуйте окремо для команди/каналу. +- **Невідповідність версії (Teams усе ще показує старий маніфест):** видаліть і повторно додайте застосунок, а потім повністю закрийте Teams, щоб оновити дані. +- **401 Unauthorized від webhook:** очікувано під час ручного тестування без Azure JWT - це означає, що кінцева точка доступна, але автентифікація не вдалася. Використовуйте Azure Web Chat для коректного тестування. ### Помилки завантаження маніфесту -- **"Icon file cannot be empty":** маніфест посилається на файли іконок розміром 0 байтів. Створіть дійсні PNG-іконки (32x32 для `outline.png`, 192x192 для `color.png`). -- **"webApplicationInfo.Id already in use":** застосунок досі встановлений в іншій команді/чаті. Спочатку знайдіть і видаліть його або зачекайте 5-10 хвилин на поширення змін. -- **"Something went wrong" під час завантаження:** натомість завантажте через [https://admin.teams.microsoft.com](https://admin.teams.microsoft.com), відкрийте DevTools браузера (F12) → вкладку Network і перевірте тіло відповіді, щоб побачити фактичну помилку. +- **"Icon file cannot be empty":** маніфест посилається на файли піктограм розміром 0 байтів. Створіть коректні PNG-піктограми (32x32 для `outline.png`, 192x192 для `color.png`). +- **"webApplicationInfo.Id already in use":** застосунок усе ще встановлено в іншій команді/чаті. Спочатку знайдіть і видаліть його або зачекайте 5-10 хвилин на поширення змін. +- **"Something went wrong" під час завантаження:** натомість завантажте через [https://admin.teams.microsoft.com](https://admin.teams.microsoft.com), відкрийте DevTools браузера (F12) → вкладку Network і перевірте тіло відповіді на фактичну помилку. - **Sideload не вдається:** спробуйте "Upload an app to your org's app catalog" замість "Upload a custom app" - це часто обходить обмеження sideload. ### Дозволи RSC не працюють -1. Перевірте, що `webApplicationInfo.id` точно збігається з App ID вашого бота +1. Переконайтеся, що `webApplicationInfo.id` точно збігається з App ID вашого бота 2. Повторно завантажте застосунок і перевстановіть його в команді/чаті 3. Перевірте, чи адміністратор вашої організації не заблокував дозволи RSC 4. Підтвердьте, що використовуєте правильну область: `ChannelMessage.Read.Group` для команд, `ChatMessage.Read.Chat` для групових чатів ## Посилання -- [Створення Azure Bot](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - посібник із налаштування Azure Bot -- [Teams Developer Portal](https://dev.teams.microsoft.com/apps) - створення та керування застосунками Teams +- [Створити Azure Bot](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - посібник із налаштування Azure Bot +- [Портал розробника Teams](https://dev.teams.microsoft.com/apps) - створення й керування застосунками Teams - [Схема маніфесту застосунку Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema) -- [Отримання повідомлень каналу через RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-messages-with-rsc) +- [Отримання повідомлень каналу за допомогою RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-messages-with-rsc) - [Довідник дозволів RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent) -- [Обробка файлів ботом Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (для каналу/групи потрібен Graph) -- [Проактивні повідомлення](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages) -- [@microsoft/teams.cli](https://www.npmjs.com/package/@microsoft/teams.cli) - Teams CLI для керування ботами +- [Обробка файлів ботом Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (канал/група потребує Graph) +- [Проактивний обмін повідомленнями](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages) +- [@microsoft/teams.cli](https://www.npmjs.com/package/@microsoft/teams.cli) - Teams CLI для керування ботом ## Пов’язане - [Огляд каналів](/uk/channels) — усі підтримувані канали -- [Сполучення](/uk/channels/pairing) — автентифікація через DM і процес сполучення -- [Групи](/uk/channels/groups) — поведінка групового чату та контроль через згадки -- [Маршрутизація каналів](/uk/channels/channel-routing) — маршрутизація сесій для повідомлень -- [Безпека](/uk/gateway/security) — модель доступу та посилення захисту +- [Сполучення](/uk/channels/pairing) — автентифікація DM і процес сполучення +- [Групи](/uk/channels/groups) — поведінка групового чату та керування згадками +- [Маршрутизація каналів](/uk/channels/channel-routing) — маршрутизація сеансів для повідомлень +- [Безпека](/uk/gateway/security) — модель доступу та зміцнення безпеки diff --git a/docs/uk/concepts/memory-qmd.md b/docs/uk/concepts/memory-qmd.md index c5208fdc2..17d4e67c2 100644 --- a/docs/uk/concepts/memory-qmd.md +++ b/docs/uk/concepts/memory-qmd.md @@ -1,31 +1,31 @@ --- read_when: - Ви хочете налаштувати QMD як бекенд пам’яті - - Вам потрібні розширені функції пам’яті, як-от переранжування або додаткові індексовані шляхи + - Вам потрібні розширені функції пам’яті, як-от повторне ранжування або додаткові індексовані шляхи summary: Локально-орієнтований пошуковий сайдкар із BM25, векторами, повторним ранжуванням і розширенням запитів title: Рушій пам’яті QMD x-i18n: - generated_at: "2026-04-29T07:17:52Z" + generated_at: "2026-04-29T07:52:05Z" model: gpt-5.5 provider: openai - source_hash: 4932e1fdf6aaecb1c97de3a7111d0447ae15d44db1e3f6aefe106e765070b5e4 + source_hash: 71980e3701f9a5ddcfbbfa41497ef51d2aae2993b2326591124cc0a87f9a849f source_path: concepts/memory-qmd.md workflow: 16 --- -[QMD](https://github.com/tobi/qmd) — це локально-орієнтований пошуковий сайдкар, який працює -поруч з OpenClaw. Він поєднує BM25, векторний пошук і переранжування в одному -виконуваному файлі та може індексувати вміст поза файлами пам'яті вашого робочого простору. +[QMD](https://github.com/tobi/qmd) — це локальний пошуковий sidecar, який працює +поруч з OpenClaw. Він поєднує BM25, векторний пошук і reranking в одному +бінарному файлі та може індексувати вміст за межами файлів пам’яті вашого робочого простору. ## Що він додає порівняно з вбудованим -- **Переранжування та розширення запиту** для кращої повноти пошуку. +- **Reranking і розширення запитів** для кращого охоплення. - **Індексування додаткових каталогів** -- документація проєкту, нотатки команди, будь-що на диску. -- **Індексування стенограм сесій** -- пригадування попередніх розмов. -- **Повністю локальний** -- працює з додатковим пакетом середовища виконання node-llama-cpp і +- **Індексування транскриптів сесій** -- пригадування попередніх розмов. +- **Повністю локальний** -- працює з опційним пакетом runtime node-llama-cpp і автоматично завантажує моделі GGUF. -- **Автоматичний резервний варіант** -- якщо QMD недоступний, OpenClaw непомітно перемикається на - вбудований рушій. +- **Автоматичний fallback** -- якщо QMD недоступний, OpenClaw безшовно повертається до + вбудованого рушія. ## Початок роботи @@ -47,67 +47,70 @@ x-i18n: ``` OpenClaw створює самодостатній домашній каталог QMD у -`~/.openclaw/agents//qmd/` і автоматично керує життєвим циклом сайдкара --- колекції, оновлення та запуски створення ембедингів обробляються за вас. -Він віддає перевагу поточним формам колекцій QMD і запитів MCP, але за потреби -все ще відступає до альтернативних прапорців шаблонів колекцій і старіших назв -інструментів MCP. Узгодження під час запуску також відтворює застарілі керовані -колекції назад до їхніх канонічних шаблонів, коли старіша колекція QMD з тією -самою назвою все ще присутня. +`~/.openclaw/agents//qmd/` і автоматично керує життєвим циклом sidecar: +колекції, оновлення та запуски embedding обробляються за вас. +Він віддає перевагу поточним формам колекцій QMD і MCP-запитів, але за потреби +все ще повертається до альтернативних прапорців шаблонів колекцій і старіших назв інструментів MCP. +Узгодження під час завантаження також відтворює застарілі керовані колекції до їхніх +канонічних шаблонів, коли старіша колекція QMD з такою самою назвою все ще +присутня. -## Як працює сайдкар +## Як працює sidecar -- OpenClaw створює колекції з файлів пам'яті вашого робочого простору та будь-яких - налаштованих `memory.qmd.paths`, потім запускає `qmd update` під час запуску і - періодично (типово кожні 5 хвилин). Ці оновлення виконуються через підпроцеси - QMD, а не через внутрішнє сканування файлової системи в процесі. Семантичні +- OpenClaw створює колекції з файлів пам’яті вашого робочого простору та будь-яких + налаштованих `memory.qmd.paths`, а потім запускає `qmd update`, коли менеджер QMD + відкривається, і періодично після цього (типово кожні 5 хвилин). Ці оновлення + виконуються через subprocess QMD, а не через сканування файлової системи всередині процесу. Семантичні режими також запускають `qmd embed`. - Типова колекція робочого простору відстежує `MEMORY.md` плюс дерево `memory/`. - `memory.md` у нижньому регістрі не індексується як кореневий файл пам'яті. -- Власний сканер QMD ігнорує приховані шляхи та поширені каталоги залежностей і - збірки, як-от `.git`, `.cache`, `node_modules`, `vendor`, `dist` і `build`. - Оновлення під час запуску використовують одноразовий шлях підпроцесу QMD замість - створення повного довготривалого внутрішньопроцесного спостерігача під час запуску Gateway. -- Оновлення під час запуску виконується у фоні, тож запуск чату не блокується. -- Пошук використовує налаштований `searchMode` (типово: `search`; також підтримує - `vsearch` і `query`). `search` працює лише з BM25, тому OpenClaw пропускає - перевірки готовності семантичних векторів і обслуговування ембедингів у цьому режимі. - Якщо режим зазнає помилки, OpenClaw повторює спробу з `qmd query`. -- З випусками QMD, які оголошують фільтри для кількох колекцій, OpenClaw групує + Нижній регістр `memory.md` не індексується як кореневий файл пам’яті. +- Власний сканер QMD ігнорує приховані шляхи та поширені каталоги залежностей/збірки, + такі як `.git`, `.cache`, `node_modules`, `vendor`, `dist` і + `build`. Запуск Gateway типово не ініціалізує QMD, тому cold boot + уникає імпорту runtime пам’яті або створення довготривалого watcher до того, + як пам’ять уперше буде використана. +- Якщо все ж потрібне оновлення під час запуску Gateway, установіть + `memory.qmd.update.startup` на `idle` або `immediate`. Це opt-in оновлення під час запуску + використовує одноразовий шлях subprocess QMD замість створення повного + довготривалого in-process watcher. +- Пошуки використовують налаштований `searchMode` (типово: `search`; також підтримує + `vsearch` і `query`). `search` є лише BM25, тому OpenClaw пропускає семантичні + перевірки готовності векторів і підтримку embedding у цьому режимі. Якщо режим + завершується помилкою, OpenClaw повторює спробу з `qmd query`. +- Із випусками QMD, які оголошують фільтри для кількох колекцій, OpenClaw групує колекції з одного джерела в один виклик пошуку QMD. Старіші випуски QMD - зберігають сумісний резервний варіант для окремих колекцій. -- Якщо QMD повністю не спрацьовує, OpenClaw повертається до вбудованого рушія SQLite. - Повторні спроби під час ходу чату ненадовго відкладаються після помилки відкриття, - щоб відсутній виконуваний файл або зламана залежність сайдкара не створювали - шторм повторних спроб; `openclaw memory status` і одноразові CLI-перевірки все ще - перевіряють QMD напряму. + зберігають сумісний fallback для окремих колекцій. +- Якщо QMD повністю завершується помилкою, OpenClaw повертається до вбудованого рушія SQLite. + Повторні спроби під час чат-ходів ненадовго відступають після помилки відкриття, щоб + відсутній бінарний файл або зламана залежність sidecar не створювали шквал повторів; + `openclaw memory status` і одноразові CLI probes усе ще перевіряють QMD напряму. -Перший пошук може бути повільним -- QMD автоматично завантажує моделі GGUF (~2 ГБ) для -переранжування та розширення запиту під час першого запуску `qmd query`. +Перший пошук може бути повільним -- QMD автоматично завантажує моделі GGUF (~2 GB) для +reranking і розширення запитів під час першого запуску `qmd query`. ## Продуктивність пошуку та сумісність -OpenClaw зберігає шлях пошуку QMD сумісним як з поточними, так і зі старішими -встановленнями QMD. +OpenClaw підтримує шлях пошуку QMD сумісним як з поточними, так і зі старішими +інсталяціями QMD. -Під час запуску OpenClaw один раз для кожного менеджера перевіряє довідковий текст -установленого QMD. Якщо виконуваний файл оголошує підтримку фільтрів кількох -колекцій, OpenClaw шукає в усіх колекціях з одного джерела однією командою: +Під час запуску OpenClaw один раз на менеджер перевіряє довідковий текст установленого QMD. Якщо +бінарний файл оголошує підтримку кількох фільтрів колекцій, OpenClaw шукає в усіх +колекціях з одного джерела однією командою: ```bash qmd search "router notes" --json -n 10 -c memory-root-main -c memory-dir-main ``` -Це уникає запуску окремого підпроцесу QMD для кожної колекції довготривалої -пам'яті. Колекції стенограм сесій залишаються у власній групі джерела, тому змішані -пошуки `memory` + `sessions` усе ще дають диверсифікатору результатів вхідні дані -з обох джерел. +Це уникає запуску окремого subprocess QMD для кожної колекції durable-memory. +Колекції транскриптів сесій залишаються у власній групі джерел, тому змішані +пошуки `memory` + `sessions` усе ще передають diversifier результатів вхідні дані з обох +джерел. Старіші збірки QMD приймають лише один фільтр колекції. Коли OpenClaw виявляє одну -з таких збірок, він зберігає шлях сумісності та шукає кожну колекцію окремо перед -об'єднанням і дедуплікацією результатів. +з таких збірок, він зберігає шлях сумісності та шукає в кожній колекції +окремо, перш ніж об’єднати результати й видалити дублікати. Щоб вручну перевірити встановлений контракт, виконайте: @@ -115,13 +118,13 @@ qmd search "router notes" --json -n 10 -c memory-root-main -c memory-dir-main qmd --help | grep -i collection ``` -Поточна довідка QMD каже, що фільтри колекцій можуть націлюватися на одну або -кілька колекцій. Старіша довідка зазвичай описує одну колекцію. +Поточна довідка QMD каже, що фільтри колекцій можуть націлюватися на одну або більше колекцій. +Старіша довідка зазвичай описує одну колекцію. ## Перевизначення моделей -Змінні середовища моделей QMD передаються без змін із процесу Gateway, тож ви -можете налаштовувати QMD глобально без додавання нової конфігурації OpenClaw: +Змінні середовища моделей QMD передаються без змін із процесу Gateway, +тож ви можете налаштовувати QMD глобально без додавання нової конфігурації OpenClaw: ```bash export QMD_EMBED_MODEL="hf:Qwen/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf" @@ -129,7 +132,7 @@ export QMD_RERANK_MODEL="/absolute/path/to/reranker.gguf" export QMD_GENERATE_MODEL="/absolute/path/to/generator.gguf" ``` -Після зміни моделі ембедингів повторно запустіть ембединги, щоб індекс відповідав +Після зміни моделі embedding повторно запустіть embeddings, щоб індекс відповідав новому векторному простору. ## Індексування додаткових шляхів @@ -147,11 +150,11 @@ export QMD_GENERATE_MODEL="/absolute/path/to/generator.gguf" } ``` -Фрагменти з додаткових шляхів відображаються як `qmd//` у -результатах пошуку. `memory_get` розуміє цей префікс і читає з правильного кореня -колекції. +Фрагменти з додаткових шляхів з’являються як `qmd//` у +результатах пошуку. `memory_get` розуміє цей префікс і читає з правильного +кореня колекції. -## Індексування стенограм сесій +## Індексування транскриптів сесій Увімкніть індексування сесій, щоб пригадувати попередні розмови: @@ -166,12 +169,12 @@ export QMD_GENERATE_MODEL="/absolute/path/to/generator.gguf" } ``` -Стенограми експортуються як очищені ходи User/Assistant у спеціальну колекцію QMD +Транскрипти експортуються як очищені ходи User/Assistant у спеціальну колекцію QMD під `~/.openclaw/agents//qmd/sessions/`. ## Область пошуку -Типово результати пошуку QMD показуються у прямих і канальних сесіях +Типово результати пошуку QMD показуються в прямих і канальних сесіях (не в групах). Налаштуйте `memory.qmd.scope`, щоб змінити це: ```json5 @@ -193,30 +196,30 @@ export QMD_GENERATE_MODEL="/absolute/path/to/generator.gguf" ## Цитування Коли `memory.citations` має значення `auto` або `on`, фрагменти пошуку містять -нижній колонтитул `Source: `. Установіть `memory.citations = "off"`, щоб -прибрати нижній колонтитул, усе ще передаючи шлях агенту внутрішньо. +footer `Source: `. Установіть `memory.citations = "off"`, щоб пропустити footer, +але все одно передавати шлях агенту внутрішньо. ## Коли використовувати -Вибирайте QMD, коли вам потрібно: +Оберіть QMD, коли вам потрібні: -- Переранжування для якісніших результатів. +- Reranking для якісніших результатів. - Пошук у документації проєкту або нотатках поза робочим простором. -- Пригадування розмов із минулих сесій. +- Пригадування минулих розмов сесій. - Повністю локальний пошук без API-ключів. -Для простіших налаштувань [вбудований рушій](/uk/concepts/memory-builtin) добре -працює без додаткових залежностей. +Для простіших налаштувань [вбудований рушій](/uk/concepts/memory-builtin) добре працює +без додаткових залежностей. ## Усунення несправностей -**QMD не знайдено?** Переконайтеся, що виконуваний файл є в `PATH` Gateway. Якщо OpenClaw -працює як сервіс, створіть символічне посилання: +**QMD не знайдено?** Переконайтеся, що бінарний файл є в `PATH` Gateway. Якщо OpenClaw +працює як сервіс, створіть symlink: `sudo ln -s ~/.bun/bin/qmd /usr/local/bin/qmd`. Якщо `qmd --version` працює у вашій оболонці, але OpenClaw усе ще повідомляє `spawn qmd ENOENT`, процес Gateway, імовірно, має інший `PATH`, ніж ваша -інтерактивна оболонка. Закріпіть виконуваний файл явно: +інтерактивна оболонка. Явно закріпіть бінарний файл: ```json5 { @@ -229,49 +232,47 @@ export QMD_GENERATE_MODEL="/absolute/path/to/generator.gguf" } ``` -Використайте `command -v qmd` у середовищі, де встановлено QMD, потім повторно -перевірте за допомогою `openclaw memory status --deep`. +Використайте `command -v qmd` у середовищі, де встановлено QMD, а потім повторно перевірте +через `openclaw memory status --deep`. -**Перший пошук дуже повільний?** QMD завантажує моделі GGUF під час першого -використання. Попередньо прогрійте його за допомогою `qmd query "test"`, використовуючи -ті самі каталоги XDG, що й OpenClaw. +**Перший пошук дуже повільний?** QMD завантажує моделі GGUF під час першого використання. Попередньо прогрійте +через `qmd query "test"` із тими самими каталогами XDG, які використовує OpenClaw. -**Багато підпроцесів QMD під час пошуку?** Оновіть QMD, якщо можливо. OpenClaw -використовує один процес для пошуків у кількох колекціях з одного джерела лише -тоді, коли встановлений QMD оголошує підтримку кількох фільтрів `-c`; інакше він -зберігає старіший резервний варіант для окремих колекцій заради коректності. +**Багато subprocess QMD під час пошуку?** Оновіть QMD, якщо можливо. OpenClaw використовує +один процес для пошуків у кількох колекціях з одного джерела лише тоді, коли встановлений +QMD оголошує підтримку кількох фільтрів `-c`; інакше він зберігає старіший +fallback для окремих колекцій задля коректності. -**QMD лише з BM25 все ще намагається зібрати llama.cpp?** Установіть +**QMD лише BM25 усе ще намагається зібрати llama.cpp?** Установіть `memory.qmd.searchMode = "search"`. OpenClaw розглядає цей режим як лише лексичний, -не запускає перевірки стану векторів QMD або обслуговування ембедингів і залишає -перевірки семантичної готовності для налаштувань `vsearch` або `query`. +не запускає перевірки статусу векторів QMD або підтримку embedding і залишає +семантичні перевірки готовності для налаштувань `vsearch` або `query`. **Пошук завершується за тайм-аутом?** Збільште `memory.qmd.limits.timeoutMs` (типово: 4000ms). Установіть `120000` для повільнішого обладнання. -**Порожні результати в групових чатах?** Перевірте `memory.qmd.scope` -- типово -дозволені лише прямі та канальні сесії. +**Порожні результати в групових чатах?** Перевірте `memory.qmd.scope` -- типово дозволено лише +прямі та канальні сесії. -**Пошук у кореневій пам'яті раптом став надто широким?** Перезапустіть Gateway або -дочекайтеся наступного узгодження під час запуску. OpenClaw відтворює застарілі -керовані колекції назад до канонічних шаблонів `MEMORY.md` і `memory/`, коли -виявляє конфлікт з однаковою назвою. +**Пошук кореневої пам’яті раптом став занадто широким?** Перезапустіть Gateway або дочекайтеся +наступного узгодження під час запуску. OpenClaw відтворює застарілі керовані колекції +назад до канонічних шаблонів `MEMORY.md` і `memory/`, коли виявляє конфлікт +з однаковою назвою. -**Тимчасові репозиторії, видимі з робочого простору, спричиняють `ENAMETOOLONG` або зламане індексування?** -Обхід QMD наразі відповідає поведінці базового сканера QMD, а не вбудованим -правилам символічних посилань OpenClaw. Тримайте тимчасові checkout монорепозиторіїв -у прихованих каталогах на кшталт `.tmp/` або поза індексованими коренями QMD, -доки QMD не надасть безпечний щодо циклів обхід або явні засоби керування -виключеннями. +**Тимчасові репозиторії, видимі в робочому просторі, спричиняють `ENAMETOOLONG` або зламане індексування?** +Обхід QMD наразі дотримується поведінки базового сканера QMD, а не +вбудованих правил symlink OpenClaw. Тримайте тимчасові checkout монорепозиторіїв у +прихованих каталогах на кшталт `.tmp/` або поза індексованими коренями QMD, доки QMD не надасть +cycle-safe traversal або явні controls виключення. ## Конфігурація Повну поверхню конфігурації (`memory.qmd.*`), режими пошуку, інтервали оновлення, правила області та всі інші параметри дивіться в -[довіднику конфігурації пам'яті](/uk/reference/memory-config). +[довіднику конфігурації пам’яті](/uk/reference/memory-config). -## Пов'язане +## Пов’язане -- [Огляд пам'яті](/uk/concepts/memory) -- [Вбудований рушій пам'яті](/uk/concepts/memory-builtin) -- [Пам'ять Honcho](/uk/concepts/memory-honcho) +- [Огляд пам’яті](/uk/concepts/memory) +- [Вбудований рушій пам’яті](/uk/concepts/memory-builtin) +- [Пам’ять Honcho](/uk/concepts/memory-honcho) diff --git a/docs/uk/reference/memory-config.md b/docs/uk/reference/memory-config.md index d1541def3..70286f471 100644 --- a/docs/uk/reference/memory-config.md +++ b/docs/uk/reference/memory-config.md @@ -1,64 +1,64 @@ --- read_when: - - Ви хочете налаштувати провайдерів пошуку в пам’яті або моделі ембедингів + - Ви хочете налаштувати постачальників пошуку в пам’яті або моделі вбудовувань - Ви хочете налаштувати бекенд QMD - Ви хочете налаштувати гібридний пошук, MMR або часове згасання - - Ви хочете увімкнути мультимодальне індексування пам’яті + - Ви хочете увімкнути індексацію мультимодальної пам’яті sidebarTitle: Memory config summary: Усі параметри конфігурації для пошуку в пам’яті, постачальників ембедингів, QMD, гібридного пошуку та мультимодального індексування title: Довідник із конфігурації пам’яті x-i18n: - generated_at: "2026-04-29T07:18:03Z" + generated_at: "2026-04-29T07:52:14Z" model: gpt-5.5 provider: openai - source_hash: d076cd1c34ac3cee45cb17633b06a79f87ba4da922e6a141409585258a28e355 + source_hash: fbb21d407f7ec9ef76e68c268138892b12568137735b723579703e535d34b195 source_path: reference/memory-config.md workflow: 16 --- -Ця сторінка перелічує всі параметри конфігурації для пошуку пам’яті OpenClaw. Концептуальні огляди дивіться тут: +На цій сторінці перелічено всі параметри конфігурації для пошуку памʼяті OpenClaw. Концептуальні огляди див.: - - Як працює пам’ять. + + Як працює памʼять. - + Типовий бекенд SQLite. - - Локальний допоміжний процес. + + Локальний sidecar. - - Конвеєр пошуку й налаштування. + + Конвеєр пошуку та налаштування. - - Під-агент пам’яті для інтерактивних сеансів. + + Під-агент памʼяті для інтерактивних сеансів. -Усі налаштування пошуку пам’яті розташовані в `agents.defaults.memorySearch` у `openclaw.json`, якщо не зазначено інше. +Усі налаштування пошуку памʼяті розташовані в `agents.defaults.memorySearch` у `openclaw.json`, якщо не зазначено інше. -Якщо ви шукаєте перемикач функції **Active Memory** і конфігурацію під-агента, вони розташовані в `plugins.entries.active-memory`, а не в `memorySearch`. +Якщо ви шукаєте перемикач функції **active memory** і конфігурацію під-агента, вони розташовані в `plugins.entries.active-memory`, а не в `memorySearch`. -Active Memory використовує модель із двома шлюзами: +Active memory використовує модель із двома шлюзами: -1. Plugin має бути ввімкнений і націлений на ідентифікатор поточного агента +1. plugin має бути ввімкнений і націлений на ідентифікатор поточного агента 2. запит має бути придатним інтерактивним постійним сеансом чату -Дивіться [Active Memory](/uk/concepts/active-memory), щоб ознайомитися з моделлю активації, конфігурацією, що належить Plugin, збереженням транскриптів і безпечним шаблоном розгортання. +Див. [Active Memory](/uk/concepts/active-memory), щоб дізнатися про модель активації, конфігурацію, що належить plugin, збереження транскрипту та безпечний шаблон розгортання. --- ## Вибір провайдера -| Ключ | Тип | Типово | Опис | -| ---------- | --------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `provider` | `string` | автовизначення | Ідентифікатор адаптера ембедингів, наприклад `bedrock`, `deepinfra`, `gemini`, `github-copilot`, `local`, `mistral`, `ollama`, `openai` або `voyage`; також може бути налаштованим `models.providers.`, чий `api` вказує на один із цих адаптерів | -| `model` | `string` | типово провайдера | Назва моделі ембедингів | -| `fallback` | `string` | `"none"` | Ідентифікатор резервного адаптера, коли основний завершується невдало | -| `enabled` | `boolean` | `true` | Увімкнути або вимкнути пошук пам’яті | +| Ключ | Тип | Типове значення | Опис | +| ---------- | --------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `provider` | `string` | автовизначення | ID адаптера ембедингів, як-от `bedrock`, `deepinfra`, `gemini`, `github-copilot`, `local`, `mistral`, `ollama`, `openai` або `voyage`; також може бути налаштований `models.providers.`, чий `api` вказує на один із цих адаптерів | +| `model` | `string` | типове для провайдера | Назва моделі ембедингів | +| `fallback` | `string` | `"none"` | ID резервного адаптера, коли основний зазнає помилки | +| `enabled` | `boolean` | `true` | Увімкнути або вимкнути пошук памʼяті | ### Порядок автовизначення @@ -66,36 +66,36 @@ Active Memory використовує модель із двома шлюзам - Вибирається, якщо `memorySearch.local.modelPath` налаштовано і файл існує. + Вибирається, якщо `memorySearch.local.modelPath` налаштовано й файл існує. - Вибирається, якщо токен GitHub Copilot можна визначити (змінна середовища або профіль автентифікації). + Вибирається, якщо можна визначити токен GitHub Copilot (змінна середовища або профіль автентифікації). - Вибирається, якщо ключ OpenAI можна визначити. + Вибирається, якщо можна визначити ключ OpenAI. - Вибирається, якщо ключ Gemini можна визначити. + Вибирається, якщо можна визначити ключ Gemini. - Вибирається, якщо ключ Voyage можна визначити. + Вибирається, якщо можна визначити ключ Voyage. - Вибирається, якщо ключ Mistral можна визначити. + Вибирається, якщо можна визначити ключ Mistral. - Вибирається, якщо ключ DeepInfra можна визначити. + Вибирається, якщо можна визначити ключ DeepInfra. - Вибирається, якщо ланцюг облікових даних AWS SDK успішно визначається (роль інстансу, ключі доступу, профіль, SSO, веб-ідентичність або спільна конфігурація). + Вибирається, якщо ланцюжок облікових даних AWS SDK успішно визначається (роль інстансу, ключі доступу, профіль, SSO, веб-ідентичність або спільна конфігурація). `ollama` підтримується, але не визначається автоматично (задайте його явно). -### Власні ідентифікатори провайдерів +### Користувацькі ID провайдерів -`memorySearch.provider` може вказувати на власний запис `models.providers.`. OpenClaw визначає власника `api` цього провайдера для адаптера ембедингів, зберігаючи власний ідентифікатор провайдера для обробки кінцевої точки, автентифікації та префікса моделі. Це дає змогу конфігураціям із кількома GPU або кількома хостами виділити ембединги пам’яті для конкретної локальної кінцевої точки: +`memorySearch.provider` може вказувати на користувацький запис `models.providers.`. OpenClaw визначає власника `api` цього провайдера для адаптера ембедингів, зберігаючи користувацький ID провайдера для обробки endpoint, автентифікації та префікса моделі. Це дає змогу конфігураціям із кількома GPU або кількома хостами виділити ембединги памʼяті для конкретного локального endpoint: ```json5 { @@ -122,37 +122,37 @@ Active Memory використовує модель із двома шлюзам ### Визначення ключа API -Віддалені ембединги потребують ключа API. Натомість Bedrock використовує типовий ланцюг облікових даних AWS SDK (ролі інстансів, SSO, ключі доступу). +Віддалені ембединги потребують ключа API. Натомість Bedrock використовує стандартний ланцюжок облікових даних AWS SDK (ролі інстансів, SSO, ключі доступу). -| Провайдер | Змінна середовища | Ключ конфігурації | -| -------------- | ------------------------------------------------ | ---------------------------------- | -| Bedrock | ланцюг облікових даних AWS | Ключ API не потрібен | +| Провайдер | Змінна середовища | Ключ конфігурації | +| -------------- | ------------------------------------------------ | --------------------------------- | +| Bedrock | ланцюжок облікових даних AWS | Ключ API не потрібен | | DeepInfra | `DEEPINFRA_API_KEY` | `models.providers.deepinfra.apiKey` | -| Gemini | `GEMINI_API_KEY` | `models.providers.google.apiKey` | +| Gemini | `GEMINI_API_KEY` | `models.providers.google.apiKey` | | GitHub Copilot | `COPILOT_GITHUB_TOKEN`, `GH_TOKEN`, `GITHUB_TOKEN` | Профіль автентифікації через вхід із пристрою | -| Mistral | `MISTRAL_API_KEY` | `models.providers.mistral.apiKey` | -| Ollama | `OLLAMA_API_KEY` (заповнювач) | -- | -| OpenAI | `OPENAI_API_KEY` | `models.providers.openai.apiKey` | -| Voyage | `VOYAGE_API_KEY` | `models.providers.voyage.apiKey` | +| Mistral | `MISTRAL_API_KEY` | `models.providers.mistral.apiKey` | +| Ollama | `OLLAMA_API_KEY` (заповнювач) | -- | +| OpenAI | `OPENAI_API_KEY` | `models.providers.openai.apiKey` | +| Voyage | `VOYAGE_API_KEY` | `models.providers.voyage.apiKey` | -OAuth Codex покриває лише чат/завершення і не задовольняє запити ембедингів. +Codex OAuth покриває лише чат/автодоповнення й не задовольняє запити ембедингів. --- -## Конфігурація віддаленої кінцевої точки +## Конфігурація віддаленого endpoint -Для власних OpenAI-сумісних кінцевих точок або перевизначення типових налаштувань провайдера: +Для користувацьких OpenAI-сумісних endpoint або перевизначення типових значень провайдера: - Власна базова URL-адреса API. + Користувацька базова URL-адреса API. Перевизначити ключ API. - Додаткові HTTP-заголовки (об’єднуються з типовими заголовками провайдера). + Додаткові HTTP-заголовки (обʼєднуються з типовими значеннями провайдера). ```json5 @@ -174,28 +174,28 @@ OAuth Codex покриває лише чат/завершення і не зад --- -## Конфігурація, специфічна для провайдера +## Конфігурація для окремих провайдерів - | Ключ | Тип | Типово | Опис | + | Ключ | Тип | Типове значення | Опис | | ---------------------- | -------- | ---------------------- | ------------------------------------------ | | `model` | `string` | `gemini-embedding-001` | Також підтримує `gemini-embedding-2-preview` | - | `outputDimensionality` | `number` | `3072` | Для Embedding 2: 768, 1536 або 3072 | + | `outputDimensionality` | `number` | `3072` | Для Embedding 2: 768, 1536 або 3072 | - Зміна моделі або `outputDimensionality` запускає автоматичну повну переіндексацію. + Зміна моделі або `outputDimensionality` запускає автоматичне повне переіндексування. - - OpenAI-сумісні кінцеві точки ембедингів можуть увімкнути специфічні для провайдера поля запиту `input_type`. Це корисно для асиметричних моделей ембедингів, яким потрібні різні мітки для ембедингів запитів і документів. + + OpenAI-сумісні endpoint ембедингів можуть увімкнути специфічні для провайдера поля запиту `input_type`. Це корисно для асиметричних моделей ембедингів, які потребують різних міток для ембедингів запитів і документів. - | Ключ | Тип | Типово | Опис | - | ------------------- | -------- | ------------ | -------------------------------------------------------- | - | `inputType` | `string` | не задано | Спільний `input_type` для ембедингів запитів і документів | - | `queryInputType` | `string` | не задано | `input_type` під час запиту; перевизначає `inputType` | - | `documentInputType` | `string` | не задано | `input_type` індексу/документа; перевизначає `inputType` | + | Ключ | Тип | Типове значення | Опис | + | ------------------- | -------- | --------------- | ----------------------------------------------------------- | + | `inputType` | `string` | не задано | Спільний `input_type` для ембедингів запитів і документів | + | `queryInputType` | `string` | не задано | `input_type` під час запиту; перевизначає `inputType` | + | `documentInputType` | `string` | не задано | `input_type` індексу/документа; перевизначає `inputType` | ```json5 { @@ -216,11 +216,11 @@ OAuth Codex покриває лише чат/завершення і не зад } ``` - Зміна цих значень впливає на ідентичність кешу ембедингів для пакетного індексування провайдера, і після неї слід виконати переіндексацію пам’яті, коли upstream-модель обробляє мітки по-різному. + Зміна цих значень впливає на ідентичність кешу ембедингів для пакетного індексування провайдера, і після неї слід переіндексувати памʼять, коли upstream-модель обробляє мітки по-різному. - Bedrock використовує типовий ланцюг облікових даних AWS SDK — ключі API не потрібні. Якщо OpenClaw працює на EC2 з роллю інстансу, увімкненою для Bedrock, просто задайте провайдера й модель: + Bedrock використовує стандартний ланцюжок облікових даних AWS SDK — ключі API не потрібні. Якщо OpenClaw працює на EC2 з роллю інстансу, для якої ввімкнено Bedrock, просто задайте провайдера й модель: ```json5 { @@ -235,25 +235,25 @@ OAuth Codex покриває лише чат/завершення і не зад } ``` - | Ключ | Тип | Типово | Опис | - | ---------------------- | -------- | ------------------------------ | ----------------------------- | - | `model` | `string` | `amazon.titan-embed-text-v2:0` | Будь-який ідентифікатор моделі ембедингів Bedrock | - | `outputDimensionality` | `number` | типово моделі | Для Titan V2: 256, 512 або 1024 | + | Ключ | Тип | Типове значення | Опис | + | ---------------------- | -------- | ----------------------------- | ------------------------------- | + | `model` | `string` | `amazon.titan-embed-text-v2:0` | Будь-який ID моделі ембедингів Bedrock | + | `outputDimensionality` | `number` | типове значення моделі | Для Titan V2: 256, 512 або 1024 | **Підтримувані моделі** (з визначенням сімейства й типовими розмірностями): - | Ідентифікатор моделі | Провайдер | Типові розмірності | Налаштовувані розмірності | - | ------------------------------------------ | ---------- | ------------------ | -------------------------- | - | `amazon.titan-embed-text-v2:0` | Amazon | 1024 | 256, 512, 1024 | - | `amazon.titan-embed-text-v1` | Amazon | 1536 | -- | - | `amazon.titan-embed-g1-text-02` | Amazon | 1536 | -- | - | `amazon.titan-embed-image-v1` | Amazon | 1024 | -- | - | `amazon.nova-2-multimodal-embeddings-v1:0` | Amazon | 1024 | 256, 384, 1024, 3072 | - | `cohere.embed-english-v3` | Cohere | 1024 | -- | - | `cohere.embed-multilingual-v3` | Cohere | 1024 | -- | - | `cohere.embed-v4:0` | Cohere | 1536 | 256-1536 | - | `twelvelabs.marengo-embed-3-0-v1:0` | TwelveLabs | 512 | -- | - | `twelvelabs.marengo-embed-2-7-v1:0` | TwelveLabs | 1024 | -- | + | ID моделі | Провайдер | Типові розмірності | Налаштовувані розмірності | + | ------------------------------------------ | ---------- | ------------------ | ------------------------- | + | `amazon.titan-embed-text-v2:0` | Amazon | 1024 | 256, 512, 1024 | + | `amazon.titan-embed-text-v1` | Amazon | 1536 | -- | + | `amazon.titan-embed-g1-text-02` | Amazon | 1536 | -- | + | `amazon.titan-embed-image-v1` | Amazon | 1024 | -- | + | `amazon.nova-2-multimodal-embeddings-v1:0` | Amazon | 1024 | 256, 384, 1024, 3072 | + | `cohere.embed-english-v3` | Cohere | 1024 | -- | + | `cohere.embed-multilingual-v3` | Cohere | 1024 | -- | + | `cohere.embed-v4:0` | Cohere | 1536 | 256-1536 | + | `twelvelabs.marengo-embed-3-0-v1:0` | TwelveLabs | 512 | -- | + | `twelvelabs.marengo-embed-2-7-v1:0` | TwelveLabs | 1024 | -- | Варіанти із суфіксом пропускної здатності (наприклад, `amazon.titan-embed-text-v1:2:8k`) успадковують конфігурацію базової моделі. @@ -267,7 +267,7 @@ OAuth Codex покриває лише чат/завершення і не зад Регіон визначається з `AWS_REGION`, `AWS_DEFAULT_REGION`, `baseUrl` провайдера `amazon-bedrock` або за замовчуванням має значення `us-east-1`. - **Дозволи IAM:** роль або користувач IAM потребує: + **Дозволи IAM:** ролі або користувачу IAM потрібні: ```json { @@ -284,14 +284,14 @@ OAuth Codex покриває лише чат/завершення і не зад ``` - - | Ключ | Тип | Типове значення | Опис | - | --------------------- | ------------------ | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `local.modelPath` | `string` | автоматично завантажується | Шлях до файлу моделі GGUF | - | `local.modelCacheDir` | `string` | типове для node-llama-cpp | Каталог кешу для завантажених моделей | - | `local.contextSize` | `number \| "auto"` | `4096` | Розмір вікна контексту для контексту embedding. 4096 покриває типові фрагменти (128–512 токенів), обмежуючи VRAM, не зайняту вагами. Зменште до 1024–2048 на обмежених хостах. `"auto"` використовує навчений максимум моделі — не рекомендовано для моделей 8B+ (Qwen3-Embedding-8B: 40 960 токенів → ~32 GB VRAM проти ~8.8 GB при 4096). | + + | Ключ | Тип | Типове значення | Опис | + | --------------------- | ------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `local.modelPath` | `string` | автоматично завантажується | Шлях до файлу моделі GGUF | + | `local.modelCacheDir` | `string` | типове для node-llama-cpp | Каталог кешу для завантажених моделей | + | `local.contextSize` | `number \| "auto"` | `4096` | Розмір контекстного вікна для контексту embedding. 4096 покриває типові фрагменти (128–512 токенів), обмежуючи VRAM не для ваг. Зменште до 1024–2048 на обмежених хостах. `"auto"` використовує навчений максимум моделі — не рекомендовано для моделей 8B+ (Qwen3-Embedding-8B: 40 960 токенів → ~32 ГБ VRAM проти ~8,8 ГБ за 4096). | - Типова модель: `embeddinggemma-300m-qat-Q8_0.gguf` (~0.6 GB, завантажується автоматично). Потрібне нативне складання: `pnpm approve-builds`, потім `pnpm rebuild node-llama-cpp`. + Типова модель: `embeddinggemma-300m-qat-Q8_0.gguf` (~0,6 ГБ, автоматично завантажується). Потребує нативного складання: `pnpm approve-builds`, потім `pnpm rebuild node-llama-cpp`. Використайте автономний CLI, щоб перевірити той самий шлях провайдера, який використовує Gateway: @@ -300,17 +300,17 @@ OAuth Codex покриває лише чат/завершення і не зад openclaw memory index --force --agent main ``` - Якщо `provider` має значення `auto`, `local` вибирається лише тоді, коли `local.modelPath` вказує на наявний локальний файл. Посилання на моделі `hf:` і HTTP(S) усе ще можна явно використовувати з `provider: "local"`, але вони не змушують `auto` вибирати local до того, як модель стане доступною на диску. + Якщо `provider` має значення `auto`, `local` вибирається лише тоді, коли `local.modelPath` указує на наявний локальний файл. Посилання на моделі `hf:` і HTTP(S) усе ще можна явно використовувати з `provider: "local"`, але вони не змушують `auto` вибрати локальний провайдер до того, як модель стане доступною на диску. -### Таймаут inline embedding +### Тайм-аут inline embedding - Перевизначає таймаут для inline-пакетів embedding під час індексування памʼяті. + Перевизначає тайм-аут для пакетів inline embedding під час індексування пам’яті. -Якщо не задано, використовується типове значення провайдера: 600 секунд для локальних/self-hosted провайдерів, як-от `local`, `ollama` і `lmstudio`, та 120 секунд для hosted-провайдерів. Збільште це значення, коли локальні CPU-bound пакети embedding працюють коректно, але повільно. +Якщо не задано, використовується типове значення провайдера: 600 секунд для локальних/self-hosted провайдерів, як-от `local`, `ollama` і `lmstudio`, та 120 секунд для hosted провайдерів. Збільште це значення, коли локальні CPU-bound пакети embedding працюють справно, але повільно. --- @@ -319,27 +319,27 @@ OAuth Codex покриває лише чат/завершення і не зад Усе в `memorySearch.query.hybrid`: -| Ключ | Тип | Типове значення | Опис | -| --------------------- | --------- | --------------- | ----------------------------------------- | -| `enabled` | `boolean` | `true` | Увімкнути гібридний пошук BM25 + векторний | -| `vectorWeight` | `number` | `0.7` | Вага для векторних оцінок (0-1) | -| `textWeight` | `number` | `0.3` | Вага для оцінок BM25 (0-1) | -| `candidateMultiplier` | `number` | `4` | Множник розміру пулу кандидатів | +| Ключ | Тип | Типове значення | Опис | +| --------------------- | --------- | ------- | ---------------------------------- | +| `enabled` | `boolean` | `true` | Увімкнути гібридний пошук BM25 + векторний пошук | +| `vectorWeight` | `number` | `0.7` | Вага для векторних оцінок (0-1) | +| `textWeight` | `number` | `0.3` | Вага для оцінок BM25 (0-1) | +| `candidateMultiplier` | `number` | `4` | Множник розміру пулу кандидатів | - - | Ключ | Тип | Типове значення | Опис | - | ------------- | --------- | --------------- | -------------------------------------------- | - | `mmr.enabled` | `boolean` | `false` | Увімкнути повторне ранжування MMR | - | `mmr.lambda` | `number` | `0.7` | 0 = максимальна різноманітність, 1 = максимальна релевантність | + + | Ключ | Тип | Типове значення | Опис | + | ------------- | --------- | ------- | ------------------------------------ | + | `mmr.enabled` | `boolean` | `false` | Увімкнути повторне ранжування MMR | + | `mmr.lambda` | `number` | `0.7` | 0 = максимальна різноманітність, 1 = максимальна релевантність | - - | Ключ | Тип | Типове значення | Опис | - | ---------------------------- | --------- | --------------- | ------------------------------------- | - | `temporalDecay.enabled` | `boolean` | `false` | Увімкнути підсилення за новизною | - | `temporalDecay.halfLifeDays` | `number` | `30` | Оцінка зменшується вдвічі кожні N днів | + + | Ключ | Тип | Типове значення | Опис | + | ---------------------------- | --------- | ------- | ------------------------- | + | `temporalDecay.enabled` | `boolean` | `false` | Увімкнути підсилення свіжості | + | `temporalDecay.halfLifeDays` | `number` | `30` | Оцінка зменшується вдвічі кожні N днів | - Evergreen-файли (`MEMORY.md`, файли без дат у `memory/`) ніколи не зазнають decay. + Evergreen-файли (`MEMORY.md`, файли без дат у `memory/`) ніколи не підлягають згасанню. @@ -367,11 +367,11 @@ OAuth Codex покриває лише чат/завершення і не зад --- -## Додаткові шляхи памʼяті +## Додаткові шляхи пам’яті | Ключ | Тип | Опис | -| ------------ | ---------- | ----------------------------------------- | -| `extraPaths` | `string[]` | Додаткові каталоги або файли для індексації | +| ------------ | ---------- | ---------------------------------------- | +| `extraPaths` | `string[]` | Додаткові каталоги або файли для індексування | ```json5 { @@ -385,83 +385,83 @@ OAuth Codex покриває лише чат/завершення і не зад } ``` -Шляхи можуть бути абсолютними або відносними до робочого простору. Каталоги рекурсивно скануються на наявність файлів `.md`. Обробка symlink залежить від активного backend: вбудований рушій ігнорує symlink, тоді як QMD дотримується поведінки базового сканера QMD. +Шляхи можуть бути абсолютними або відносними до робочої області. Каталоги рекурсивно скануються на файли `.md`. Обробка симлінків залежить від активного backend: вбудований рушій ігнорує симлінки, тоді як QMD дотримується поведінки базового сканера QMD. -Для пошуку транскриптів між агентами в межах агента використовуйте `agents.list[].memorySearch.qmd.extraCollections` замість `memory.qmd.paths`. Ці додаткові колекції мають таку саму форму `{ path, name, pattern? }`, але обʼєднуються для кожного агента й можуть зберігати явні спільні назви, коли шлях вказує за межі поточного робочого простору. Якщо той самий resolved path є і в `memory.qmd.paths`, і в `memorySearch.qmd.extraCollections`, QMD зберігає перший запис і пропускає дублікат. +Для scoped-to-agent пошуку transcript між агентами використовуйте `agents.list[].memorySearch.qmd.extraCollections` замість `memory.qmd.paths`. Ці додаткові колекції мають ту саму форму `{ path, name, pattern? }`, але об’єднуються для кожного агента й можуть зберігати явні спільні назви, коли шлях указує за межі поточної робочої області. Якщо той самий resolved path з’являється і в `memory.qmd.paths`, і в `memorySearch.qmd.extraCollections`, QMD зберігає перший запис і пропускає дублікат. --- -## Мультимодальна памʼять (Gemini) +## Мультимодальна пам’ять (Gemini) -Індексуйте зображення й аудіо разом із Markdown за допомогою Gemini Embedding 2: +Індексуйте зображення та аудіо разом із Markdown за допомогою Gemini Embedding 2: | Ключ | Тип | Типове значення | Опис | -| ------------------------- | ---------- | --------------- | ------------------------------------- | -| `multimodal.enabled` | `boolean` | `false` | Увімкнути мультимодальне індексування | -| `multimodal.modalities` | `string[]` | -- | `["image"]`, `["audio"]`, або `["all"]` | -| `multimodal.maxFileBytes` | `number` | `10000000` | Максимальний розмір файлу для індексування | +| ------------------------- | ---------- | ---------- | -------------------------------------- | +| `multimodal.enabled` | `boolean` | `false` | Увімкнути мультимодальне індексування | +| `multimodal.modalities` | `string[]` | -- | `["image"]`, `["audio"]` або `["all"]` | +| `multimodal.maxFileBytes` | `number` | `10000000` | Максимальний розмір файлу для індексування | -Застосовується лише до файлів у `extraPaths`. Типові корені пам’яті залишаються лише Markdown. Потрібен `gemini-embedding-2-preview`. `fallback` має бути `"none"`. +Застосовується лише до файлів у `extraPaths`. Корені пам’яті за замовчуванням лишаються тільки Markdown. Потрібен `gemini-embedding-2-preview`. `fallback` має бути `"none"`. Підтримувані формати: `.jpg`, `.jpeg`, `.png`, `.webp`, `.gif`, `.heic`, `.heif` (зображення); `.mp3`, `.wav`, `.ogg`, `.opus`, `.m4a`, `.aac`, `.flac` (аудіо). --- -## Кеш embedding +## Кеш ембедингів -| Ключ | Тип | Типово | Опис | -| ----------------- | --------- | ------- | ------------------------------------- | -| `cache.enabled` | `boolean` | `false` | Кешувати embedding фрагментів у SQLite | -| `cache.maxEntries` | `number` | `50000` | Максимум кешованих embedding | +| Ключ | Тип | За замовчуванням | Опис | +| ------------------ | --------- | ---------------- | ---------------------------------- | +| `cache.enabled` | `boolean` | `false` | Кешувати ембединги фрагментів у SQLite | +| `cache.maxEntries` | `number` | `50000` | Максимальна кількість кешованих ембедингів | -Запобігає повторному embedding незміненого тексту під час повторної індексації або оновлень стенограм. +Запобігає повторному створенню ембедингів для незміненого тексту під час переіндексації або оновлень транскриптів. --- -## Пакетна індексація +## Пакетне індексування -| Ключ | Тип | Типово | Опис | -| ----------------------------- | --------- | ------ | -------------------------- | -| `remote.nonBatchConcurrency` | `number` | `4` | Паралельні inline embedding | -| `remote.batch.enabled` | `boolean` | `false` | Увімкнути API пакетного embedding | -| `remote.batch.concurrency` | `number` | `2` | Паралельні пакетні завдання | -| `remote.batch.wait` | `boolean` | `true` | Чекати завершення пакета | -| `remote.batch.pollIntervalMs` | `number` | -- | Інтервал опитування | -| `remote.batch.timeoutMinutes` | `number` | -- | Тайм-аут пакета | +| Ключ | Тип | За замовчуванням | Опис | +| ----------------------------- | --------- | ---------------- | ---------------------------- | +| `remote.nonBatchConcurrency` | `number` | `4` | Паралельні inline-ембединги | +| `remote.batch.enabled` | `boolean` | `false` | Увімкнути API пакетних ембедингів | +| `remote.batch.concurrency` | `number` | `2` | Паралельні пакетні завдання | +| `remote.batch.wait` | `boolean` | `true` | Чекати завершення пакета | +| `remote.batch.pollIntervalMs` | `number` | -- | Інтервал опитування | +| `remote.batch.timeoutMinutes` | `number` | -- | Тайм-аут пакета | -Доступно для `openai`, `gemini` і `voyage`. Пакетний режим OpenAI зазвичай найшвидший і найдешевший для великих зворотних заповнень. +Доступно для `openai`, `gemini` і `voyage`. Пакетний режим OpenAI зазвичай найшвидший і найдешевший для великих ретроспективних заповнень. -`remote.nonBatchConcurrency` керує inline-викликами embedding, які використовують локальні/самостійно розгорнуті провайдери та хостингові провайдери, коли пакетні API провайдера не активні. Ollama типово використовує `1` для непакетної індексації, щоб не перевантажувати менші локальні хости; встановіть більше значення на потужніших машинах. +`remote.nonBatchConcurrency` керує inline-викликами ембедингів, які використовують локальні/self-hosted провайдери та хостингові провайдери, коли пакетні API провайдера не активні. Ollama за замовчуванням використовує `1` для непакетного індексування, щоб не перевантажувати менші локальні хости; встановіть вище значення на потужніших машинах. -Це окремо від `sync.embeddingBatchTimeoutSeconds`, який керує тайм-аутом для inline-викликів embedding. +Це окремо від `sync.embeddingBatchTimeoutSeconds`, який керує тайм-аутом для inline-викликів ембедингів. --- -## Пошук пам’яті сеансів (експериментально) +## Пошук у пам’яті сеансів (експериментально) -Індексуйте стенограми сеансів і показуйте їх через `memory_search`: +Індексуйте транскрипти сеансів і надавайте їх через `memory_search`: -| Ключ | Тип | Типово | Опис | -| ----------------------------- | ---------- | ------------ | ----------------------------------------- | -| `experimental.sessionMemory` | `boolean` | `false` | Увімкнути індексацію сеансів | -| `sources` | `string[]` | `["memory"]` | Додайте `"sessions"`, щоб включити стенограми | -| `sync.sessions.deltaBytes` | `number` | `100000` | Поріг байтів для повторної індексації | -| `sync.sessions.deltaMessages` | `number` | `50` | Поріг повідомлень для повторної індексації | +| Ключ | Тип | За замовчуванням | Опис | +| ----------------------------- | ---------- | ---------------- | ----------------------------------------- | +| `experimental.sessionMemory` | `boolean` | `false` | Увімкнути індексування сеансів | +| `sources` | `string[]` | `["memory"]` | Додайте `"sessions"`, щоб включити транскрипти | +| `sync.sessions.deltaBytes` | `number` | `100000` | Поріг у байтах для переіндексації | +| `sync.sessions.deltaMessages` | `number` | `50` | Поріг у повідомленнях для переіндексації | -Індексація сеансів вмикається явно й виконується асинхронно. Результати можуть бути трохи застарілими. Журнали сеансів зберігаються на диску, тому вважайте доступ до файлової системи межею довіри. +Індексування сеансів вмикається явно й виконується асинхронно. Результати можуть бути трохи застарілими. Журнали сеансів зберігаються на диску, тому вважайте доступ до файлової системи межею довіри. --- ## Векторне прискорення SQLite (sqlite-vec) -| Ключ | Тип | Типово | Опис | -| ---------------------------- | --------- | ------- | --------------------------------------- | -| `store.vector.enabled` | `boolean` | `true` | Використовувати sqlite-vec для векторних запитів | -| `store.vector.extensionPath` | `string` | bundled | Перевизначити шлях до sqlite-vec | +| Ключ | Тип | За замовчуванням | Опис | +| ---------------------------- | --------- | ---------------- | ------------------------------------- | +| `store.vector.enabled` | `boolean` | `true` | Використовувати sqlite-vec для векторних запитів | +| `store.vector.extensionPath` | `string` | bundled | Перевизначити шлях sqlite-vec | Коли sqlite-vec недоступний, OpenClaw автоматично повертається до косинусної подібності в процесі. @@ -469,55 +469,57 @@ OAuth Codex покриває лише чат/завершення і не зад ## Сховище індексу -| Ключ | Тип | Типово | Опис | -| --------------------- | -------- | ------------------------------------- | ----------------------------------------- | +| Ключ | Тип | За замовчуванням | Опис | +| --------------------- | -------- | ------------------------------------ | -------------------------------------------- | | `store.path` | `string` | `~/.openclaw/memory/{agentId}.sqlite` | Розташування індексу (підтримує токен `{agentId}`) | -| `store.fts.tokenizer` | `string` | `unicode61` | Токенізатор FTS5 (`unicode61` або `trigram`) | +| `store.fts.tokenizer` | `string` | `unicode61` | Токенізатор FTS5 (`unicode61` або `trigram`) | --- -## Конфігурація бекенду QMD +## Конфігурація бекенда QMD Установіть `memory.backend = "qmd"`, щоб увімкнути. Усі налаштування QMD розташовані в `memory.qmd`: -| Ключ | Тип | Типово | Опис | -| ------------------------ | --------- | -------- | ------------------------------------------------------------------------------------- | -| `command` | `string` | `qmd` | Шлях до виконуваного файлу QMD; задайте абсолютний шлях, коли `PATH` сервісу відрізняється від вашої оболонки | -| `searchMode` | `string` | `search` | Команда пошуку: `search`, `vsearch`, `query` | -| `includeDefaultMemory` | `boolean` | `true` | Автоматично індексувати `MEMORY.md` + `memory/**/*.md` | -| `paths[]` | `array` | -- | Додаткові шляхи: `{ name, path, pattern? }` | -| `sessions.enabled` | `boolean` | `false` | Індексувати стенограми сеансів | -| `sessions.retentionDays` | `number` | -- | Зберігання стенограм | -| `sessions.exportDir` | `string` | -- | Каталог експорту | +| Ключ | Тип | За замовчуванням | Опис | +| ------------------------ | --------- | ---------------- | ------------------------------------------------------------------------------------ | +| `command` | `string` | `qmd` | Шлях до виконуваного файлу QMD; задайте абсолютний шлях, коли `PATH` сервісу відрізняється від вашого shell | +| `searchMode` | `string` | `search` | Команда пошуку: `search`, `vsearch`, `query` | +| `includeDefaultMemory` | `boolean` | `true` | Автоматично індексувати `MEMORY.md` + `memory/**/*.md` | +| `paths[]` | `array` | -- | Додаткові шляхи: `{ name, path, pattern? }` | +| `sessions.enabled` | `boolean` | `false` | Індексувати транскрипти сеансів | +| `sessions.retentionDays` | `number` | -- | Термін зберігання транскриптів | +| `sessions.exportDir` | `string` | -- | Каталог експорту | -`searchMode: "search"` є лише лексичним/BM25. OpenClaw не запускає перевірки готовності семантичних векторів або обслуговування QMD-вбудовувань для цього режиму, зокрема під час `memory status --deep`; `vsearch` і `query` надалі потребують готовності QMD-векторів і вбудовувань. +`searchMode: "search"` працює лише з лексичним пошуком/BM25. OpenClaw не запускає перевірки готовності семантичних векторів або обслуговування QMD embedding для цього режиму, зокрема під час `memory status --deep`; `vsearch` і `query` надалі потребують готовності QMD-векторів і embeddings. -OpenClaw надає перевагу поточним формам колекцій QMD і запитів MCP, але зберігає працездатність старіших випусків QMD, за потреби пробуючи сумісні прапорці шаблонів колекцій і старіші назви інструментів MCP. Коли QMD повідомляє про підтримку кількох фільтрів колекцій, колекції з тим самим джерелом шукаються одним процесом QMD; старіші збірки QMD зберігають шлях сумісності для кожної колекції. Те саме джерело означає, що колекції довготривалої пам'яті групуються разом, тоді як колекції стенограм сесій залишаються окремою групою, щоб диверсифікація джерел і надалі мала обидва входи. +OpenClaw віддає перевагу поточним формам колекцій QMD і запитів MCP, але зберігає працездатність старіших випусків QMD, за потреби пробуючи сумісні прапорці шаблонів колекцій і старіші назви інструментів MCP. Коли QMD оголошує підтримку кількох фільтрів колекцій, колекції з того самого джерела шукаються одним процесом QMD; старіші збірки QMD зберігають шлях сумісності для кожної колекції. Те саме джерело означає, що колекції сталої пам’яті групуються разом, тоді як колекції транскриптів сесій залишаються окремою групою, щоб диверсифікація джерел і надалі мала обидва входи. -Перевизначення моделей QMD залишаються на боці QMD, а не в конфігурації OpenClaw. Якщо потрібно глобально перевизначити моделі QMD, задайте змінні середовища, як-от `QMD_EMBED_MODEL`, `QMD_RERANK_MODEL` і `QMD_GENERATE_MODEL`, у runtime-середовищі Gateway. +Перевизначення моделей QMD залишаються на боці QMD, а не в конфігурації OpenClaw. Якщо потрібно глобально перевизначити моделі QMD, установіть змінні середовища, як-от `QMD_EMBED_MODEL`, `QMD_RERANK_MODEL` і `QMD_GENERATE_MODEL`, у середовищі виконання gateway. - - | Ключ | Тип | Типово | Опис | + + | Ключ | Тип | Типове значення | Опис | | ------------------------- | --------- | ------- | ------------------------------------- | | `update.interval` | `string` | `5m` | Інтервал оновлення | - | `update.debounceMs` | `number` | `15000` | Усунення брязкоту змін файлів | - | `update.onBoot` | `boolean` | `true` | Оновлювати під час запуску в підпроцесі QMD | - | `update.waitForBootSync` | `boolean` | `false` | Блокувати запуск до завершення оновлення | - | `update.embedInterval` | `string` | -- | Окрема періодичність вбудовування | - | `update.commandTimeoutMs` | `number` | -- | Тайм-аут для команд QMD | - | `update.updateTimeoutMs` | `number` | -- | Тайм-аут для операцій оновлення QMD | - | `update.embedTimeoutMs` | `number` | -- | Тайм-аут для операцій вбудовування QMD | + | `update.debounceMs` | `number` | `15000` | Debounce для змін файлів | + | `update.onBoot` | `boolean` | `true` | Оновлювати, коли відкривається довготривалий менеджер QMD; також керує добровільним стартовим оновленням | + | `update.startup` | `string` | `off` | Необов’язкове оновлення під час запуску Gateway: `off`, `idle` або `immediate` | + | `update.startupDelayMs` | `number` | `120000` | Затримка перед запуском оновлення `startup: "idle"` | + | `update.waitForBootSync` | `boolean` | `false` | Блокувати відкриття менеджера, доки завершиться його початкове оновлення | + | `update.embedInterval` | `string` | -- | Окрема періодичність embed | + | `update.commandTimeoutMs` | `number` | -- | Timeout для команд QMD | + | `update.updateTimeoutMs` | `number` | -- | Timeout для операцій оновлення QMD | + | `update.embedTimeoutMs` | `number` | -- | Timeout для операцій embed QMD | - | Ключ | Тип | Типово | Опис | - | ------------------------- | -------- | ------ | ------------------------------------- | - | `limits.maxResults` | `number` | `6` | Максимум результатів пошуку | - | `limits.maxSnippetChars` | `number` | -- | Обмежити довжину фрагмента | - | `limits.maxInjectedChars` | `number` | -- | Обмежити загальну кількість вставлених символів | - | `limits.timeoutMs` | `number` | `4000` | Тайм-аут пошуку | + | Ключ | Тип | Типове значення | Опис | + | ------------------------- | -------- | ------- | -------------------------- | + | `limits.maxResults` | `number` | `6` | Максимальна кількість результатів пошуку | + | `limits.maxSnippetChars` | `number` | -- | Обмежити довжину фрагмента | + | `limits.maxInjectedChars` | `number` | -- | Обмежити загальну кількість вставлених символів | + | `limits.timeoutMs` | `number` | `4000` | Timeout пошуку | Керує тим, які сесії можуть отримувати результати пошуку QMD. Та сама схема, що й [`session.sendPolicy`](/uk/gateway/config-agents#session): @@ -535,24 +537,24 @@ OpenClaw надає перевагу поточним формам колекц } ``` - Постачене типове значення дозволяє прямі й канальні сесії, водночас усе ще забороняючи групи. + Типове значення, що постачається, дозволяє прямі сесії та сесії каналів, водночас і далі забороняючи групи. - Типово лише для DM. `match.keyPrefix` зіставляється з нормалізованим ключем сесії; `match.rawKeyPrefix` зіставляється з сирим ключем, включно з `agent::`. + Типово дозволено лише DM. `match.keyPrefix` зіставляється з нормалізованим ключем сесії; `match.rawKeyPrefix` зіставляється з необробленим ключем, включно з `agent::`. - - `memory.citations` застосовується до всіх бекендів: + + `memory.citations` застосовується до всіх backend: - | Значення | Поведінка | + | Значення | Поведінка | | ---------------- | --------------------------------------------------- | - | `auto` (типово) | Додавати футер `Source: ` у фрагменти | - | `on` | Завжди додавати футер | - | `off` | Не додавати футер (шлях усе одно передається агенту внутрішньо) | + | `auto` (типово) | Додавати нижній колонтитул `Source: ` у фрагменти | + | `on` | Завжди додавати нижній колонтитул | + | `off` | Не додавати нижній колонтитул (шлях усе одно передається агенту внутрішньо) | -Оновлення QMD під час завантаження використовують одноразовий шлях підпроцесу під час запуску Gateway. Довготривалий менеджер QMD усе ще відповідає за звичайний спостерігач файлів і таймери інтервалів, коли пошук у пам'яті відкривається для інтерактивного використання. +Завантажувальні оновлення QMD використовують одноразовий шлях підпроцесу під час запуску Gateway. Довготривалий менеджер QMD і надалі володіє звичайним спостерігачем файлів і таймерами інтервалів, коли пошук у пам’яті відкривається для інтерактивного використання. ### Повний приклад QMD @@ -581,17 +583,17 @@ OpenClaw надає перевагу поточним формам колекц Dreaming налаштовується в `plugins.entries.memory-core.config.dreaming`, а не в `agents.defaults.memorySearch`. -Dreaming виконується як один запланований прохід і використовує внутрішні фази light/deep/REM як деталь реалізації. +Dreaming виконується як один запланований прохід і використовує внутрішні легку/глибоку/REM-фази як деталь реалізації. -Концептуальну поведінку й slash-команди див. у [Dreaming](/uk/concepts/dreaming). +Концептуальну поведінку та slash-команди див. у [Dreaming](/uk/concepts/dreaming). ### Налаштування користувача -| Ключ | Тип | Типово | Опис | -| ----------- | --------- | ------------- | ------------------------------------------------ | -| `enabled` | `boolean` | `false` | Повністю ввімкнути або вимкнути dreaming | -| `frequency` | `string` | `0 3 * * *` | Необов'язкова Cron-періодичність для повного проходу dreaming | -| `model` | `string` | типова модель | Необов'язкове перевизначення моделі субагента Dream Diary | +| Ключ | Тип | Типове значення | Опис | +| ----------- | --------- | ------------- | ------------------------------------------------- | +| `enabled` | `boolean` | `false` | Повністю увімкнути або вимкнути Dreaming | +| `frequency` | `string` | `0 3 * * *` | Необов’язкова Cron-періодичність для повного проходу Dreaming | +| `model` | `string` | типова модель | Необов’язкове перевизначення моделі субагента Dream Diary | ### Приклад @@ -618,16 +620,16 @@ Dreaming виконується як один запланований прох ``` -- Dreaming записує машинний стан у `memory/.dreams/`. -- Dreaming записує людиночитаний наративний вивід у `DREAMS.md` (або наявний `dreams.md`). -- `dreaming.model` використовує наявний шлюз довіри субагента Plugin; задайте `plugins.entries.memory-core.subagent.allowModelOverride: true`, перш ніж вмикати його. -- Dream Diary повторює спробу один раз із типовою моделлю сесії, коли налаштована модель недоступна. Збої довіри або allowlist журналюються й не повторюються мовчки. -- Політика й пороги фаз light/deep/REM є внутрішньою поведінкою, а не користувацькою конфігурацією. +- Dreaming записує машинний стан до `memory/.dreams/`. +- Dreaming записує зручний для читання наративний вивід до `DREAMS.md` (або наявного `dreams.md`). +- `dreaming.model` використовує наявний шлюз довіри субагента Plugin; установіть `plugins.entries.memory-core.subagent.allowModelOverride: true`, перш ніж вмикати його. +- Dream Diary повторює спробу один раз із типовою моделлю сесії, коли налаштована модель недоступна. Помилки довіри або allowlist журналюються й не повторюються мовчки. +- Політика та пороги легкої/глибокої/REM-фаз є внутрішньою поведінкою, а не користувацькою конфігурацією. -## Пов'язане +## Пов’язане - [Довідник конфігурації](/uk/gateway/configuration-reference) -- [Огляд пам'яті](/uk/concepts/memory) -- [Пошук у пам'яті](/uk/concepts/memory-search) +- [Огляд пам’яті](/uk/concepts/memory) +- [Пошук у пам’яті](/uk/concepts/memory-search)