chore(i18n): refresh uk translations
This commit is contained in:
parent
fdc56b20a7
commit
fcdf1ec6dc
@ -2,13 +2,13 @@
|
||||
read_when:
|
||||
- Налаштування підтримки iMessage
|
||||
- Налагодження надсилання/отримання iMessage
|
||||
summary: Застаріла підтримка iMessage через imsg (JSON-RPC через stdio). Для нових налаштувань слід використовувати BlueBubbles.
|
||||
summary: Застаріла підтримка iMessage через imsg (JSON-RPC через stdio). У нових налаштуваннях слід використовувати BlueBubbles.
|
||||
title: iMessage
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T17:58:18Z"
|
||||
generated_at: "2026-04-21T21:27:21Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 086d85bead49f75d12ae6b14ac917af52375b6afd28f6af1a0dcbbc7fcb628a0
|
||||
source_hash: fb9cc5a0bd4fbc7ff6f792e737bc4302a67f9ab6aa8231ff6f751fe6d732ca5d
|
||||
source_path: channels/imessage.md
|
||||
workflow: 15
|
||||
---
|
||||
@ -16,21 +16,21 @@ x-i18n:
|
||||
# iMessage (застаріле: imsg)
|
||||
|
||||
<Warning>
|
||||
Для нових розгортань iMessage використовуйте <a href="/channels/bluebubbles">BlueBubbles</a>.
|
||||
Для нових розгортань iMessage використовуйте <a href="/uk/channels/bluebubbles">BlueBubbles</a>.
|
||||
|
||||
Інтеграція `imsg` є застарілою та може бути видалена в одному з майбутніх випусків.
|
||||
Інтеграція `imsg` є застарілою і може бути вилучена в майбутньому випуску.
|
||||
</Warning>
|
||||
|
||||
Стан: застаріла зовнішня інтеграція CLI. Gateway запускає `imsg rpc` і обмінюється даними через JSON-RPC по stdio (без окремого демона/порту).
|
||||
Статус: застаріла зовнішня інтеграція CLI. Gateway запускає `imsg rpc` і обмінюється даними через JSON-RPC по stdio (без окремого демона/порту).
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="BlueBubbles (рекомендовано)" icon="message-circle" href="/channels/bluebubbles">
|
||||
<Card title="BlueBubbles (рекомендовано)" icon="message-circle" href="/uk/channels/bluebubbles">
|
||||
Бажаний шлях iMessage для нових налаштувань.
|
||||
</Card>
|
||||
<Card title="Прив’язка" icon="link" href="/channels/pairing">
|
||||
Для приватних повідомлень iMessage типово використовується режим прив’язки.
|
||||
<Card title="Сполучення" icon="link" href="/uk/channels/pairing">
|
||||
Прямі повідомлення iMessage типово використовують режим сполучення.
|
||||
</Card>
|
||||
<Card title="Довідник з конфігурації" icon="settings" href="/gateway/configuration-reference#imessage">
|
||||
<Card title="Довідник із конфігурації" icon="settings" href="/uk/gateway/configuration-reference#imessage">
|
||||
Повний довідник полів iMessage.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
@ -40,7 +40,7 @@ x-i18n:
|
||||
<Tabs>
|
||||
<Tab title="Локальний Mac (швидкий шлях)">
|
||||
<Steps>
|
||||
<Step title="Установіть і перевірте imsg">
|
||||
<Step title="Встановіть і перевірте imsg">
|
||||
|
||||
```bash
|
||||
brew install steipete/tap/imsg
|
||||
@ -57,7 +57,7 @@ imsg rpc --help
|
||||
imessage: {
|
||||
enabled: true,
|
||||
cliPath: "/usr/local/bin/imsg",
|
||||
dbPath: "/Users/<you>/Library/Messages/chat.db",
|
||||
dbPath: "/Users/user/Library/Messages/chat.db",
|
||||
},
|
||||
},
|
||||
}
|
||||
@ -73,21 +73,21 @@ openclaw gateway
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Підтвердьте першу прив’язку приватного повідомлення (типова `dmPolicy`)">
|
||||
<Step title="Підтвердьте перше сполучення DM (типова `dmPolicy`)">
|
||||
|
||||
```bash
|
||||
openclaw pairing list imessage
|
||||
openclaw pairing approve imessage <CODE>
|
||||
```
|
||||
|
||||
Запити на прив’язку спливають через 1 годину.
|
||||
Запити на сполучення спливають через 1 годину.
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="Віддалений Mac через SSH">
|
||||
OpenClaw потребує лише сумісний зі stdio `cliPath`, тому ви можете вказати для `cliPath` обгортковий скрипт, який підключається через SSH до віддаленого Mac і запускає `imsg`.
|
||||
OpenClaw потребує лише сумісний зі stdio `cliPath`, тож ви можете вказати в `cliPath` скрипт-обгортку, який підключається через SSH до віддаленого Mac і запускає `imsg`.
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
@ -104,8 +104,8 @@ exec ssh -T gateway-host imsg "$@"
|
||||
cliPath: "~/.openclaw/scripts/imsg-ssh",
|
||||
remoteHost: "user@gateway-host", // використовується для отримання вкладень через SCP
|
||||
includeAttachments: true,
|
||||
// Необов’язково: перевизначити дозволені корені вкладень.
|
||||
// Типово включають /Users/*/Library/Messages/Attachments
|
||||
// Необов’язково: перевизначити дозволені кореневі каталоги вкладень.
|
||||
// Типово включає /Users/*/Library/Messages/Attachments
|
||||
attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
|
||||
remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
|
||||
},
|
||||
@ -113,22 +113,22 @@ exec ssh -T gateway-host imsg "$@"
|
||||
}
|
||||
```
|
||||
|
||||
Якщо `remoteHost` не задано, OpenClaw спробує автоматично визначити його, аналізуючи обгортковий SSH-скрипт.
|
||||
`remoteHost` має бути у форматі `host` або `user@host` (без пробілів або параметрів SSH).
|
||||
OpenClaw використовує сувору перевірку ключа хоста для SCP, тому ключ хоста ретранслятора вже має бути присутній у `~/.ssh/known_hosts`.
|
||||
Шляхи вкладень перевіряються відносно дозволених коренів (`attachmentRoots` / `remoteAttachmentRoots`).
|
||||
Якщо `remoteHost` не задано, OpenClaw намагається автоматично визначити його, аналізуючи SSH-скрипт-обгортку.
|
||||
`remoteHost` має бути у форматі `host` або `user@host` (без пробілів чи параметрів SSH).
|
||||
OpenClaw використовує сувору перевірку ключа хоста для SCP, тому ключ хоста ретранслятора вже має бути наявний у `~/.ssh/known_hosts`.
|
||||
Шляхи до вкладень перевіряються на відповідність дозволеним кореневим каталогам (`attachmentRoots` / `remoteAttachmentRoots`).
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Вимоги та дозволи (macOS)
|
||||
|
||||
- У Messages має бути виконано вхід на Mac, де працює `imsg`.
|
||||
- Для контексту процесу, у якому працює OpenClaw/`imsg`, потрібен Full Disk Access (доступ до бази даних Messages).
|
||||
- У Messages має бути виконано вхід на Mac, де запускається `imsg`.
|
||||
- Для контексту процесу, у якому працює OpenClaw/`imsg`, потрібен Full Disk Access (доступ до БД Messages).
|
||||
- Для надсилання повідомлень через Messages.app потрібен дозвіл Automation.
|
||||
|
||||
<Tip>
|
||||
Дозволи надаються для кожного контексту процесу окремо. Якщо gateway працює без графічного інтерфейсу (LaunchAgent/SSH), виконайте одноразову інтерактивну команду в цьому самому контексті, щоб викликати підказки:
|
||||
Дозволи надаються для кожного контексту процесу. Якщо gateway працює без графічного інтерфейсу (LaunchAgent/SSH), виконайте одноразову інтерактивну команду в тому самому контексті, щоб викликати запити:
|
||||
|
||||
```bash
|
||||
imsg chats --limit 1
|
||||
@ -141,17 +141,17 @@ imsg send <handle> "test"
|
||||
## Керування доступом і маршрутизація
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Політика приватних повідомлень">
|
||||
<Tab title="Політика DM">
|
||||
`channels.imessage.dmPolicy` керує прямими повідомленнями:
|
||||
|
||||
- `pairing` (типово)
|
||||
- `allowlist`
|
||||
- `open` (потрібно, щоб `allowFrom` включав `"*"`)
|
||||
- `open` (потребує, щоб `allowFrom` містив `"*"`)
|
||||
- `disabled`
|
||||
|
||||
Поле allowlist: `channels.imessage.allowFrom`.
|
||||
|
||||
Записи allowlist можуть бути дескрипторами або цілями чату (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`).
|
||||
Записи allowlist можуть бути handle або цілі чату (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`).
|
||||
|
||||
</Tab>
|
||||
|
||||
@ -164,49 +164,49 @@ imsg send <handle> "test"
|
||||
|
||||
Allowlist відправників груп: `channels.imessage.groupAllowFrom`.
|
||||
|
||||
Резервний механізм під час виконання: якщо `groupAllowFrom` не задано, перевірки відправників груп iMessage повертаються до `allowFrom`, якщо він доступний.
|
||||
Примітка щодо виконання: якщо `channels.imessage` повністю відсутній, середовище виконання повертається до `groupPolicy="allowlist"` і записує попередження в журнал (навіть якщо задано `channels.defaults.groupPolicy`).
|
||||
Резервна логіка під час виконання: якщо `groupAllowFrom` не задано, перевірки відправників груп iMessage використовують `allowFrom`, якщо воно доступне.
|
||||
Примітка щодо виконання: якщо `channels.imessage` повністю відсутній, під час виконання використовується `groupPolicy="allowlist"` і записується попередження в журнал (навіть якщо задано `channels.defaults.groupPolicy`).
|
||||
|
||||
Керування згадками для груп:
|
||||
Обмеження за згадками для груп:
|
||||
|
||||
- iMessage не має вбудованих метаданих згадок
|
||||
- виявлення згадок використовує regex-шаблони (`agents.list[].groupChat.mentionPatterns`, резервно — `messages.groupChat.mentionPatterns`)
|
||||
- без налаштованих шаблонів керування згадками неможливо забезпечити
|
||||
- виявлення згадок використовує шаблони regex (`agents.list[].groupChat.mentionPatterns`, резервно `messages.groupChat.mentionPatterns`)
|
||||
- якщо шаблони не налаштовані, обмеження за згадками неможливо забезпечити
|
||||
|
||||
Керівні команди від авторизованих відправників можуть обходити вимогу згадки в групах.
|
||||
Команди керування від авторизованих відправників можуть обходити обмеження за згадками в групах.
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="Сесії та детерміновані відповіді">
|
||||
- Для приватних повідомлень використовується пряма маршрутизація; для груп — групова.
|
||||
- За типовим `session.dmScope=main` приватні повідомлення iMessage зводяться до основної сесії агента.
|
||||
- Групові сесії ізольовані (`agent:<agentId>:imessage:group:<chat_id>`).
|
||||
- Відповіді маршрутизуються назад в iMessage з використанням метаданих каналу/цілі походження.
|
||||
<Tab title="Сеанси та детерміновані відповіді">
|
||||
- DM використовують пряму маршрутизацію; групи — групову.
|
||||
- Із типовим `session.dmScope=main` DM iMessage згортаються в основний сеанс агента.
|
||||
- Групові сеанси ізольовані (`agent:<agentId>:imessage:group:<chat_id>`).
|
||||
- Відповіді маршрутизуються назад в iMessage з використанням метаданих початкового каналу/цілі.
|
||||
|
||||
Поведінка потоків, схожих на групові:
|
||||
|
||||
Деякі багатокористувацькі потоки iMessage можуть надходити з `is_group=false`.
|
||||
Якщо такий `chat_id` явно налаштований у `channels.imessage.groups`, OpenClaw обробляє його як груповий трафік (керування групами + ізоляція групової сесії).
|
||||
Деякі багатосторонні потоки iMessage можуть надходити з `is_group=false`.
|
||||
Якщо такий `chat_id` явно налаштовано в `channels.imessage.groups`, OpenClaw обробляє його як груповий трафік (групові обмеження + ізоляція групового сеансу).
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Прив’язки розмов ACP
|
||||
|
||||
Застарілі чати iMessage також можна прив’язувати до сесій ACP.
|
||||
Застарілі чати iMessage також можна прив’язувати до сеансів ACP.
|
||||
|
||||
Швидкий операторський сценарій:
|
||||
Швидкий потік дій оператора:
|
||||
|
||||
- Виконайте `/acp spawn codex --bind here` у приватному повідомленні або дозволеному груповому чаті.
|
||||
- Подальші повідомлення в цій самій розмові iMessage маршрутизуються до створеної сесії ACP.
|
||||
- `/new` і `/reset` скидають цю саму прив’язану сесію ACP на місці.
|
||||
- `/acp close` закриває сесію ACP і видаляє прив’язку.
|
||||
- Виконайте `/acp spawn codex --bind here` у DM або дозволеному груповому чаті.
|
||||
- Майбутні повідомлення в цій самій розмові iMessage маршрутизуватимуться до створеного сеансу ACP.
|
||||
- `/new` і `/reset` скидають той самий прив’язаний сеанс ACP на місці.
|
||||
- `/acp close` закриває сеанс ACP і видаляє прив’язку.
|
||||
|
||||
Налаштовані постійні прив’язки підтримуються через записи верхнього рівня `bindings[]` з `type: "acp"` і `match.channel: "imessage"`.
|
||||
|
||||
`match.peer.id` може використовувати:
|
||||
|
||||
- нормалізований дескриптор приватного повідомлення, наприклад `+15555550123` або `user@example.com`
|
||||
- нормалізований handle DM, наприклад `+15555550123` або `user@example.com`
|
||||
- `chat_id:<id>` (рекомендовано для стабільних групових прив’язок)
|
||||
- `chat_guid:<guid>`
|
||||
- `chat_identifier:<identifier>`
|
||||
@ -241,23 +241,23 @@ imsg send <handle> "test"
|
||||
}
|
||||
```
|
||||
|
||||
Див. [ACP Agents](/tools/acp-agents) щодо спільної поведінки прив’язок ACP.
|
||||
Див. [ACP Agents](/uk/tools/acp-agents) для спільної поведінки прив’язки ACP.
|
||||
|
||||
## Сценарії розгортання
|
||||
## Шаблони розгортання
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Виділений користувач macOS для бота (окрема ідентичність iMessage)">
|
||||
Використовуйте окремий Apple ID і користувача macOS, щоб трафік бота був ізольований від вашого особистого профілю Messages.
|
||||
<Accordion title="Виділений macOS-користувач бота (окрема ідентичність iMessage)">
|
||||
Використовуйте окремий Apple ID і macOS-користувача, щоб трафік бота був ізольований від вашого особистого профілю Messages.
|
||||
|
||||
Типовий сценарій:
|
||||
Типовий потік:
|
||||
|
||||
1. Створіть окремого користувача macOS і ввійдіть у нього.
|
||||
1. Створіть окремого macOS-користувача і виконайте вхід.
|
||||
2. Увійдіть у Messages з Apple ID бота в цьому користувачі.
|
||||
3. Установіть `imsg` у цього користувача.
|
||||
3. Встановіть `imsg` для цього користувача.
|
||||
4. Створіть SSH-обгортку, щоб OpenClaw міг запускати `imsg` у контексті цього користувача.
|
||||
5. Вкажіть `channels.imessage.accounts.<id>.cliPath` і `.dbPath` на профіль цього користувача.
|
||||
5. Спрямуйте `channels.imessage.accounts.<id>.cliPath` і `.dbPath` на профіль цього користувача.
|
||||
|
||||
Перший запуск може вимагати підтверджень у графічному інтерфейсі (Automation + Full Disk Access) у сесії цього користувача бота.
|
||||
Під час першого запуску можуть знадобитися підтвердження через GUI (Automation + Full Disk Access) у сеансі цього користувача бота.
|
||||
|
||||
</Accordion>
|
||||
|
||||
@ -290,36 +290,36 @@ imsg send <handle> "test"
|
||||
exec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"
|
||||
```
|
||||
|
||||
Використовуйте ключі SSH, щоб і SSH, і SCP були неінтерактивними.
|
||||
Спочатку переконайтеся, що ключ хоста довірений (наприклад, `ssh bot@mac-mini.tailnet-1234.ts.net`), щоб заповнити `known_hosts`.
|
||||
Використовуйте SSH-ключі, щоб і SSH, і SCP працювали без взаємодії.
|
||||
Спочатку переконайтеся, що ключ хоста довірений (наприклад, `ssh bot@mac-mini.tailnet-1234.ts.net`), щоб було заповнено `known_hosts`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Шаблон із кількома обліковими записами">
|
||||
iMessage підтримує конфігурацію для кожного облікового запису окремо в `channels.imessage.accounts`.
|
||||
iMessage підтримує конфігурацію для кожного облікового запису в `channels.imessage.accounts`.
|
||||
|
||||
Для кожного облікового запису можна перевизначити такі поля, як `cliPath`, `dbPath`, `allowFrom`, `groupPolicy`, `mediaMaxMb`, налаштування історії та allowlist коренів вкладень.
|
||||
Для кожного облікового запису можна перевизначати такі поля, як `cliPath`, `dbPath`, `allowFrom`, `groupPolicy`, `mediaMaxMb`, налаштування історії та allowlist кореневих каталогів вкладень.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Медіа, фрагментація та цілі доставки
|
||||
## Медіа, розбиття на частини та цілі доставки
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Вкладення та медіа">
|
||||
- отримання вхідних вкладень є необов’язковим: `channels.imessage.includeAttachments`
|
||||
- шляхи віддалених вкладень можна отримувати через SCP, коли задано `remoteHost`
|
||||
- шляхи вкладень мають відповідати дозволеним кореням:
|
||||
- отримання вхідних вкладень необов’язкове: `channels.imessage.includeAttachments`
|
||||
- шляхи до віддалених вкладень можна отримувати через SCP, якщо задано `remoteHost`
|
||||
- шляхи до вкладень мають відповідати дозволеним кореневим каталогам:
|
||||
- `channels.imessage.attachmentRoots` (локально)
|
||||
- `channels.imessage.remoteAttachmentRoots` (віддалений режим SCP)
|
||||
- типовий шаблон кореня: `/Users/*/Library/Messages/Attachments`
|
||||
- типовий шаблон кореневого каталогу: `/Users/*/Library/Messages/Attachments`
|
||||
- SCP використовує сувору перевірку ключа хоста (`StrictHostKeyChecking=yes`)
|
||||
- розмір вихідного медіа керується `channels.imessage.mediaMaxMb` (типово 16 MB)
|
||||
- розмір вихідних медіа визначається `channels.imessage.mediaMaxMb` (типово 16 MB)
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Фрагментація вихідних повідомлень">
|
||||
- ліміт фрагмента тексту: `channels.imessage.textChunkLimit` (типово 4000)
|
||||
- режим фрагментації: `channels.imessage.chunkMode`
|
||||
<Accordion title="Вихідне розбиття на частини">
|
||||
- ліміт частини тексту: `channels.imessage.textChunkLimit` (типово 4000)
|
||||
- режим розбиття: `channels.imessage.chunkMode`
|
||||
- `length` (типово)
|
||||
- `newline` (розбиття спочатку за абзацами)
|
||||
</Accordion>
|
||||
@ -331,7 +331,7 @@ exec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"
|
||||
- `chat_guid:...`
|
||||
- `chat_identifier:...`
|
||||
|
||||
Також підтримуються цілі-дескриптори:
|
||||
Також підтримуються цілі-handle:
|
||||
|
||||
- `imessage:+1555...`
|
||||
- `sms:+1555...`
|
||||
@ -344,11 +344,11 @@ imsg chats --limit 20
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Запис конфігурації
|
||||
## Записи конфігурації
|
||||
|
||||
iMessage типово дозволяє ініційований каналом запис конфігурації (для `/config set|unset`, коли `commands.config: true`).
|
||||
iMessage типово дозволяє ініційовані каналом записи конфігурації (для `/config set|unset`, коли `commands.config: true`).
|
||||
|
||||
Вимкнення:
|
||||
Вимкнути:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -360,11 +360,11 @@ iMessage типово дозволяє ініційований каналом
|
||||
}
|
||||
```
|
||||
|
||||
## Усунення несправностей
|
||||
## Усунення неполадок
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="imsg не знайдено або RPC не підтримується">
|
||||
Перевірте бінарний файл і підтримку RPC:
|
||||
Перевірте двійковий файл і підтримку RPC:
|
||||
|
||||
```bash
|
||||
imsg rpc --help
|
||||
@ -375,12 +375,12 @@ openclaw channels status --probe
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Приватні повідомлення ігноруються">
|
||||
<Accordion title="DM ігноруються">
|
||||
Перевірте:
|
||||
|
||||
- `channels.imessage.dmPolicy`
|
||||
- `channels.imessage.allowFrom`
|
||||
- підтвердження прив’язки (`openclaw pairing list imessage`)
|
||||
- підтвердження сполучення (`openclaw pairing list imessage`)
|
||||
|
||||
</Accordion>
|
||||
|
||||
@ -389,8 +389,8 @@ openclaw channels status --probe
|
||||
|
||||
- `channels.imessage.groupPolicy`
|
||||
- `channels.imessage.groupAllowFrom`
|
||||
- поведінку allowlist для `channels.imessage.groups`
|
||||
- налаштування шаблонів згадок (`agents.list[].groupChat.mentionPatterns`)
|
||||
- поведінку allowlist у `channels.imessage.groups`
|
||||
- конфігурацію шаблонів згадок (`agents.list[].groupChat.mentionPatterns`)
|
||||
|
||||
</Accordion>
|
||||
|
||||
@ -399,36 +399,36 @@ openclaw channels status --probe
|
||||
|
||||
- `channels.imessage.remoteHost`
|
||||
- `channels.imessage.remoteAttachmentRoots`
|
||||
- автентифікацію ключами SSH/SCP з хоста gateway
|
||||
- наявність ключа хоста в `~/.ssh/known_hosts` на хості gateway
|
||||
- автентифікацію ключем SSH/SCP з хоста gateway
|
||||
- чи є ключ хоста в `~/.ssh/known_hosts` на хості gateway
|
||||
- читабельність віддаленого шляху на Mac, де працює Messages
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Підказки дозволів macOS були пропущені">
|
||||
Повторно виконайте в інтерактивному GUI-терміналі в тому самому контексті користувача/сесії та підтвердьте підказки:
|
||||
<Accordion title="Запити дозволів macOS було пропущено">
|
||||
Повторно запустіть в інтерактивному GUI-терміналі в тому самому контексті користувача/сеансу і підтвердьте запити:
|
||||
|
||||
```bash
|
||||
imsg chats --limit 1
|
||||
imsg send <handle> "test"
|
||||
```
|
||||
|
||||
Переконайтеся, що Full Disk Access і Automation надано для контексту процесу, у якому працює OpenClaw/`imsg`.
|
||||
Переконайтеся, що Full Disk Access і Automation надано для контексту процесу, який запускає OpenClaw/`imsg`.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Вказівники на довідкові матеріали з конфігурації
|
||||
## Вказівники на довідник із конфігурації
|
||||
|
||||
- [Довідник з конфігурації - iMessage](/gateway/configuration-reference#imessage)
|
||||
- [Конфігурація gateway](/gateway/configuration)
|
||||
- [Прив’язка](/channels/pairing)
|
||||
- [BlueBubbles](/channels/bluebubbles)
|
||||
- [Довідник із конфігурації - iMessage](/uk/gateway/configuration-reference#imessage)
|
||||
- [Конфігурація Gateway](/uk/gateway/configuration)
|
||||
- [Сполучення](/uk/channels/pairing)
|
||||
- [BlueBubbles](/uk/channels/bluebubbles)
|
||||
|
||||
## Пов’язане
|
||||
|
||||
- [Огляд каналів](/channels) — усі підтримувані канали
|
||||
- [Прив’язка](/channels/pairing) — автентифікація приватних повідомлень і сценарій прив’язки
|
||||
- [Групи](/channels/groups) — поведінка групового чату та керування згадками
|
||||
- [Маршрутизація каналів](/channels/channel-routing) — маршрутизація сесій для повідомлень
|
||||
- [Безпека](/gateway/security) — модель доступу та посилення захисту
|
||||
- [Огляд каналів](/uk/channels) — усі підтримувані канали
|
||||
- [Сполучення](/uk/channels/pairing) — автентифікація DM і потік сполучення
|
||||
- [Групи](/uk/channels/groups) — поведінка групових чатів і обмеження за згадками
|
||||
- [Маршрутизація каналів](/uk/channels/channel-routing) — маршрутизація сеансів для повідомлень
|
||||
- [Безпека](/uk/gateway/security) — модель доступу та посилення захисту
|
||||
|
||||
@ -1,37 +1,36 @@
|
||||
---
|
||||
read_when:
|
||||
- Працюємо над функціями каналу Microsoft Teams
|
||||
summary: Статус підтримки бота Microsoft Teams, можливості та конфігурація
|
||||
- Робота над функціями каналу Microsoft Teams
|
||||
summary: Статус підтримки бота Microsoft Teams, можливості та налаштування
|
||||
title: Microsoft Teams
|
||||
x-i18n:
|
||||
generated_at: "2026-04-21T20:37:36Z"
|
||||
generated_at: "2026-04-21T21:27:20Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: ed973d8948bc5c5b44f5bc28f361e883389ececc70403c6631fb18ee1254d542
|
||||
source_hash: ee9d52fb2cc7801e84249a705e0fa2052d4afbb7ef58cee2d3362b3e7012348c
|
||||
source_path: channels/msteams.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Microsoft Teams
|
||||
|
||||
> «Полиште всяку надію, ті, хто сюди входить».
|
||||
> «Полиште надію всяк, хто входить сюди».
|
||||
|
||||
Оновлено: 2026-03-25
|
||||
|
||||
Статус: підтримуються текст + вкладення в 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
|
||||
|
||||
Microsoft Teams постачається як вбудований Plugin у поточних релізах OpenClaw, тому в звичайній пакетованій збірці окреме встановлення не потрібне.
|
||||
Microsoft Teams постачається як вбудований Plugin у поточних релізах OpenClaw, тож
|
||||
в окремому встановленні немає потреби у звичайній пакетованій збірці.
|
||||
|
||||
Якщо ви використовуєте старішу збірку або власне встановлення без вбудованого Teams,
|
||||
Якщо ви використовуєте старішу збірку або спеціальне встановлення, що не містить вбудований Teams,
|
||||
встановіть його вручну:
|
||||
|
||||
```bash
|
||||
openclaw plugins install @openclaw/msteams
|
||||
```
|
||||
|
||||
Локальний checkout (коли запускаєте з git-репозиторію):
|
||||
Локальний checkout (під час запуску з git-репозиторію):
|
||||
|
||||
```bash
|
||||
openclaw plugins install ./path/to/local/msteams-plugin
|
||||
@ -42,8 +41,8 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
## Швидке налаштування (для початківців)
|
||||
|
||||
1. Переконайтеся, що Plugin Microsoft Teams доступний.
|
||||
- Поточні пакетовані релізи OpenClaw уже містять його вбудованим.
|
||||
- У старіших/власних встановленнях його можна додати вручну командами вище.
|
||||
- Поточні пакетовані релізи OpenClaw уже містять його вбудовано.
|
||||
- У старіших/спеціальних встановленнях його можна додати вручну командами вище.
|
||||
2. Створіть **Azure Bot** (App ID + client secret + tenant ID).
|
||||
3. Налаштуйте OpenClaw з цими обліковими даними.
|
||||
4. Відкрийте `/api/messages` (типово порт 3978) через публічний URL або тунель.
|
||||
@ -67,19 +66,19 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
|
||||
Для production-розгортань розгляньте використання [federated authentication](#federated-authentication-certificate--managed-identity) (сертифікат або managed identity) замість client secret.
|
||||
|
||||
Примітка: групові чати типово заблоковані (`channels.msteams.groupPolicy: "allowlist"`). Щоб дозволити відповіді в групах, задайте `channels.msteams.groupAllowFrom` (або використайте `groupPolicy: "open"`, щоб дозволити будь-якому учаснику, за умови згадки).
|
||||
Примітка: групові чати типово заблоковані (`channels.msteams.groupPolicy: "allowlist"`). Щоб дозволити відповіді в групах, задайте `channels.msteams.groupAllowFrom` (або використайте `groupPolicy: "open"`, щоб дозволити будь-якому учаснику, з обов’язковою згадкою).
|
||||
|
||||
## Цілі
|
||||
|
||||
- Спілкуватися з OpenClaw через Teams DM, групові чати або канали.
|
||||
- Зберігати детерміновану маршрутизацію: відповіді завжди повертаються в канал, звідки вони надійшли.
|
||||
- Типово використовувати безпечну поведінку в каналах (потрібні згадки, якщо не налаштовано інакше).
|
||||
- Зберігати детерміновану маршрутизацію: відповіді завжди повертаються в той канал, звідки вони надійшли.
|
||||
- Типово використовувати безпечну поведінку каналу (згадки обов’язкові, якщо не налаштовано інакше).
|
||||
|
||||
## Записи конфігурації
|
||||
## Запис конфігурації
|
||||
|
||||
Типово Microsoft Teams дозволено записувати оновлення конфігурації, ініційовані `/config set|unset` (потрібно `commands.config: true`).
|
||||
Типово Microsoft Teams дозволено записувати оновлення конфігурації, ініційовані `/config set|unset` (потребує `commands.config: true`).
|
||||
|
||||
Вимкнути можна так:
|
||||
Щоб вимкнути:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -87,21 +86,21 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
}
|
||||
```
|
||||
|
||||
## Контроль доступу (DM + групи)
|
||||
## Керування доступом (DM + групи)
|
||||
|
||||
**Доступ до DM**
|
||||
|
||||
- Типово: `channels.msteams.dmPolicy = "pairing"`. Невідомі відправники ігноруються, доки їх не буде схвалено.
|
||||
- Типово: `channels.msteams.dmPolicy = "pairing"`. Невідомі відправники ігноруються, доки їх не схвалять.
|
||||
- `channels.msteams.allowFrom` має використовувати стабільні AAD object ID.
|
||||
- UPN/display name є змінними; пряме зіставлення типово вимкнене й вмикається лише через `channels.msteams.dangerouslyAllowNameMatching: true`.
|
||||
- UPN/display name можуть змінюватися; пряме зіставлення типово вимкнене й вмикається лише через `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: "disabled"`.
|
||||
- Типово: `channels.msteams.groupPolicy = "allowlist"` (заблоковано, доки ви не додасте `groupAllowFrom`). Використовуйте `channels.defaults.groupPolicy`, щоб змінити типову поведінку, якщо значення не задане.
|
||||
- `channels.msteams.groupAllowFrom` визначає, які відправники можуть ініціювати дію в групових чатах/каналах (з резервним використанням `channels.msteams.allowFrom`).
|
||||
- Установіть `groupPolicy: "open"`, щоб дозволити будь-якого учасника (типово все одно потрібна згадка).
|
||||
- Щоб заборонити **усі канали**, задайте `channels.msteams.groupPolicy: "disabled"`.
|
||||
|
||||
Приклад:
|
||||
|
||||
@ -118,12 +117,12 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
|
||||
**Teams + allowlist каналів**
|
||||
|
||||
- Обмежуйте відповіді в групах/каналах, перелічивши команди Teams і канали в `channels.msteams.teams`.
|
||||
- Обмежуйте відповіді в групах/каналах, перелічуючи teams і канали в `channels.msteams.teams`.
|
||||
- Ключі мають використовувати стабільні team ID і channel conversation ID.
|
||||
- Коли `groupPolicy="allowlist"` і присутній allowlist Teams, приймаються лише перелічені команди/канали (за умови згадки).
|
||||
- Майстер налаштування приймає записи `Team/Channel` і зберігає їх для вас.
|
||||
- Під час запуску OpenClaw зіставляє назви team/channel і allowlist користувачів з ID (коли це дозволяють дозволи Graph)
|
||||
і журналює це зіставлення; нерозпізнані назви team/channel зберігаються в тому вигляді, як були введені, але типово ігноруються для маршрутизації, якщо не ввімкнено `channels.msteams.dangerouslyAllowNameMatching: true`.
|
||||
- Коли `groupPolicy="allowlist"` і задано allowlist teams, приймаються лише перелічені teams/канали (з обов’язковою згадкою).
|
||||
- Майстер налаштування приймає записи `Team/Channel` і збереже їх для вас.
|
||||
- Під час запуску OpenClaw зіставляє team/channel та імена користувачів з ID (коли це дозволяють дозволи Graph)
|
||||
і записує зіставлення в журнал; нерозпізнані назви team/channel зберігаються як введені, але типово ігноруються для маршрутизації, якщо не ввімкнено `channels.msteams.dangerouslyAllowNameMatching: true`.
|
||||
|
||||
Приклад:
|
||||
|
||||
@ -147,11 +146,11 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
## Як це працює
|
||||
|
||||
1. Переконайтеся, що Plugin Microsoft Teams доступний.
|
||||
- Поточні пакетовані релізи OpenClaw уже містять його вбудованим.
|
||||
- У старіших/власних встановленнях його можна додати вручну командами вище.
|
||||
- Поточні пакетовані релізи OpenClaw уже містять його вбудовано.
|
||||
- У старіших/спеціальних встановленнях його можна додати вручну командами вище.
|
||||
2. Створіть **Azure Bot** (App ID + secret + tenant ID).
|
||||
3. Створіть **пакет застосунку Teams**, який посилається на бота й містить наведені нижче дозволи RSC.
|
||||
4. Завантажте/встановіть застосунок Teams у команду (або в особистий scope для DM).
|
||||
3. Зберіть **пакет застосунку Teams**, який посилається на бота й містить дозволи RSC нижче.
|
||||
4. Завантажте/встановіть застосунок Teams у team (або в personal scope для DM).
|
||||
5. Налаштуйте `msteams` у `~/.openclaw/openclaw.json` (або через env vars) і запустіть Gateway.
|
||||
6. Gateway типово слухає webhook-трафік Bot Framework на `/api/messages`.
|
||||
|
||||
@ -164,18 +163,18 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
1. Перейдіть до [Create Azure Bot](https://portal.azure.com/#create/Microsoft.AzureBot)
|
||||
2. Заповніть вкладку **Basics**:
|
||||
|
||||
| Поле | Значення |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------- |
|
||||
| **Bot handle** | Назва вашого бота, наприклад `openclaw-msteams` (має бути унікальною) |
|
||||
| **Subscription** | Виберіть свою підписку Azure |
|
||||
| **Subscription** | Виберіть вашу підписку Azure |
|
||||
| **Resource group** | Створіть нову або використайте наявну |
|
||||
| **Pricing tier** | **Free** для dev/тестування |
|
||||
| **Pricing tier** | **Free** для розробки/тестування |
|
||||
| **Type of App** | **Single Tenant** (рекомендовано — див. примітку нижче) |
|
||||
| **Creation type** | **Create new Microsoft App ID** |
|
||||
|
||||
> **Сповіщення про застарівання:** створення нових multi-tenant ботів було застарілим після 2025-07-31. Для нових ботів використовуйте **Single Tenant**.
|
||||
> **Повідомлення про застарівання:** створення нових multi-tenant ботів застаріло після 2025-07-31. Для нових ботів використовуйте **Single Tenant**.
|
||||
|
||||
3. Натисніть **Review + create** → **Create** (зачекайте приблизно 1–2 хвилини)
|
||||
3. Натисніть **Review + create** → **Create** (зачекайте ~1-2 хвилини)
|
||||
|
||||
### Крок 2: Отримайте облікові дані
|
||||
|
||||
@ -185,10 +184,10 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
4. У розділі **Certificates & secrets** → **New client secret** → скопіюйте **Value** → це ваш `appPassword`
|
||||
5. Перейдіть до **Overview** → скопіюйте **Directory (tenant) ID** → це ваш `tenantId`
|
||||
|
||||
### Крок 3: Налаштуйте Messaging endpoint
|
||||
### Крок 3: Налаштуйте кінцеву точку обміну повідомленнями
|
||||
|
||||
1. У Azure Bot → **Configuration**
|
||||
2. Установіть **Messaging endpoint** на URL вашого webhook:
|
||||
2. Установіть **Messaging endpoint** на ваш webhook URL:
|
||||
- Production: `https://your-domain.com/api/messages`
|
||||
- Локальна розробка: використайте тунель (див. [Локальна розробка](#local-development-tunneling) нижче)
|
||||
|
||||
@ -198,7 +197,7 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
2. Натисніть **Microsoft Teams** → Configure → Save
|
||||
3. Прийміть Terms of Service
|
||||
|
||||
## Federated Authentication (Certificate + Managed Identity)
|
||||
## Federated Authentication (сертифікат + managed identity)
|
||||
|
||||
> Додано в 2026.3.24
|
||||
|
||||
@ -206,11 +205,11 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
|
||||
### Варіант A: автентифікація на основі сертифіката
|
||||
|
||||
Використовуйте PEM-сертифікат, зареєстрований у вашому застосунку Entra ID app registration.
|
||||
Використовуйте PEM-сертифікат, зареєстрований у вашому застосунку Entra ID.
|
||||
|
||||
**Налаштування:**
|
||||
|
||||
1. Згенеруйте або отримайте сертифікат (формат PEM із приватним ключем).
|
||||
1. Згенеруйте або отримайте сертифікат (формат PEM із private key).
|
||||
2. У Entra ID → App Registration → **Certificates & secrets** → **Certificates** → завантажте публічний сертифікат.
|
||||
|
||||
**Конфігурація:**
|
||||
@ -237,19 +236,19 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
|
||||
### Варіант B: Azure Managed Identity
|
||||
|
||||
Використовуйте Azure Managed Identity для автентифікації без пароля. Це ідеально для розгортань в інфраструктурі Azure (AKS, App Service, Azure VMs), де доступна managed identity.
|
||||
Використовуйте Azure Managed Identity для автентифікації без пароля. Це ідеальний варіант для розгортань в інфраструктурі Azure (AKS, App Service, Azure VM), де доступна managed identity.
|
||||
|
||||
**Як це працює:**
|
||||
|
||||
1. Pod/VM бота має managed identity (system-assigned або user-assigned).
|
||||
2. **Federated identity credential** пов’язує managed identity із застосунком Entra ID app registration.
|
||||
3. Під час виконання OpenClaw використовує `@azure/identity`, щоб отримувати токени з endpoint Azure IMDS (`169.254.169.254`).
|
||||
4. Токен передається в Teams SDK для автентифікації бота.
|
||||
2. **Federated identity credential** пов’язує managed identity із застосунком Entra ID.
|
||||
3. Під час виконання OpenClaw використовує `@azure/identity`, щоб отримувати токени з кінцевої точки Azure IMDS (`169.254.169.254`).
|
||||
4. Токен передається до Teams SDK для автентифікації бота.
|
||||
|
||||
**Передумови:**
|
||||
|
||||
- Інфраструктура Azure з увімкненою managed identity (AKS workload identity, App Service, VM)
|
||||
- Створений federated identity credential у застосунку Entra ID app registration
|
||||
- Створений federated identity credential у застосунку Entra ID
|
||||
- Мережевий доступ до IMDS (`169.254.169.254:80`) з pod/VM
|
||||
|
||||
**Конфігурація (system-assigned managed identity):**
|
||||
@ -297,8 +296,8 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
|
||||
Для розгортань AKS із workload identity:
|
||||
|
||||
1. **Увімкніть workload identity** у своєму кластері AKS.
|
||||
2. **Створіть federated identity credential** у застосунку Entra ID app registration:
|
||||
1. **Увімкніть workload identity** у вашому кластері AKS.
|
||||
2. **Створіть federated identity credential** у застосунку Entra ID:
|
||||
|
||||
```bash
|
||||
az ad app federated-credential create --id <APP_OBJECT_ID> --parameters '{
|
||||
@ -309,7 +308,7 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
}'
|
||||
```
|
||||
|
||||
3. **Додайте анотацію до service account Kubernetes** із client ID застосунку:
|
||||
3. **Додайте анотацію до service account Kubernetes** з app client ID:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
@ -320,7 +319,7 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
azure.workload.identity/client-id: "<APP_CLIENT_ID>"
|
||||
```
|
||||
|
||||
4. **Додайте label до pod** для інʼєкції workload identity:
|
||||
4. **Додайте мітку pod** для ін’єкції workload identity:
|
||||
|
||||
```yaml
|
||||
metadata:
|
||||
@ -328,21 +327,21 @@ openclaw plugins install ./path/to/local/msteams-plugin
|
||||
azure.workload.identity/use: "true"
|
||||
```
|
||||
|
||||
5. **Переконайтеся в наявності мережевого доступу** до IMDS (`169.254.169.254`) — якщо використовується NetworkPolicy, додайте правило egress, що дозволяє трафік до `169.254.169.254/32` на порт 80.
|
||||
5. **Забезпечте мережевий доступ** до IMDS (`169.254.169.254`) — якщо ви використовуєте NetworkPolicy, додайте правило egress, яке дозволяє трафік до `169.254.169.254/32` на порт 80.
|
||||
|
||||
### Порівняння типів автентифікації
|
||||
|
||||
| Метод | Конфігурація | Переваги | Недоліки |
|
||||
| Method | Config | Pros | Cons |
|
||||
| -------------------- | ---------------------------------------------- | ---------------------------------- | ------------------------------------- |
|
||||
| **Client secret** | `appPassword` | Просте налаштування | Потрібна ротація секретів, менш безпечно |
|
||||
| **Certificate** | `authType: "federated"` + `certificatePath` | Немає спільного секрету в мережі | Додаткові витрати на керування сертифікатами |
|
||||
| **Managed Identity** | `authType: "federated"` + `useManagedIdentity` | Без пароля, не потрібно керувати секретами | Потрібна інфраструктура Azure |
|
||||
| **Certificate** | `authType: "federated"` + `certificatePath` | Немає спільного секрету в мережі | Додаткове навантаження на керування сертифікатами |
|
||||
| **Managed Identity** | `authType: "federated"` + `useManagedIdentity` | Автентифікація без пароля, не треба керувати секретами | Потрібна інфраструктура Azure |
|
||||
|
||||
**Типова поведінка:** якщо `authType` не задано, OpenClaw типово використовує автентифікацію через client secret. Наявні конфігурації продовжують працювати без змін.
|
||||
**Поведінка за замовчуванням:** якщо `authType` не задано, OpenClaw типово використовує автентифікацію через client secret. Наявні конфігурації й надалі працюватимуть без змін.
|
||||
|
||||
## Локальна розробка (тунелювання)
|
||||
|
||||
Teams не може дістатися до `localhost`. Для локальної розробки використовуйте тунель:
|
||||
Teams не може звертатися до `localhost`. Для локальної розробки використовуйте тунель:
|
||||
|
||||
**Варіант A: ngrok**
|
||||
|
||||
@ -361,17 +360,17 @@ tailscale funnel 3978
|
||||
|
||||
## Teams Developer Portal (альтернатива)
|
||||
|
||||
Замість ручного створення ZIP-файлу маніфесту, ви можете скористатися [Teams Developer Portal](https://dev.teams.microsoft.com/apps):
|
||||
Замість ручного створення ZIP-файлу маніфесту ви можете скористатися [Teams Developer Portal](https://dev.teams.microsoft.com/apps):
|
||||
|
||||
1. Натисніть **+ New app**
|
||||
2. Заповніть базову інформацію (назва, опис, інформація про розробника)
|
||||
3. Перейдіть до **App features** → **Bot**
|
||||
4. Виберіть **Enter a bot ID manually** і вставте App ID вашого Azure Bot
|
||||
5. Позначте scope: **Personal**, **Team**, **Group Chat**
|
||||
4. Виберіть **Enter a bot ID manually** і вставте ваш Azure Bot App ID
|
||||
5. Позначте області: **Personal**, **Team**, **Group Chat**
|
||||
6. Натисніть **Distribute** → **Download app package**
|
||||
7. У Teams: **Apps** → **Manage your apps** → **Upload a custom app** → виберіть ZIP
|
||||
|
||||
Це часто простіше, ніж редагувати JSON-маніфести вручну.
|
||||
Часто це простіше, ніж редагувати JSON-маніфести вручну.
|
||||
|
||||
## Тестування бота
|
||||
|
||||
@ -379,21 +378,21 @@ tailscale funnel 3978
|
||||
|
||||
1. У Azure Portal → ваш ресурс Azure Bot → **Test in Web Chat**
|
||||
2. Надішліть повідомлення — ви маєте побачити відповідь
|
||||
3. Це підтверджує, що ваш endpoint webhook працює до налаштування Teams
|
||||
3. Це підтверджує, що ваш webhook endpoint працює до налаштування Teams
|
||||
|
||||
**Варіант B: Teams (після встановлення застосунку)**
|
||||
|
||||
1. Встановіть застосунок Teams (sideload або через org catalog)
|
||||
1. Встановіть застосунок Teams (sideload або через каталог організації)
|
||||
2. Знайдіть бота в Teams і надішліть DM
|
||||
3. Перевірте журнали Gateway на вхідну activity
|
||||
3. Перевірте журнали Gateway на вхідну активність
|
||||
|
||||
## Налаштування (мінімальний лише текстовий режим)
|
||||
|
||||
1. **Переконайтеся, що Plugin Microsoft Teams доступний**
|
||||
- Поточні пакетовані релізи OpenClaw уже містять його вбудованим.
|
||||
- У старіших/власних встановленнях його можна додати вручну:
|
||||
- Поточні пакетовані релізи OpenClaw уже містять його вбудовано.
|
||||
- У старіших/спеціальних встановленнях його можна додати вручну:
|
||||
- З npm: `openclaw plugins install @openclaw/msteams`
|
||||
- Із локального checkout: `openclaw plugins install ./path/to/local/msteams-plugin`
|
||||
- З локального checkout: `openclaw plugins install ./path/to/local/msteams-plugin`
|
||||
|
||||
2. **Реєстрація бота**
|
||||
- Створіть Azure Bot (див. вище) і занотуйте:
|
||||
@ -402,12 +401,12 @@ tailscale funnel 3978
|
||||
- Tenant ID (single-tenant)
|
||||
|
||||
3. **Маніфест застосунку Teams**
|
||||
- Додайте запис `bot` із `botId = <App ID>`.
|
||||
- Scope: `personal`, `team`, `groupChat`.
|
||||
- `supportsFiles: true` (потрібно для обробки файлів в особистому scope).
|
||||
- Додайте запис `bot` з `botId = <App ID>`.
|
||||
- Області: `personal`, `team`, `groupChat`.
|
||||
- `supportsFiles: true` (обов’язково для обробки файлів у personal scope).
|
||||
- Додайте дозволи RSC (нижче).
|
||||
- Створіть іконки: `outline.png` (32x32) і `color.png` (192x192).
|
||||
- Заархівуйте всі три файли разом: `manifest.json`, `outline.png`, `color.png`.
|
||||
- Запакуйте всі три файли разом: `manifest.json`, `outline.png`, `color.png`.
|
||||
|
||||
4. **Налаштуйте OpenClaw**
|
||||
|
||||
@ -430,12 +429,12 @@ tailscale funnel 3978
|
||||
- `MSTEAMS_APP_PASSWORD`
|
||||
- `MSTEAMS_TENANT_ID`
|
||||
- `MSTEAMS_AUTH_TYPE` (необов’язково: `"secret"` або `"federated"`)
|
||||
- `MSTEAMS_CERTIFICATE_PATH` (federated + certificate)
|
||||
- `MSTEAMS_CERTIFICATE_PATH` (federated + сертифікат)
|
||||
- `MSTEAMS_CERTIFICATE_THUMBPRINT` (необов’язково, не потрібен для автентифікації)
|
||||
- `MSTEAMS_USE_MANAGED_IDENTITY` (federated + managed identity)
|
||||
- `MSTEAMS_MANAGED_IDENTITY_CLIENT_ID` (лише для user-assigned MI)
|
||||
|
||||
5. **Endpoint бота**
|
||||
5. **Кінцева точка бота**
|
||||
- Установіть Azure Bot Messaging Endpoint на:
|
||||
- `https://<host>:3978/api/messages` (або ваш вибраний path/port).
|
||||
|
||||
@ -444,31 +443,31 @@ tailscale funnel 3978
|
||||
|
||||
## Дія інформації про учасника
|
||||
|
||||
OpenClaw надає підтримувану Graph дію `member-info` для Microsoft Teams, щоб агенти й автоматизації могли напряму отримувати відомості про учасників каналу (display name, email, role) з Microsoft Graph.
|
||||
OpenClaw надає для Microsoft Teams дію `member-info`, що працює через Graph, щоб агенти й автоматизації могли напряму отримувати відомості про учасників каналу (display name, email, роль) із Microsoft Graph.
|
||||
|
||||
Вимоги:
|
||||
|
||||
- Дозвіл RSC `Member.Read.Group` (уже є в рекомендованому маніфесті)
|
||||
- Для міжкомандного пошуку: дозвіл Graph Application `User.Read.All` з admin consent
|
||||
- Для пошуку між teams: дозвіл Graph Application `User.Read.All` з admin consent
|
||||
|
||||
Дія контролюється `channels.msteams.actions.memberInfo` (типово: увімкнено, коли доступні облікові дані Graph).
|
||||
Дія контролюється через `channels.msteams.actions.memberInfo` (типово: увімкнено, коли доступні облікові дані Graph).
|
||||
|
||||
## Контекст історії
|
||||
|
||||
- `channels.msteams.historyLimit` визначає, скільки останніх повідомлень каналу/групи буде загорнуто в prompt.
|
||||
- `channels.msteams.historyLimit` керує кількістю недавніх повідомлень каналу/групи, які додаються до prompt.
|
||||
- Використовує резервне значення з `messages.groupChat.historyLimit`. Установіть `0`, щоб вимкнути (типово 50).
|
||||
- Отримана історія гілки фільтрується за allowlist відправників (`allowFrom` / `groupAllowFrom`), тож початкове заповнення контексту гілки включає лише повідомлення від дозволених відправників.
|
||||
- Контекст quoted attachment (`ReplyTo*`, похідний від HTML відповіді Teams) наразі передається як отримано.
|
||||
- Інакше кажучи, allowlist керують тим, хто може запускати агента; сьогодні фільтруються лише окремі шляхи додаткового контексту.
|
||||
- Історію DM можна обмежити через `channels.msteams.dmHistoryLimit` (ходи користувача). Перевизначення для окремих користувачів: `channels.msteams.dms["<user_id>"].historyLimit`.
|
||||
- Отримана історія треду фільтрується за allowlist відправників (`allowFrom` / `groupAllowFrom`), тож початкове наповнення контексту треду містить лише повідомлення від дозволених відправників.
|
||||
- Контекст цитованих вкладень (`ReplyTo*`, похідний від HTML відповіді Teams) зараз передається як отриманий.
|
||||
- Інакше кажучи, allowlists контролюють, хто може активувати агента; наразі фільтруються лише окремі шляхи додаткового контексту.
|
||||
- Історію DM можна обмежити через `channels.msteams.dmHistoryLimit` (ходи користувача). Перевизначення для конкретного користувача: `channels.msteams.dms["<user_id>"].historyLimit`.
|
||||
|
||||
## Поточні дозволи Teams RSC (маніфест)
|
||||
|
||||
Це **наявні resourceSpecific permissions** у нашому маніфесті застосунку Teams. Вони застосовуються лише в межах команди/чату, де встановлено застосунок.
|
||||
Це **наявні resourceSpecific permissions** у маніфесті нашого застосунку Teams. Вони діють лише в межах team/chat, де встановлено застосунок.
|
||||
|
||||
**Для каналів (scope команди):**
|
||||
**Для каналів (область team):**
|
||||
|
||||
- `ChannelMessage.Read.Group` (Application) — отримання тексту всіх повідомлень каналу без @mention
|
||||
- `ChannelMessage.Read.Group` (Application) — отримувати всі текстові повідомлення каналу без @mention
|
||||
- `ChannelMessage.Send.Group` (Application)
|
||||
- `Member.Read.Group` (Application)
|
||||
- `Owner.Read.Group` (Application)
|
||||
@ -478,11 +477,11 @@ OpenClaw надає підтримувану Graph дію `member-info` для M
|
||||
|
||||
**Для групових чатів:**
|
||||
|
||||
- `ChatMessage.Read.Chat` (Application) — отримання всіх повідомлень групового чату без @mention
|
||||
- `ChatMessage.Read.Chat` (Application) — отримувати всі повідомлення групового чату без @mention
|
||||
|
||||
## Приклад маніфесту Teams (з редагуванням чутливих даних)
|
||||
## Приклад маніфесту Teams (із вилученими даними)
|
||||
|
||||
Мінімальний, коректний приклад з обов’язковими полями. Замініть ID та URL.
|
||||
Мінімальний, коректний приклад із потрібними полями. Замініть ID та URL.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -532,78 +531,78 @@ OpenClaw надає підтримувану Graph дію `member-info` для M
|
||||
|
||||
### Застереження щодо маніфесту (обов’язкові поля)
|
||||
|
||||
- `bots[].botId` **має** збігатися з App ID Azure Bot.
|
||||
- `webApplicationInfo.id` **має** збігатися з App ID Azure Bot.
|
||||
- `bots[].scopes` мають включати поверхні, які ви плануєте використовувати (`personal`, `team`, `groupChat`).
|
||||
- `bots[].supportsFiles: true` потрібен для обробки файлів в особистому scope.
|
||||
- `authorization.permissions.resourceSpecific` мають включати читання/надсилання в канали, якщо ви хочете каналовий трафік.
|
||||
- `bots[].botId` **має** збігатися з Azure Bot App ID.
|
||||
- `webApplicationInfo.id` **має** збігатися з Azure Bot App ID.
|
||||
- `bots[].scopes` має включати поверхні, які ви плануєте використовувати (`personal`, `team`, `groupChat`).
|
||||
- `bots[].supportsFiles: true` є обов’язковим для обробки файлів у personal scope.
|
||||
- `authorization.permissions.resourceSpecific` має містити дозволи на читання/надсилання в канал, якщо вам потрібен трафік каналу.
|
||||
|
||||
### Оновлення наявного застосунку
|
||||
|
||||
Щоб оновити вже встановлений застосунок Teams (наприклад, щоб додати дозволи RSC):
|
||||
Щоб оновити вже встановлений застосунок Teams (наприклад, додати дозволи RSC):
|
||||
|
||||
1. Оновіть `manifest.json` новими налаштуваннями
|
||||
2. **Збільште поле `version`** (наприклад, `1.0.0` → `1.1.0`)
|
||||
3. **Повторно заархівуйте** маніфест з іконками (`manifest.json`, `outline.png`, `color.png`)
|
||||
2. **Збільшіть поле `version`** (наприклад, `1.0.0` → `1.1.0`)
|
||||
3. **Повторно запакуйте в zip** маніфест разом з іконками (`manifest.json`, `outline.png`, `color.png`)
|
||||
4. Завантажте новий zip:
|
||||
- **Варіант A (Teams Admin Center):** Teams Admin Center → Teams apps → Manage apps → знайдіть свій застосунок → Upload new version
|
||||
- **Варіант B (Sideload):** у Teams → Apps → Manage your apps → Upload a custom app
|
||||
5. **Для каналів команди:** перевстановіть застосунок у кожній команді, щоб нові дозволи набули чинності
|
||||
6. **Повністю закрийте й знову запустіть Teams** (не просто закрийте вікно), щоб очистити кешовані метадані застосунку
|
||||
- **Варіант A (Teams Admin Center):** Teams Admin Center → Teams apps → Manage apps → знайдіть ваш застосунок → Upload new version
|
||||
- **Варіант B (Sideload):** У Teams → Apps → Manage your apps → Upload a custom app
|
||||
5. **Для каналів team:** перевстановіть застосунок у кожній team, щоб нові дозволи набрали чинності
|
||||
6. **Повністю закрийте і знову запустіть Teams** (а не просто закрийте вікно), щоб очистити кешовані метадані застосунку
|
||||
|
||||
## Можливості: лише RSC проти Graph
|
||||
|
||||
### З **лише Teams RSC** (застосунок встановлено, без дозволів Graph API)
|
||||
### Із **лише Teams RSC** (застосунок встановлено, без дозволів Microsoft Graph API)
|
||||
|
||||
Працює:
|
||||
|
||||
- Читання **текстового** вмісту повідомлень каналу.
|
||||
- Надсилання **текстового** вмісту повідомлень каналу.
|
||||
- Отримання файлових вкладень у **personal (DM)**.
|
||||
- Отримання **особистих (DM)** файлових вкладень.
|
||||
|
||||
НЕ працює:
|
||||
|
||||
- **Зображення або вміст файлів** у каналах/групах (payload містить лише HTML-заглушку).
|
||||
- Завантаження вкладень, що зберігаються в SharePoint/OneDrive.
|
||||
- Читання історії повідомлень (поза live webhook event).
|
||||
- Вміст **зображень або файлів** у каналах/групах (payload містить лише HTML-заглушку).
|
||||
- Завантаження вкладень, що зберігаються у SharePoint/OneDrive.
|
||||
- Читання історії повідомлень (поза межами живої webhook-події).
|
||||
|
||||
### З **Teams RSC + дозволами Microsoft Graph Application**
|
||||
### Із **Teams RSC + дозволами Microsoft Graph Application**
|
||||
|
||||
Додається:
|
||||
|
||||
- Завантаження hosted contents (зображення, вставлені в повідомлення).
|
||||
- Завантаження файлових вкладень, що зберігаються в SharePoint/OneDrive.
|
||||
- Завантаження hosted contents (зображень, вставлених у повідомлення).
|
||||
- Завантаження файлових вкладень, що зберігаються у SharePoint/OneDrive.
|
||||
- Читання історії повідомлень каналу/чату через Graph.
|
||||
|
||||
### RSC проти Graph API
|
||||
|
||||
| Можливість | Дозволи RSC | Graph API |
|
||||
| ---------------------- | -------------------- | ----------------------------------- |
|
||||
| **Повідомлення в реальному часі** | Так (через webhook) | Ні (лише polling) |
|
||||
| **Історичні повідомлення** | Ні | Так (можна запитувати історію) |
|
||||
| **Складність налаштування** | Лише маніфест застосунку | Потрібні admin consent + token flow |
|
||||
| **Працює офлайн** | Ні (має працювати) | Так (можна запитувати будь-коли) |
|
||||
| Capability | RSC Permissions | Graph API |
|
||||
| ----------------------- | -------------------- | ----------------------------------- |
|
||||
| **Real-time messages** | Так (через webhook) | Ні (лише polling) |
|
||||
| **Historical messages** | Ні | Так (можна запитувати історію) |
|
||||
| **Setup complexity** | Лише маніфест застосунку | Потребує admin consent + token flow |
|
||||
| **Works offline** | Ні (має бути запущено) | Так (можна запитувати будь-коли) |
|
||||
|
||||
**Висновок:** RSC призначений для прослуховування в реальному часі; Graph API — для історичного доступу. Щоб наздоганяти пропущені повідомлення під час офлайну, вам потрібен Graph API з `ChannelMessage.Read.All` (потрібен admin consent).
|
||||
**Підсумок:** RSC призначено для прослуховування в реальному часі; Graph API — для історичного доступу. Щоб надолужувати пропущені повідомлення під час офлайну, вам потрібен Graph API з `ChannelMessage.Read.All` (потребує admin consent).
|
||||
|
||||
## Graph-enabled media + history (потрібно для каналів)
|
||||
## Media + history з Graph (обов’язково для каналів)
|
||||
|
||||
Якщо вам потрібні зображення/файли в **каналах** або потрібно отримувати **історію повідомлень**, необхідно ввімкнути дозволи Microsoft Graph і надати admin consent.
|
||||
Якщо вам потрібні зображення/файли в **каналах** або ви хочете отримувати **історію повідомлень**, потрібно ввімкнути дозволи Microsoft Graph і надати admin consent.
|
||||
|
||||
1. У **App Registration** Entra ID (Azure AD) додайте дозволи Microsoft Graph **Application permissions**:
|
||||
- `ChannelMessage.Read.All` (вкладення каналів + історія)
|
||||
- `Chat.Read.All` або `ChatMessage.Read.All` (групові чати)
|
||||
2. **Надайте admin consent** для tenant.
|
||||
3. Збільште **версію маніфесту** застосунку Teams, повторно завантажте його й **перевстановіть застосунок у Teams**.
|
||||
3. Збільшіть **версію маніфесту** застосунку Teams, повторно завантажте його й **перевстановіть застосунок у Teams**.
|
||||
4. **Повністю закрийте й знову запустіть Teams**, щоб очистити кешовані метадані застосунку.
|
||||
|
||||
**Додатковий дозвіл для згадок користувачів:** @mentions користувачів працюють відразу для користувачів у поточній розмові. Однак якщо ви хочете динамічно шукати й згадувати користувачів, які **не перебувають у поточній розмові**, додайте дозвіл `User.Read.All` (Application) і надайте admin consent.
|
||||
**Додатковий дозвіл для згадок користувачів:** @mentions користувачів працюють одразу для користувачів у розмові. Однак якщо ви хочете динамічно шукати й згадувати користувачів, які **не перебувають у поточній розмові**, додайте дозвіл `User.Read.All` (Application) і надайте admin consent.
|
||||
|
||||
## Відомі обмеження
|
||||
|
||||
### Тайм-аути webhook
|
||||
|
||||
Teams доставляє повідомлення через HTTP webhook. Якщо обробка триває надто довго (наприклад, через повільні відповіді LLM), ви можете побачити:
|
||||
Teams доставляє повідомлення через HTTP webhook. Якщо обробка триває надто довго (наприклад, повільні відповіді LLM), ви можете побачити:
|
||||
|
||||
- тайм-аути Gateway
|
||||
- повторні спроби Teams доставити повідомлення (що спричиняє дублікати)
|
||||
@ -615,38 +614,38 @@ OpenClaw обробляє це, швидко повертаючи відпові
|
||||
|
||||
Markdown у Teams більш обмежений, ніж у Slack або Discord:
|
||||
|
||||
- Базове форматування працює: **жирний**, _курсив_, `code`, посилання
|
||||
- Працює базове форматування: **жирний**, _курсив_, `code`, посилання
|
||||
- Складний markdown (таблиці, вкладені списки) може відображатися некоректно
|
||||
- Adaptive Cards підтримуються для опитувань і semantic presentation sends (див. нижче)
|
||||
|
||||
## Конфігурація
|
||||
|
||||
Ключові налаштування (див. `/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`: allowlist для DM (рекомендовано AAD object ID). Майстер налаштування зіставляє імена з ID під час налаштування, коли доступний доступ до Graph.
|
||||
- `channels.msteams.dangerouslyAllowNameMatching`: аварійний перемикач для повторного ввімкнення зіставлення за змінними UPN/display-name та прямої маршрутизації за назвами team/channel.
|
||||
- `channels.msteams.allowFrom`: allowlist для DM (рекомендовано AAD object ID). Майстер налаштування під час setup зіставляє імена з ID, коли доступний доступ до Graph.
|
||||
- `channels.msteams.dangerouslyAllowNameMatching`: аварійний перемикач для повторного ввімкнення зіставлення за змінюваними UPN/display-name і прямої маршрутизації за назвами team/channel.
|
||||
- `channels.msteams.textChunkLimit`: розмір фрагмента вихідного тексту.
|
||||
- `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.<teamId>.replyStyle`: перевизначення для окремої команди.
|
||||
- `channels.msteams.teams.<teamId>.requireMention`: перевизначення для окремої команди.
|
||||
- `channels.msteams.teams.<teamId>.tools`: типові перевизначення політики інструментів для команди (`allow`/`deny`/`alsoAllow`), які використовуються, коли немає перевизначення для каналу.
|
||||
- `channels.msteams.teams.<teamId>.toolsBySender`: типові перевизначення політики інструментів для команди за відправником (підтримується wildcard `"*"`).
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle`: перевизначення для окремого каналу.
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention`: перевизначення для окремого каналу.
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.tools`: перевизначення політики інструментів для каналу (`allow`/`deny`/`alsoAllow`).
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender`: перевизначення політики інструментів для каналу за відправником (підтримується wildcard `"*"`).
|
||||
- `channels.msteams.teams.<teamId>.replyStyle`: перевизначення для конкретної team.
|
||||
- `channels.msteams.teams.<teamId>.requireMention`: перевизначення для конкретної team.
|
||||
- `channels.msteams.teams.<teamId>.tools`: типові перевизначення політики інструментів для team (`allow`/`deny`/`alsoAllow`), які використовуються, коли немає перевизначення для каналу.
|
||||
- `channels.msteams.teams.<teamId>.toolsBySender`: типові перевизначення політики інструментів для team за відправником (`"*"` wildcard підтримується).
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle`: перевизначення для конкретного каналу.
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention`: перевизначення для конкретного каналу.
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.tools`: перевизначення політики інструментів для конкретного каналу (`allow`/`deny`/`alsoAllow`).
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender`: перевизначення політики інструментів для конкретного каналу за відправником (`"*"` wildcard підтримується).
|
||||
- Ключі `toolsBySender` мають використовувати явні префікси:
|
||||
`id:`, `e164:`, `username:`, `name:` (застарілі ключі без префікса, як і раніше, зіставляються лише з `id:`).
|
||||
- `channels.msteams.actions.memberInfo`: увімкнути або вимкнути дію інформації про учасника на основі Graph (типово: увімкнено, коли доступні облікові дані Graph).
|
||||
`id:`, `e164:`, `username:`, `name:` (застарілі ключі без префікса все ще зіставляються лише з `id:`).
|
||||
- `channels.msteams.actions.memberInfo`: увімкнути або вимкнути дію інформації про учасника, що працює через Graph (типово: увімкнено, коли доступні облікові дані Graph).
|
||||
- `channels.msteams.authType`: тип автентифікації — `"secret"` (типово) або `"federated"`.
|
||||
- `channels.msteams.certificatePath`: шлях до PEM-файлу сертифіката (federated + автентифікація сертифікатом).
|
||||
- `channels.msteams.certificateThumbprint`: thumbprint сертифіката (необов’язково, не потрібен для автентифікації).
|
||||
@ -654,29 +653,29 @@ Markdown у Teams більш обмежений, ніж у Slack або Discord:
|
||||
- `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)):
|
||||
- Direct messages спільно використовують основну сесію (`agent:<agentId>:<mainKey>`).
|
||||
- Прямі повідомлення використовують основну сесію (`agent:<agentId>:<mainKey>`).
|
||||
- Повідомлення каналу/групи використовують conversation id:
|
||||
- `agent:<agentId>:msteams:channel:<conversationId>`
|
||||
- `agent:<agentId>:msteams:group:<conversationId>`
|
||||
|
||||
## Стиль відповіді: Threads проти Posts
|
||||
## Стиль відповіді: треди проти дописів
|
||||
|
||||
Нещодавно Teams запровадив два стилі UI каналів поверх тієї самої базової моделі даних:
|
||||
|
||||
| Стиль | Опис | Рекомендований `replyStyle` |
|
||||
| ---------------------- | --------------------------------------------------------- | --------------------------- |
|
||||
| **Posts** (класичний) | Повідомлення відображаються як картки з гілками відповідей під ними | `thread` (типово) |
|
||||
| **Threads** (як у Slack) | Повідомлення йдуть лінійно, більше схоже на Slack | `top-level` |
|
||||
| Style | Description | Recommended `replyStyle` |
|
||||
| ------------------------ | --------------------------------------------------------- | ------------------------ |
|
||||
| **Posts** (classic) | Повідомлення відображаються як картки з тредовими відповідями під ними | `thread` (типово) |
|
||||
| **Threads** (Slack-like) | Повідомлення йдуть лінійно, більше схоже на Slack | `top-level` |
|
||||
|
||||
**Проблема:** API Teams не показує, який стиль UI використовує канал. Якщо використати неправильний `replyStyle`:
|
||||
**Проблема:** Teams API не показує, який саме стиль UI використовує канал. Якщо використовувати неправильний `replyStyle`:
|
||||
|
||||
- `thread` у каналі стилю Threads → відповіді виглядають незграбно вкладеними
|
||||
- `top-level` у каналі стилю Posts → відповіді з’являються як окремі повідомлення верхнього рівня, а не в гілці
|
||||
- `thread` у каналі зі стилем Threads → відповіді відображаються незручно вкладеними
|
||||
- `top-level` у каналі зі стилем Posts → відповіді з’являються як окремі дописи верхнього рівня, а не в треді
|
||||
|
||||
**Рішення:** Налаштуйте `replyStyle` для кожного каналу залежно від того, як налаштований канал:
|
||||
**Рішення:** налаштуйте `replyStyle` для кожного каналу залежно від того, як налаштований канал:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -701,44 +700,44 @@ Markdown у Teams більш обмежений, ніж у Slack або Discord:
|
||||
|
||||
**Поточні обмеження:**
|
||||
|
||||
- **DM:** зображення й файлові вкладення працюють через API файлів ботів Teams.
|
||||
- **Канали/групи:** вкладення живуть у сховищі M365 (SharePoint/OneDrive). Payload webhook містить лише HTML-заглушку, а не фактичні байти файлу. **Для завантаження вкладень каналу потрібні дозволи Graph API**.
|
||||
- Для явних надсилань, де файл є основним, використовуйте `action=upload-file` з `media` / `filePath` / `path`; необов’язковий `message` стає супровідним текстом/коментарем, а `filename` перевизначає назву завантаженого файлу.
|
||||
- **DM:** зображення й файлові вкладення працюють через file API бота Teams.
|
||||
- **Канали/групи:** вкладення зберігаються в M365 storage (SharePoint/OneDrive). Payload 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). Тримайте цей список строгим (уникайте multi-tenant суфіксів).
|
||||
Без дозволів Graph повідомлення каналів із зображеннями отримуватимуться лише як текст (вміст зображення боту недоступний).
|
||||
Типово OpenClaw завантажує медіа лише з hostname Microsoft/Teams. Перевизначте це через `channels.msteams.mediaAllowHosts` (використайте `["*"]`, щоб дозволити будь-який хост).
|
||||
Заголовки Authorization додаються лише для хостів у `channels.msteams.mediaAuthAllowHosts` (типово хости Graph + Bot Framework). Тримайте цей список суворим (уникайте multi-tenant suffixes).
|
||||
|
||||
## Надсилання файлів у групових чатах
|
||||
|
||||
Боти можуть надсилати файли в DM через потік FileConsentCard (вбудований). Однак **надсилання файлів у групових чатах/каналах** потребує додаткового налаштування:
|
||||
Боти можуть надсилати файли в DM, використовуючи потік FileConsentCard (вбудований). Однак **надсилання файлів у групових чатах/каналах** потребує додаткового налаштування:
|
||||
|
||||
| Контекст | Як надсилаються файли | Потрібне налаштування |
|
||||
| ------------------------ | ---------------------------------------- | ----------------------------------------------- |
|
||||
| **DM** | FileConsentCard → користувач приймає → бот вивантажує | Працює одразу |
|
||||
| **Групові чати/канали** | Вивантаження в SharePoint → посилання для спільного доступу | Потрібні `sharePointSiteId` + дозволи Graph |
|
||||
| **Зображення (будь-який контекст)** | Inline у кодуванні Base64 | Працює одразу |
|
||||
| Context | How files are sent | Setup needed |
|
||||
| ------------------------ | -------------------------------------------- | ----------------------------------------------- |
|
||||
| **DMs** | FileConsentCard → користувач приймає → бот вивантажує | Працює одразу |
|
||||
| **Group chats/channels** | Вивантаження до SharePoint → посилання для спільного доступу | Потрібні `sharePointSiteId` + дозволи Graph |
|
||||
| **Images (any context)** | Inline у форматі Base64 | Працює одразу |
|
||||
|
||||
### Чому груповим чатам потрібен SharePoint
|
||||
|
||||
Боти не мають особистого диска OneDrive (endpoint Graph API `/me/drive` не працює для application identities). Щоб надсилати файли в групових чатах/каналах, бот вивантажує їх на **сайт SharePoint** і створює посилання для спільного доступу.
|
||||
Боти не мають особистого диска OneDrive (кінцева точка 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) — необов’язково, вмикає посилання для спільного доступу для окремих користувачів
|
||||
1. **Додайте дозволи Graph API** у Entra ID (Azure AD) → App Registration:
|
||||
- `Sites.ReadWrite.All` (Application) — вивантаження файлів до SharePoint
|
||||
- `Chat.Read.All` (Application) — необов’язково, вмикає посилання для спільного доступу на рівні користувачів
|
||||
|
||||
2. **Надайте admin consent** для tenant.
|
||||
|
||||
3. **Отримайте ваш SharePoint site ID:**
|
||||
|
||||
```bash
|
||||
# Через Graph Explorer або curl з чинним токеном:
|
||||
# Через Graph Explorer або curl з дійсним токеном:
|
||||
curl -H "Authorization: Bearer $TOKEN" \
|
||||
"https://graph.microsoft.com/v1.0/sites/{hostname}:/{site-path}"
|
||||
|
||||
# Приклад: для сайту за адресою "contoso.sharepoint.com/sites/BotFiles"
|
||||
# Приклад: для сайту "contoso.sharepoint.com/sites/BotFiles"
|
||||
curl -H "Authorization: Bearer $TOKEN" \
|
||||
"https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/BotFiles"
|
||||
|
||||
@ -760,40 +759,40 @@ Markdown у Teams більш обмежений, ніж у Slack або Discord:
|
||||
|
||||
### Поведінка спільного доступу
|
||||
|
||||
| Дозвіл | Поведінка спільного доступу |
|
||||
| --------------------------------------- | ---------------------------------------------------------- |
|
||||
| `Sites.ReadWrite.All` only | Посилання для спільного доступу на рівні організації (доступне будь-кому в org) |
|
||||
| `Sites.ReadWrite.All` + `Chat.Read.All` | Посилання для спільного доступу для окремих користувачів (доступне лише учасникам чату) |
|
||||
| Permission | Sharing behavior |
|
||||
| --------------------------------------- | --------------------------------------------------------- |
|
||||
| `Sites.ReadWrite.All` only | Посилання для спільного доступу на всю організацію (доступне будь-кому в організації) |
|
||||
| `Sites.ReadWrite.All` + `Chat.Read.All` | Посилання для спільного доступу на рівні користувачів (доступне лише учасникам чату) |
|
||||
|
||||
Спільний доступ для окремих користувачів безпечніший, оскільки доступ до файлу мають лише учасники чату. Якщо дозвіл `Chat.Read.All` відсутній, бот повертається до спільного доступу на рівні організації.
|
||||
Спільний доступ на рівні користувачів безпечніший, оскільки лише учасники чату можуть отримати доступ до файлу. Якщо дозвіл `Chat.Read.All` відсутній, бот повертається до спільного доступу на всю організацію.
|
||||
|
||||
### Резервна поведінка
|
||||
|
||||
| Сценарій | Результат |
|
||||
| ------------------------------------------------ | --------------------------------------------------- |
|
||||
| Груповий чат + файл + налаштовано `sharePointSiteId` | Вивантаження в SharePoint, надсилання посилання для спільного доступу |
|
||||
| Груповий чат + файл + немає `sharePointSiteId` | Спроба вивантаження в OneDrive (може не вдатися), надсилання лише тексту |
|
||||
| Особистий чат + файл | Потік FileConsentCard (працює без SharePoint) |
|
||||
| Будь-який контекст + зображення | Inline у кодуванні Base64 (працює без SharePoint) |
|
||||
| Scenario | Result |
|
||||
| ------------------------------------------------- | -------------------------------------------------- |
|
||||
| Груповий чат + файл + налаштовано `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 (власного API опитувань у Teams немає).
|
||||
|
||||
- CLI: `openclaw message poll --channel msteams --target conversation:<id> ...`
|
||||
- Голоси записуються Gateway у `~/.openclaw/msteams-polls.json`.
|
||||
- Gateway має залишатися онлайн, щоб записувати голоси.
|
||||
- Опитування поки не публікують підсумки результатів автоматично (за потреби перегляньте файл сховища).
|
||||
- Щоб записувати голоси, Gateway має залишатися онлайн.
|
||||
- Підсумкові зведення результатів опитувань поки не публікуються автоматично (за потреби перевіряйте файл сховища).
|
||||
|
||||
## Картки presentation
|
||||
|
||||
Надсилайте семантичні payload presentation користувачам Teams або в розмови через інструмент `message` або CLI. OpenClaw відтворює їх як Teams Adaptive Cards із загального контракту presentation.
|
||||
Надсилайте семантичні payload presentation користувачам або розмовам Teams за допомогою інструмента `message` або CLI. OpenClaw відтворює їх як Teams Adaptive Cards на основі узагальненого контракту presentation.
|
||||
|
||||
Параметр `presentation` приймає семантичні блоки. Якщо задано `presentation`, текст повідомлення є необов’язковим.
|
||||
Параметр `presentation` приймає семантичні блоки. Якщо передано `presentation`, текст повідомлення не є обов’язковим.
|
||||
|
||||
**Інструмент агента:**
|
||||
|
||||
@ -817,18 +816,18 @@ openclaw message send --channel msteams \
|
||||
--presentation '{"title":"Hello","blocks":[{"type":"text","text":"Hello!"}]}'
|
||||
```
|
||||
|
||||
Докладно про формат цілі див. [Формати цілі](#target-formats) нижче.
|
||||
Докладніше про формат target див. у [Формати target](#target-formats) нижче.
|
||||
|
||||
## Формати цілі
|
||||
## Формати target
|
||||
|
||||
Цілі MSTeams використовують префікси, щоб розрізняти користувачів і розмови:
|
||||
Target у MSTeams використовують префікси, щоб розрізняти користувачів і розмови:
|
||||
|
||||
| Тип цілі | Формат | Приклад |
|
||||
| ---------------------- | -------------------------------- | --------------------------------------------------- |
|
||||
| Користувач (за ID) | `user:<aad-object-id>` | `user:40a1a0ed-4ff2-4164-a219-55518990c197` |
|
||||
| Користувач (за ім’ям) | `user:<display-name>` | `user:John Smith` (потрібен Graph API) |
|
||||
| Група/канал | `conversation:<conversation-id>` | `conversation:19:abc123...@thread.tacv2` |
|
||||
| Група/канал (raw) | `<conversation-id>` | `19:abc123...@thread.tacv2` (якщо містить `@thread`) |
|
||||
| Target type | Format | Example |
|
||||
| ------------------- | -------------------------------- | --------------------------------------------------- |
|
||||
| Користувач (за ID) | `user:<aad-object-id>` | `user:40a1a0ed-4ff2-4164-a219-55518990c197` |
|
||||
| Користувач (за ім’ям) | `user:<display-name>` | `user:John Smith` (потребує Graph API) |
|
||||
| Група/канал | `conversation:<conversation-id>` | `conversation:19:abc123...@thread.tacv2` |
|
||||
| Група/канал (raw) | `<conversation-id>` | `19:abc123...@thread.tacv2` (якщо містить `@thread`) |
|
||||
|
||||
**Приклади CLI:**
|
||||
|
||||
@ -836,7 +835,7 @@ openclaw message send --channel msteams \
|
||||
# Надіслати користувачу за ID
|
||||
openclaw message send --channel msteams --target "user:40a1a0ed-..." --message "Hello"
|
||||
|
||||
# Надіслати користувачу за display name (викликає пошук через Graph API)
|
||||
# Надіслати користувачу за display name (запускає Graph API lookup)
|
||||
openclaw message send --channel msteams --target "user:John Smith" --message "Hello"
|
||||
|
||||
# Надіслати в груповий чат або канал
|
||||
@ -870,94 +869,94 @@ openclaw message send --channel msteams --target "conversation:19:abc...@thread.
|
||||
}
|
||||
```
|
||||
|
||||
Примітка: без префікса `user:` імена типово трактуються як цілі групи/команди. Завжди використовуйте `user:`, коли націлюєтеся на людей за display name.
|
||||
Примітка: без префікса `user:` імена типово трактуються як цілі групи/team. Завжди використовуйте `user:`, коли адресуєте повідомлення людям за display name.
|
||||
|
||||
## Проактивні повідомлення
|
||||
|
||||
- Проактивні повідомлення можливі лише **після** взаємодії користувача, оскільки саме тоді ми зберігаємо посилання на розмову.
|
||||
- Див. `/gateway/configuration` для `dmPolicy` і керування через allowlist.
|
||||
- Див. `/gateway/configuration` для `dmPolicy` і обмеження через allowlist.
|
||||
|
||||
## ID команд і каналів (поширена пастка)
|
||||
## ID team і channel (типова пастка)
|
||||
|
||||
Параметр запиту `groupId` в URL Teams — **НЕ** той ID команди, який використовується для конфігурації. Натомість витягуйте ID зі шляху URL:
|
||||
Параметр запиту `groupId` в URL Teams — **НЕ** той team ID, який використовується для конфігурації. Натомість витягуйте ID зі шляху URL:
|
||||
|
||||
**URL команди:**
|
||||
**URL team:**
|
||||
|
||||
```
|
||||
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=...
|
||||
└────────────────────────────┘
|
||||
ID команди (декодуйте URL)
|
||||
Team ID (декодуйте URL)
|
||||
```
|
||||
|
||||
**URL каналу:**
|
||||
**URL channel:**
|
||||
|
||||
```
|
||||
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=...
|
||||
└─────────────────────────┘
|
||||
ID каналу (декодуйте URL)
|
||||
Channel ID (декодуйте URL)
|
||||
```
|
||||
|
||||
**Для конфігурації:**
|
||||
|
||||
- ID команди = сегмент шляху після `/team/` (після URL-декодування, наприклад `19:Bk4j...@thread.tacv2`)
|
||||
- ID каналу = сегмент шляху після `/channel/` (після URL-декодування)
|
||||
- Team ID = сегмент шляху після `/team/` (після декодування URL, наприклад, `19:Bk4j...@thread.tacv2`)
|
||||
- Channel ID = сегмент шляху після `/channel/` (після декодування URL)
|
||||
- Параметр запиту `groupId` **ігноруйте**
|
||||
|
||||
## Приватні канали
|
||||
|
||||
Боти мають обмежену підтримку в приватних каналах:
|
||||
|
||||
| Функція | Стандартні канали | Приватні канали |
|
||||
| --------------------------- | ----------------- | --------------------- |
|
||||
| Встановлення бота | Так | Обмежено |
|
||||
| Повідомлення в реальному часі (webhook) | Так | Може не працювати |
|
||||
| Дозволи RSC | Так | Можуть поводитися інакше |
|
||||
| @mentions | Так | Якщо бот доступний |
|
||||
| Історія через Graph API | Так | Так (з дозволами) |
|
||||
| Feature | Standard Channels | Private Channels |
|
||||
| ---------------------------- | ----------------- | --------------------- |
|
||||
| Встановлення бота | Так | Обмежено |
|
||||
| Повідомлення в реальному часі (webhook) | Так | Може не працювати |
|
||||
| Дозволи RSC | Так | Можуть працювати інакше |
|
||||
| @mentions | Так | Якщо бот доступний |
|
||||
| Історія через Graph API | Так | Так (за наявності дозволів) |
|
||||
|
||||
**Обхідні варіанти, якщо приватні канали не працюють:**
|
||||
**Обхідні шляхи, якщо приватні канали не працюють:**
|
||||
|
||||
1. Використовуйте стандартні канали для взаємодії з ботом
|
||||
2. Використовуйте DM — користувачі завжди можуть писати боту напряму
|
||||
3. Використовуйте Graph API для історичного доступу (потрібен `ChannelMessage.Read.All`)
|
||||
3. Використовуйте Graph API для історичного доступу (потребує `ChannelMessage.Read.All`)
|
||||
|
||||
## Усунення несправностей
|
||||
## Усунення проблем
|
||||
|
||||
### Поширені проблеми
|
||||
### Типові проблеми
|
||||
|
||||
- **Зображення не відображаються в каналах:** відсутні дозволи Graph або admin consent. Перевстановіть застосунок Teams і повністю закрийте/заново відкрийте Teams.
|
||||
- **Немає відповідей у каналі:** типово потрібні згадки; установіть `channels.msteams.requireMention=false` або налаштуйте це для окремої команди/каналу.
|
||||
- **Невідповідність версій (Teams усе ще показує старий маніфест):** видаліть і повторно додайте застосунок та повністю закрийте Teams, щоб оновити стан.
|
||||
- **401 Unauthorized від webhook:** це очікувано під час ручного тестування без Azure JWT — означає, що endpoint досяжний, але автентифікація не пройшла. Для коректної перевірки використовуйте Azure Web Chat.
|
||||
- **Немає відповідей у каналі:** згадки типово обов’язкові; задайте `channels.msteams.requireMention=false` або налаштуйте це для конкретної team/channel.
|
||||
- **Невідповідність версій (Teams досі показує старий маніфест):** видаліть і знову додайте застосунок та повністю закрийте Teams, щоб оновити дані.
|
||||
- **401 Unauthorized від webhook:** очікувана поведінка під час ручного тестування без Azure JWT — означає, що endpoint доступний, але автентифікація не пройшла. Для коректної перевірки використовуйте Azure Web Chat.
|
||||
|
||||
### Помилки завантаження маніфесту
|
||||
|
||||
- **"Icon file cannot be empty":** маніфест посилається на файли іконок розміром 0 байтів. Створіть коректні PNG-іконки (`outline.png` 32x32, `color.png` 192x192).
|
||||
- **"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.
|
||||
- **"Icon file cannot be empty":** маніфест посилається на файли іконок розміром 0 байт. Створіть коректні PNG-іконки (`outline.png` 32x32, `color.png` 192x192).
|
||||
- **"webApplicationInfo.Id already in use":** застосунок усе ще встановлений в іншій team/chat. Спочатку знайдіть і видаліть його або зачекайте 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 вашого бота
|
||||
2. Повторно завантажте застосунок і перевстановіть його в команді/чаті
|
||||
3. Перевірте, чи адміністратор вашої org не заблокував дозволи RSC
|
||||
4. Підтвердьте, що використовуєте правильний scope: `ChannelMessage.Read.Group` для команд, `ChatMessage.Read.Chat` для групових чатів
|
||||
2. Повторно завантажте застосунок і перевстановіть його в team/chat
|
||||
3. Перевірте, чи адміністратор вашої організації не заблокував дозволи RSC
|
||||
4. Підтвердьте, що ви використовуєте правильну область: `ChannelMessage.Read.Group` для teams, `ChatMessage.Read.Chat` для групових чатів
|
||||
|
||||
## Посилання
|
||||
|
||||
- [Create 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
|
||||
- [Teams Developer Portal](https://dev.teams.microsoft.com/apps) - створення/керування застосунками Teams
|
||||
- [Teams app manifest schema](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema)
|
||||
- [Receive channel messages with RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-messages-with-rsc)
|
||||
- [RSC permissions reference](https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent)
|
||||
- [Teams bot file handling](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (для каналу/групи потрібен Graph)
|
||||
- [Teams bot file handling](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (для channel/group потрібен Graph)
|
||||
- [Proactive messaging](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages)
|
||||
|
||||
## Пов’язане
|
||||
|
||||
- [Channels Overview](/uk/channels) — усі підтримувані канали
|
||||
- [Огляд каналів](/uk/channels) — усі підтримувані канали
|
||||
- [Pairing](/uk/channels/pairing) — автентифікація DM і потік pairing
|
||||
- [Groups](/uk/channels/groups) — поведінка групового чату й керування через згадки
|
||||
- [Channel Routing](/uk/channels/channel-routing) — маршрутизація сесій для повідомлень
|
||||
- [Security](/uk/gateway/security) — модель доступу та посилення захисту
|
||||
- [Групи](/uk/channels/groups) — поведінка групового чату та обмеження через згадки
|
||||
- [Маршрутизація каналів](/uk/channels/channel-routing) — маршрутизація сесій для повідомлень
|
||||
- [Безпека](/uk/gateway/security) — модель доступу та посилення захисту
|
||||
|
||||
@ -1,25 +1,25 @@
|
||||
---
|
||||
read_when:
|
||||
- Транспорт каналу показує, що підключено, але відповіді не працюють
|
||||
- Потрібні перевірки, специфічні для каналу, перед переходом до детальної документації провайдера
|
||||
summary: Швидке усунення несправностей на рівні каналу з характерними ознаками збоїв і виправленнями для кожного каналу
|
||||
title: Усунення несправностей каналу
|
||||
- Транспорт каналу показує, що підключено, але відповіді не надсилаються
|
||||
- Потрібні перевірки для конкретного каналу, перш ніж заглиблюватися в документацію провайдера
|
||||
summary: Швидке усунення несправностей на рівні каналів із характерними ознаками збоїв і виправленнями для кожного каналу
|
||||
title: Усунення несправностей каналів
|
||||
x-i18n:
|
||||
generated_at: "2026-04-21T00:17:12Z"
|
||||
generated_at: "2026-04-21T21:27:21Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 69e9e8f093bee1c7aafc244d6b999a957b7571cc125096d72060d0df52bf52c0
|
||||
source_hash: 8c57934b52086ea5f41565c5aae77ef6fa772cf7d56a6427655a844a5c63d1c6
|
||||
source_path: channels/troubleshooting.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Усунення несправностей каналу
|
||||
# Усунення несправностей каналів
|
||||
|
||||
Використовуйте цю сторінку, коли канал підключається, але працює неправильно.
|
||||
|
||||
## Послідовність команд
|
||||
|
||||
Спочатку виконайте їх у такому порядку:
|
||||
Спочатку запускайте їх у такому порядку:
|
||||
|
||||
```bash
|
||||
openclaw status
|
||||
@ -34,7 +34,7 @@ openclaw channels status --probe
|
||||
- `Runtime: running`
|
||||
- `Connectivity probe: ok`
|
||||
- `Capability: read-only`, `write-capable` або `admin-capable`
|
||||
- Перевірка каналу показує, що транспорт підключено і, де підтримується, `works` або `audit ok`
|
||||
- Перевірка каналу показує, що транспорт підключено і, де це підтримується, `works` або `audit ok`
|
||||
|
||||
## WhatsApp
|
||||
|
||||
@ -43,100 +43,100 @@ openclaw channels status --probe
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ------------------------------- | ------------------------------------------------ | ------------------------------------------------------------ |
|
||||
| Підключено, але немає відповідей у DM | `openclaw pairing list whatsapp` | Підтвердьте відправника або змініть політику DM/список дозволених. |
|
||||
| Повідомлення групи ігноруються | Перевірте `requireMention` і шаблони згадок у конфігурації | Згадайте бота або пом’якшіть політику згадок для цієї групи. |
|
||||
| Повідомлення в групі ігноруються | Перевірте `requireMention` і шаблони згадування в конфігурації | Згадайте бота або пом’якште політику згадування для цієї групи. |
|
||||
| Випадкові відключення/цикли повторного входу | `openclaw channels status --probe` + журнали | Увійдіть знову та переконайтеся, що каталог облікових даних справний. |
|
||||
|
||||
Повне усунення несправностей: [/channels/whatsapp#troubleshooting](/uk/channels/whatsapp#troubleshooting)
|
||||
Повне усунення несправностей: [Усунення несправностей WhatsApp](/uk/channels/whatsapp#troubleshooting)
|
||||
|
||||
## Telegram
|
||||
|
||||
### Характерні ознаки збоїв Telegram
|
||||
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ----------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Є `/start`, але немає придатного потоку відповідей | `openclaw pairing list telegram` | Підтвердьте сполучення або змініть політику DM. |
|
||||
| Бот онлайн, але група мовчить | Перевірте вимогу згадки та режим приватності бота | Вимкніть режим приватності для видимості в групі або згадайте бота. |
|
||||
| Помилки надсилання з мережевими помилками | Перегляньте журнали на наявність збоїв викликів Telegram API | Виправте маршрутизацію DNS/IPv6/проксі до `api.telegram.org`. |
|
||||
| Опитування зависає або повільно перепідключається | `openclaw logs --follow` для діагностики опитування | Оновіться; якщо перезапуски є хибнопозитивними, налаштуйте `pollingStallThresholdMs`. Постійні зависання все ще вказують на проксі/DNS/IPv6. |
|
||||
| `setMyCommands` відхиляється під час запуску | Перегляньте журнали на `BOT_COMMANDS_TOO_MUCH` | Зменште кількість команд Telegram для Plugin/Skills/користувацьких команд або вимкніть нативні меню. |
|
||||
| Після оновлення список дозволених вас блокує | `openclaw security audit` і списки дозволених у конфігурації | Виконайте `openclaw doctor --fix` або замініть `@username` на числові ID відправників. |
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ----------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `/start`, але немає придатного потоку відповідей | `openclaw pairing list telegram` | Підтвердьте pairing або змініть політику DM. |
|
||||
| Бот онлайн, але група мовчить | Перевірте вимогу згадування та режим приватності бота | Вимкніть режим приватності для видимості в групі або згадайте бота. |
|
||||
| Надсилання завершується помилками мережі | Перегляньте журнали на наявність збоїв викликів Telegram API | Виправте маршрутизацію DNS/IPv6/proxy до `api.telegram.org`. |
|
||||
| Polling зависає або повільно перепідключається | `openclaw logs --follow` для діагностики polling | Оновіться; якщо перезапуски є хибнопозитивними, налаштуйте `pollingStallThresholdMs`. Постійні зависання все ще вказують на proxy/DNS/IPv6. |
|
||||
| `setMyCommands` відхиляється під час запуску | Перегляньте журнали на `BOT_COMMANDS_TOO_MUCH` | Зменште кількість команд Telegram від plugin/skill/custom або вимкніть нативні меню. |
|
||||
| Після оновлення список дозволених вас блокує | `openclaw security audit` і списки дозволених у конфігурації | Запустіть `openclaw doctor --fix` або замініть `@username` на числові ID відправників. |
|
||||
|
||||
Повне усунення несправностей: [/channels/telegram#troubleshooting](/uk/channels/telegram#troubleshooting)
|
||||
Повне усунення несправностей: [Усунення несправностей Telegram](/uk/channels/telegram#troubleshooting)
|
||||
|
||||
## Discord
|
||||
|
||||
### Характерні ознаки збоїв Discord
|
||||
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ------------------------------- | -------------------------------- | ------------------------------------------------------------- |
|
||||
| Бот онлайн, але немає відповідей у guild | `openclaw channels status --probe` | Дозвольте guild/channel і перевірте intent вмісту повідомлень. |
|
||||
| Повідомлення групи ігноруються | Перевірте журнали на відкидання через вимогу згадки | Згадайте бота або встановіть `requireMention: false` для guild/channel. |
|
||||
| Відсутні відповіді в DM | `openclaw pairing list discord` | Підтвердьте сполучення DM або скоригуйте політику DM. |
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ------------------------------- | ------------------------------------ | ------------------------------------------------------------ |
|
||||
| Бот онлайн, але немає відповідей у guild | `openclaw channels status --probe` | Дозвольте guild/channel і перевірте intent для вмісту повідомлень. |
|
||||
| Повідомлення в групі ігноруються | Перевірте журнали на drops через вимогу згадування | Згадайте бота або встановіть `requireMention: false` для guild/channel. |
|
||||
| Немає відповідей у DM | `openclaw pairing list discord` | Підтвердьте DM pairing або скоригуйте політику DM. |
|
||||
|
||||
Повне усунення несправностей: [/channels/discord#troubleshooting](/uk/channels/discord#troubleshooting)
|
||||
Повне усунення несправностей: [Усунення несправностей Discord](/uk/channels/discord#troubleshooting)
|
||||
|
||||
## Slack
|
||||
|
||||
### Характерні ознаки збоїв Slack
|
||||
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| -------------------------------------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Socket mode підключено, але немає відповідей | `openclaw channels status --probe` | Перевірте токен застосунку, токен бота та потрібні області доступу; звертайте увагу на `botTokenStatus` / `appTokenStatus = configured_unavailable` у конфігураціях на основі SecretRef. |
|
||||
| DM заблоковані | `openclaw pairing list slack` | Підтвердьте сполучення або пом’якшіть політику DM. |
|
||||
| Повідомлення каналу ігноруються | Перевірте `groupPolicy` і список дозволених каналів | Дозвольте канал або змініть політику на `open`. |
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| -------------------------------------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Socket mode підключено, але немає відповідей | `openclaw channels status --probe` | Перевірте app token + bot token і потрібні scopes; зверніть увагу на `botTokenStatus` / `appTokenStatus = configured_unavailable` у конфігураціях на базі SecretRef. |
|
||||
| DM заблоковано | `openclaw pairing list slack` | Підтвердьте pairing або пом’якште політику DM. |
|
||||
| Повідомлення каналу ігнорується | Перевірте `groupPolicy` і список дозволених каналів | Дозвольте канал або змініть політику на `open`. |
|
||||
|
||||
Повне усунення несправностей: [/channels/slack#troubleshooting](/uk/channels/slack#troubleshooting)
|
||||
Повне усунення несправностей: [Усунення несправностей Slack](/uk/channels/slack#troubleshooting)
|
||||
|
||||
## iMessage and BlueBubbles
|
||||
## iMessage і BlueBubbles
|
||||
|
||||
### Характерні ознаки збоїв iMessage and BlueBubbles
|
||||
### Характерні ознаки збоїв iMessage і BlueBubbles
|
||||
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| -------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| Немає вхідних подій | Перевірте доступність Webhook/сервера та дозволи застосунку | Виправте URL Webhook або стан сервера BlueBubbles. |
|
||||
| Можна надсилати, але немає прийому на macOS | Перевірте дозволи приватності macOS для автоматизації Messages | Повторно надайте дозволи TCC і перезапустіть процес каналу. |
|
||||
| Відправника DM заблоковано | `openclaw pairing list imessage` або `openclaw pairing list bluebubbles` | Підтвердьте сполучення або оновіть список дозволених. |
|
||||
| Немає вхідних подій | Перевірте досяжність Webhook/сервера та дозволи застосунку | Виправте URL Webhook або стан сервера BlueBubbles. |
|
||||
| Можна надсилати, але немає прийому на macOS | Перевірте дозволи конфіденційності macOS для автоматизації Messages | Повторно надайте дозволи TCC і перезапустіть процес каналу. |
|
||||
| Відправника DM заблоковано | `openclaw pairing list imessage` або `openclaw pairing list bluebubbles` | Підтвердьте pairing або оновіть список дозволених. |
|
||||
|
||||
Повне усунення несправностей:
|
||||
|
||||
- [/channels/imessage#troubleshooting](/uk/channels/imessage#troubleshooting)
|
||||
- [/channels/bluebubbles#troubleshooting](/uk/channels/bluebubbles#troubleshooting)
|
||||
- [Усунення несправностей iMessage](/uk/channels/imessage#troubleshooting)
|
||||
- [Усунення несправностей BlueBubbles](/uk/channels/bluebubbles#troubleshooting)
|
||||
|
||||
## Signal
|
||||
|
||||
### Характерні ознаки збоїв Signal
|
||||
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ------------------------------- | ----------------------------------- | ------------------------------------------------------------- |
|
||||
| Демон доступний, але бот мовчить | `openclaw channels status --probe` | Перевірте URL/обліковий запис демона `signal-cli` і режим receive. |
|
||||
| DM заблоковано | `openclaw pairing list signal` | Підтвердьте відправника або скоригуйте політику DM. |
|
||||
| Не спрацьовують відповіді в групі | Перевірте список дозволених груп і шаблони згадок | Додайте відправника/групу або послабте обмеження. |
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ------------------------------- | --------------------------------------- | ------------------------------------------------------------- |
|
||||
| Daemon доступний, але бот мовчить | `openclaw channels status --probe` | Перевірте URL/account daemon `signal-cli` і режим receive. |
|
||||
| DM заблоковано | `openclaw pairing list signal` | Підтвердьте відправника або скоригуйте політику DM. |
|
||||
| Відповіді в групі не спрацьовують | Перевірте список дозволених груп і шаблони згадування | Додайте відправника/групу або послабте правила фільтрації. |
|
||||
|
||||
Повне усунення несправностей: [/channels/signal#troubleshooting](/uk/channels/signal#troubleshooting)
|
||||
Повне усунення несправностей: [Усунення несправностей Signal](/uk/channels/signal#troubleshooting)
|
||||
|
||||
## QQ Bot
|
||||
|
||||
### Характерні ознаки збоїв QQ Bot
|
||||
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ------------------------------- | ------------------------------------------ | ---------------------------------------------------------------- |
|
||||
| Бот відповідає "gone to Mars" | Перевірте `appId` і `clientSecret` у конфігурації | Задайте облікові дані або перезапустіть Gateway. |
|
||||
| Немає вхідних повідомлень | `openclaw channels status --probe` | Перевірте облікові дані на QQ Open Platform. |
|
||||
| Голос не транскрибується | Перевірте конфігурацію провайдера STT | Налаштуйте `channels.qqbot.stt` або `tools.media.audio`. |
|
||||
| Ініційовані ботом повідомлення не надходять | Перевірте вимоги QQ platform до взаємодій | QQ може блокувати ініційовані ботом повідомлення без недавньої взаємодії. |
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------ |
|
||||
| Бот відповідає "gone to Mars" | Перевірте `appId` і `clientSecret` у конфігурації | Установіть облікові дані або перезапустіть Gateway. |
|
||||
| Немає вхідних повідомлень | `openclaw channels status --probe` | Перевірте облікові дані на QQ Open Platform. |
|
||||
| Голос не транскрибується | Перевірте конфігурацію провайдера STT | Налаштуйте `channels.qqbot.stt` або `tools.media.audio`. |
|
||||
| Проактивні повідомлення не надходять | Перевірте вимоги платформи QQ щодо взаємодії | QQ може блокувати повідомлення, ініційовані ботом, без недавньої взаємодії. |
|
||||
|
||||
Повне усунення несправностей: [/channels/qqbot#troubleshooting](/uk/channels/qqbot#troubleshooting)
|
||||
Повне усунення несправностей: [Усунення несправностей QQ Bot](/uk/channels/qqbot#troubleshooting)
|
||||
|
||||
## Matrix
|
||||
|
||||
### Характерні ознаки збоїв Matrix
|
||||
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ----------------------------------- | ----------------------------------- | -------------------------------------------------------------------------- |
|
||||
| Вхід виконано, але повідомлення кімнати ігноруються | `openclaw channels status --probe` | Перевірте `groupPolicy`, список дозволених кімнат і обмеження на згадки. |
|
||||
| DM не обробляються | `openclaw pairing list matrix` | Підтвердьте відправника або скоригуйте політику DM. |
|
||||
| Зашифровані кімнати не працюють | `openclaw matrix verify status` | Повторно верифікуйте пристрій, а потім перевірте `openclaw matrix verify backup status`. |
|
||||
| Відновлення резервної копії очікує/пошкоджене | `openclaw matrix verify backup status` | Виконайте `openclaw matrix verify backup restore` або повторіть із ключем відновлення. |
|
||||
| Кроспідписування/bootstrap виглядає неправильно | `openclaw matrix verify bootstrap` | За один прохід виправте secret storage, кроспідписування та стан резервних копій. |
|
||||
| Симптом | Найшвидша перевірка | Виправлення |
|
||||
| ----------------------------------- | --------------------------------------- | ------------------------------------------------------------------------- |
|
||||
| Вхід виконано, але повідомлення кімнат ігноруються | `openclaw channels status --probe` | Перевірте `groupPolicy`, список дозволених кімнат і фільтрацію за згадуванням. |
|
||||
| DM не обробляються | `openclaw pairing list matrix` | Підтвердьте відправника або скоригуйте політику DM. |
|
||||
| Зашифровані кімнати не працюють | `openclaw matrix verify status` | Повторно підтвердьте пристрій, потім перевірте `openclaw matrix verify backup status`. |
|
||||
| Відновлення резервної копії очікується/зламане | `openclaw matrix verify backup status` | Запустіть `openclaw matrix verify backup restore` або повторіть із recovery key. |
|
||||
| Cross-signing/bootstrap виглядає неправильно | `openclaw matrix verify bootstrap` | Виправте secret storage, cross-signing і стан резервної копії за один прохід. |
|
||||
|
||||
Повне налаштування та конфігурація: [Matrix](/uk/channels/matrix)
|
||||
Повне налаштування і конфігурація: [Matrix](/uk/channels/matrix)
|
||||
|
||||
@ -1,89 +1,89 @@
|
||||
---
|
||||
read_when:
|
||||
- Вам потрібно зрозуміти, чому завдання CI було або не було запущено
|
||||
- Ви налагоджуєте збої перевірок GitHub Actions
|
||||
summary: Граф завдань CI, шлюзи області змін і локальні еквіваленти команд
|
||||
- Вам потрібно зрозуміти, чому завдання CI було або не було запущене
|
||||
- Ви налагоджуєте перевірки GitHub Actions, що завершилися з помилкою
|
||||
summary: Граф завдань CI, обмеження за областю змін і локальні еквіваленти команд
|
||||
title: Конвеєр CI
|
||||
x-i18n:
|
||||
generated_at: "2026-04-21T18:05:48Z"
|
||||
generated_at: "2026-04-21T21:27:24Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 4d01a178402976cdf7c3c864695e8a12d3f7d1d069a77ea1b02a8aef2a3497f7
|
||||
source_hash: ae08bad6cbd0f2eced6c88a792a11bc1c2b1a2bfb003a56f70ff328a2739d3fc
|
||||
source_path: ci.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Конвеєр CI
|
||||
|
||||
CI запускається для кожного push у `main` і для кожного pull request. Він використовує розумне визначення області змін, щоб пропускати дорогі завдання, коли змінено лише нерелевантні частини.
|
||||
CI запускається для кожного push у `main` і для кожного pull request. Він використовує розумне обмеження за областю змін, щоб пропускати дорогі завдання, коли змінено лише не пов’язані ділянки.
|
||||
|
||||
## Огляд завдань
|
||||
|
||||
| Завдання | Призначення | Коли запускається |
|
||||
| -------------------------------- | -------------------------------------------------------------------------------------------- | ----------------------------------- |
|
||||
| `preflight` | Виявляє зміни лише в документації, області змін, змінені розширення та будує маніфест CI | Завжди для push і PR не в чернетці |
|
||||
| `security-scm-fast` | Виявлення приватних ключів і аудит workflow через `zizmor` | Завжди для push і PR не в чернетці |
|
||||
| `security-dependency-audit` | Аудит production lockfile без залежностей на основі advisories npm | Завжди для push і PR не в чернетці |
|
||||
| `security-fast` | Обов’язковий агрегат для швидких завдань безпеки | Завжди для push і PR не в чернетці |
|
||||
| `build-artifacts` | Один раз збирає `dist/` і Control UI, завантажує повторно використовувані артефакти для downstream-завдань | Зміни, релевантні для Node |
|
||||
| `checks-fast-core` | Швидкі Linux-етапи перевірки коректності, як-от bundled/plugin-contract/protocol checks | Зміни, релевантні для Node |
|
||||
| `checks-fast-contracts-channels` | Розшардовані перевірки контрактів каналів зі стабільним агрегованим результатом | Зміни, релевантні для Node |
|
||||
| `checks-node-extensions` | Повні шарди тестів bundled-plugin для всього набору розширень | Зміни, релевантні для Node |
|
||||
| `checks-node-core-test` | Шарди тестів core Node, за винятком каналів, bundled, контрактних і extension-етапів | Зміни, релевантні для Node |
|
||||
| `extension-fast` | Цільові тести лише для змінених bundled plugins | Коли виявлено зміни в розширеннях |
|
||||
| `check` | Розшардований еквівалент основного локального шлюзу: production types, lint, guards, test types і strict smoke | Зміни, релевантні для Node |
|
||||
| `check-additional` | Шарди архітектурних, boundary, extension-surface guards, package-boundary і gateway-watch перевірок | Зміни, релевантні для Node |
|
||||
| `build-smoke` | Smoke-тести зібраного CLI і smoke-перевірка пам’яті під час запуску | Зміни, релевантні для Node |
|
||||
| `checks` | Решта Linux Node-етапів: тести каналів і сумісність Node 22 лише для push | Зміни, релевантні для Node |
|
||||
| `check-docs` | Форматування документації, lint і перевірка на биті посилання | Документацію змінено |
|
||||
| Завдання | Призначення | Коли запускається |
|
||||
| -------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------- |
|
||||
| `preflight` | Виявляє зміни лише в документації, змінені області, змінені extensions і збирає маніфест CI | Завжди для push і PR, що не є draft |
|
||||
| `security-scm-fast` | Виявлення приватних ключів і аудит workflow через `zizmor` | Завжди для push і PR, що не є draft |
|
||||
| `security-dependency-audit` | Аудит production lockfile без залежностей щодо попереджень npm | Завжди для push і PR, що не є draft |
|
||||
| `security-fast` | Обов’язковий агрегат для швидких завдань безпеки | Завжди для push і PR, що не є draft |
|
||||
| `build-artifacts` | Один раз збирає `dist/` і Control UI, вивантажує повторно використовувані артефакти для наступних завдань | Зміни, релевантні для Node |
|
||||
| `checks-fast-core` | Швидкі Linux-етапи перевірки коректності, як-от bundled/plugin-contract/protocol перевірки | Зміни, релевантні для Node |
|
||||
| `checks-fast-contracts-channels` | Шардовані перевірки контрактів каналів зі стабільним агрегованим результатом перевірки | Зміни, релевантні для Node |
|
||||
| `checks-node-extensions` | Повні шарди тестів bundled-plugin для всього набору extension | Зміни, релевантні для Node |
|
||||
| `checks-node-core-test` | Шарди основних Node-тестів, без каналів, bundled, contract і extension-етапів | Зміни, релевантні для Node |
|
||||
| `extension-fast` | Цільові тести лише для змінених bundled plugins | Коли виявлено зміни в extension |
|
||||
| `check` | Шардований еквівалент основного локального gate: production types, lint, guards, test types і strict smoke | Зміни, релевантні для Node |
|
||||
| `check-additional` | Шарди архітектури, меж, guards поверхні extension, package-boundary і gateway-watch | Зміни, релевантні для Node |
|
||||
| `build-smoke` | Smoke-тести зібраного CLI і smoke-тест пам’яті під час запуску | Зміни, релевантні для Node |
|
||||
| `checks` | Решта Linux Node-етапів: тести каналів і сумісність лише для push із Node 22 | Зміни, релевантні для Node |
|
||||
| `check-docs` | Форматування документації, lint і перевірки битих посилань | Документацію змінено |
|
||||
| `skills-python` | Ruff + pytest для Skills на базі Python | Зміни, релевантні для Python Skills |
|
||||
| `checks-windows` | Windows-специфічні тестові етапи | Зміни, релевантні для Windows |
|
||||
| `macos-node` | Етап тестів TypeScript на macOS із використанням спільних зібраних артефактів | Зміни, релевантні для macOS |
|
||||
| `macos-swift` | Swift lint, build і тести для застосунку macOS | Зміни, релевантні для macOS |
|
||||
| `android` | Матриця збірки та тестів Android | Зміни, релевантні для Android |
|
||||
| `checks-windows` | Специфічні для Windows етапи тестування | Зміни, релевантні для Windows |
|
||||
| `macos-node` | Етап TypeScript-тестів на macOS із використанням спільних зібраних артефактів | Зміни, релевантні для macOS |
|
||||
| `macos-swift` | Swift lint, збірка і тести для застосунку macOS | Зміни, релевантні для macOS |
|
||||
| `android` | Матриця збірки і тестів Android | Зміни, релевантні для Android |
|
||||
|
||||
## Порядок Fail-Fast
|
||||
## Порядок швидкого завершення з помилкою
|
||||
|
||||
Завдання впорядковано так, щоб дешеві перевірки завершувалися з помилкою раніше, ніж запускаються дорогі:
|
||||
Завдання впорядковано так, щоб дешеві перевірки завершувалися з помилкою раніше, ніж запустяться дорогі:
|
||||
|
||||
1. `preflight` вирішує, які етапи взагалі існують. Логіка `docs-scope` і `changed-scope` — це кроки всередині цього завдання, а не окремі завдання.
|
||||
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` і `skills-python` завершуються швидко, не чекаючи важчих матричних завдань артефактів і платформ.
|
||||
3. `build-artifacts` виконується паралельно зі швидкими Linux-етапами, щоб downstream-споживачі могли почати роботу, щойно спільна збірка буде готова.
|
||||
4. Після цього розгалужуються важчі платформні та runtime-етапи: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, `extension-fast`, `checks`, `checks-windows`, `macos-node`, `macos-swift` і `android`.
|
||||
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` і `skills-python` швидко завершуються з помилкою, не очікуючи важчих завдань з артефактами й платформеними матрицями.
|
||||
3. `build-artifacts` виконується паралельно зі швидкими Linux-етапами, щоб наступні споживачі могли стартувати, щойно буде готова спільна збірка.
|
||||
4. Після цього розгалужуються важчі платформені й runtime-етапи: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, `extension-fast`, `checks`, `checks-windows`, `macos-node`, `macos-swift` і `android`.
|
||||
|
||||
Логіка області змін розміщена в `scripts/ci-changed-scope.mjs` і покрита unit-тестами в `src/scripts/ci-changed-scope.test.ts`.
|
||||
Окремий workflow `install-smoke` повторно використовує той самий скрипт області змін через власне завдання `preflight`. Він обчислює `run_install_smoke` із вужчого сигналу changed-smoke, тому Docker/install smoke запускається лише для змін, релевантних до встановлення, пакування та контейнерів.
|
||||
Логіка областей змін міститься в `scripts/ci-changed-scope.mjs` і покрита unit-тестами в `src/scripts/ci-changed-scope.test.ts`.
|
||||
Окремий workflow `install-smoke` повторно використовує той самий скрипт обмеження області через власне завдання `preflight`. Він обчислює `run_install_smoke` із вужчого сигналу changed-smoke, тому Docker/install smoke запускається лише для змін, релевантних до install, packaging і container.
|
||||
|
||||
Логіка локальних changed-lanes розміщена в `scripts/changed-lanes.mjs` і виконується через `scripts/check-changed.mjs`. Цей локальний шлюз суворіший щодо архітектурних меж, ніж широка область платформ у CI: зміни core production запускають typecheck core prod плюс тести core, зміни лише в core tests запускають лише typecheck/tests для core tests, зміни extension production запускають typecheck extension prod плюс тести розширень, а зміни лише в extension tests запускають лише typecheck/tests для extension tests. Зміни в public Plugin SDK або plugin-contract розширюють перевірку до validation розширень, тому що розширення залежать від цих core-контрактів. Невідомі зміни в корені/config безпечно переводять виконання на всі етапи.
|
||||
Локальна логіка changed-lane міститься в `scripts/changed-lanes.mjs` і виконується через `scripts/check-changed.mjs`. Цей локальний gate суворіший щодо архітектурних меж, ніж широке платформене обмеження області в CI: зміни core production запускають core prod typecheck плюс core tests, зміни лише core tests запускають лише core test typecheck/tests, зміни extension production запускають extension prod typecheck плюс extension tests, а зміни лише extension tests запускають лише extension test typecheck/tests. Зміни в публічному Plugin SDK або plugin-contract розширюють перевірку на extension, оскільки extensions залежать від цих контрактів core. Підвищення версії лише в release metadata запускають цільові перевірки version/config/root-dependency. Невідомі зміни в root/config безпечно розширюються до всіх етапів.
|
||||
|
||||
Для push матриця `checks` додає етап `compat-node22`, який запускається лише для push. Для pull request цей етап пропускається, і матриця залишається зосередженою на звичайних test/channel-етапах.
|
||||
Для push матриця `checks` додає етап `compat-node22`, який запускається лише для push. Для pull request цей етап пропускається, і матриця зосереджується на звичайних test/channel-етапах.
|
||||
|
||||
Найповільніші сімейства тестів Node розбиті на include-file шарди, щоб кожне завдання залишалося невеликим: channel contracts розділяють покриття registry і core на вісім зважених шардів кожне, тести auto-reply reply command поділено на чотири шарди за include-pattern, а інші великі групи auto-reply reply prefix — на два шарди кожна. `check-additional` також відокремлює compile/canary-роботи package-boundary від runtime topology gateway/architecture-робіт.
|
||||
Найповільніші сімейства Node-тестів розбиті на include-file шарди, щоб кожне завдання залишалося невеликим: контракти каналів розділяють registry і core coverage на вісім зважених шардів кожен, тести команд відповіді auto-reply розділяються на чотири шарди за include-pattern, а інші великі групи префіксів відповідей auto-reply — на два шарди кожна. `check-additional` також відокремлює compile/canary-роботи package-boundary від gateway/architecture-робіт топології runtime.
|
||||
|
||||
GitHub може позначати замінені новішими завдання як `cancelled`, коли новіший push потрапляє в той самий PR або ref `main`. Сприймайте це як шум CI, якщо лише найновіший запуск для того самого ref також не завершується з помилкою. Агреговані shard-перевірки явно вказують на цей випадок скасування, щоб його було легше відрізнити від помилки тесту.
|
||||
GitHub може позначати замінені новішими завдання як `cancelled`, коли новіший push надходить у той самий PR або ref `main`. Сприймайте це як шум CI, якщо тільки найновіший запуск для того самого ref також не завершується з помилкою. Агреговані шардові перевірки явно вказують на цей випадок скасування, щоб його було легше відрізнити від збою тесту.
|
||||
|
||||
## Runners
|
||||
|
||||
| Runner | Завдання |
|
||||
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `blacksmith-16vcpu-ubuntu-2404` | `preflight`, `security-scm-fast`, `security-dependency-audit`, `security-fast`, `build-artifacts`, Linux checks, docs checks, Python Skills, `android` |
|
||||
| `blacksmith-16vcpu-ubuntu-2404` | `preflight`, `security-scm-fast`, `security-dependency-audit`, `security-fast`, `build-artifacts`, Linux-перевірки, перевірки документації, Python Skills, `android` |
|
||||
| `blacksmith-32vcpu-windows-2025` | `checks-windows` |
|
||||
| `blacksmith-12vcpu-macos-latest` | `macos-node`, `macos-swift` у `openclaw/openclaw`; для forks використовується fallback на `macos-latest` |
|
||||
| `blacksmith-12vcpu-macos-latest` | `macos-node`, `macos-swift` у `openclaw/openclaw`; для fork використовується запасний варіант `macos-latest` |
|
||||
|
||||
## Локальні еквіваленти
|
||||
|
||||
```bash
|
||||
pnpm changed:lanes # переглянути локальний класифікатор changed-lanes для origin/main...HEAD
|
||||
pnpm check:changed # розумний локальний шлюз: змінені typecheck/lint/tests за boundary-етапом
|
||||
pnpm check # швидкий локальний шлюз: production tsgo + розшардований lint + паралельні швидкі guards
|
||||
pnpm changed:lanes # переглянути локальний класифікатор changed-lane для origin/main...HEAD
|
||||
pnpm check:changed # розумний локальний gate: changed typecheck/lint/tests за граничним етапом
|
||||
pnpm check # швидкий локальний gate: production tsgo + шардований lint + паралельні швидкі guards
|
||||
pnpm check:test-types
|
||||
pnpm check:timed # той самий шлюз із вимірюванням часу для кожного етапу
|
||||
pnpm check:timed # той самий gate з таймінгами для кожного етапу
|
||||
pnpm build:strict-smoke
|
||||
pnpm check:architecture
|
||||
pnpm test:gateway:watch-regression
|
||||
pnpm test # тести vitest
|
||||
pnpm test:channels
|
||||
pnpm test:contracts:channels
|
||||
pnpm check:docs # форматування docs + lint + перевірка битих посилань
|
||||
pnpm build # збірка dist, коли важливі етапи CI artifact/build-smoke
|
||||
pnpm check:docs # форматування документації + lint + биті посилання
|
||||
pnpm build # зібрати dist, коли важливі етапи CI artifact/build-smoke
|
||||
```
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,29 +1,29 @@
|
||||
---
|
||||
read_when:
|
||||
- Ви хочете вибрати постачальника моделей
|
||||
- Вам потрібен швидкий огляд підтримуваних бекендів LLM
|
||||
summary: Постачальники моделей (LLM), які підтримуються OpenClaw
|
||||
- Вам потрібен короткий огляд підтримуваних бекендів LLM
|
||||
summary: Постачальники моделей (LLM), що підтримуються OpenClaw
|
||||
title: Каталог постачальників
|
||||
x-i18n:
|
||||
generated_at: "2026-04-13T07:24:23Z"
|
||||
generated_at: "2026-04-21T21:27:20Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 3bc682d008119719826f71f74959ab32bedf14214459f5e6ac9cb70371d3c540
|
||||
source_hash: 7d77e5da93d71c48ea97460c6be56fbbe8279d9240a8101e1b35fdafb657737e
|
||||
source_path: providers/index.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Постачальники моделей
|
||||
|
||||
OpenClaw може використовувати багато постачальників LLM. Виберіть постачальника, пройдіть автентифікацію, а потім установіть
|
||||
модель за замовчуванням як `provider/model`.
|
||||
OpenClaw може використовувати багато постачальників LLM. Виберіть постачальника, пройдіть автентифікацію, а потім задайте
|
||||
модель за замовчуванням у форматі `provider/model`.
|
||||
|
||||
Шукаєте документацію щодо каналів чату (WhatsApp/Telegram/Discord/Slack/Mattermost (Plugin)/тощо)? Див. [Channels](/uk/channels).
|
||||
Шукаєте документацію для чат-каналів (WhatsApp/Telegram/Discord/Slack/Mattermost (plugin)/тощо)? Див. [Channels](/uk/channels).
|
||||
|
||||
## Швидкий старт
|
||||
|
||||
1. Пройдіть автентифікацію у постачальника (зазвичай через `openclaw onboard`).
|
||||
2. Установіть модель за замовчуванням:
|
||||
2. Задайте модель за замовчуванням:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -37,21 +37,21 @@ OpenClaw може використовувати багато постачаль
|
||||
- [Amazon Bedrock](/uk/providers/bedrock)
|
||||
- [Anthropic (API + Claude CLI)](/uk/providers/anthropic)
|
||||
- [Arcee AI (моделі Trinity)](/uk/providers/arcee)
|
||||
- [BytePlus (міжнародний)](/uk/concepts/model-providers#byteplus-international)
|
||||
- [BytePlus (міжнародна версія)](/uk/concepts/model-providers#byteplus-international)
|
||||
- [Chutes](/uk/providers/chutes)
|
||||
- [ComfyUI](/uk/providers/comfy)
|
||||
- [Cloudflare AI Gateway](/uk/providers/cloudflare-ai-gateway)
|
||||
- [ComfyUI](/uk/providers/comfy)
|
||||
- [DeepSeek](/uk/providers/deepseek)
|
||||
- [fal](/uk/providers/fal)
|
||||
- [Fireworks](/uk/providers/fireworks)
|
||||
- [GitHub Copilot](/uk/providers/github-copilot)
|
||||
- [моделі GLM](/uk/providers/glm)
|
||||
- [Моделі GLM](/uk/providers/glm)
|
||||
- [Google (Gemini)](/uk/providers/google)
|
||||
- [Groq (LPU inference)](/uk/providers/groq)
|
||||
- [Hugging Face (Inference)](/uk/providers/huggingface)
|
||||
- [Groq (LPU-інференс)](/uk/providers/groq)
|
||||
- [Hugging Face (інференс)](/uk/providers/huggingface)
|
||||
- [inferrs (локальні моделі)](/uk/providers/inferrs)
|
||||
- [Kilocode](/uk/providers/kilocode)
|
||||
- [LiteLLM (уніфікований Gateway)](/uk/providers/litellm)
|
||||
- [LiteLLM (уніфікований шлюз)](/uk/providers/litellm)
|
||||
- [LM Studio (локальні моделі)](/uk/providers/lmstudio)
|
||||
- [MiniMax](/uk/providers/minimax)
|
||||
- [Mistral](/uk/providers/mistral)
|
||||
@ -70,28 +70,29 @@ OpenClaw може використовувати багато постачаль
|
||||
- [StepFun](/uk/providers/stepfun)
|
||||
- [Synthetic](/uk/providers/synthetic)
|
||||
- [Together AI](/uk/providers/together)
|
||||
- [Venice (Venice AI, з акцентом на конфіденційність)](/uk/providers/venice)
|
||||
- [Venice (Venice AI, з акцентом на приватність)](/uk/providers/venice)
|
||||
- [Vercel AI Gateway](/uk/providers/vercel-ai-gateway)
|
||||
- [Vydra](/uk/providers/vydra)
|
||||
- [vLLM (локальні моделі)](/uk/providers/vllm)
|
||||
- [Volcengine (Doubao)](/uk/providers/volcengine)
|
||||
- [Vydra](/uk/providers/vydra)
|
||||
- [xAI](/uk/providers/xai)
|
||||
- [Xiaomi](/uk/providers/xiaomi)
|
||||
- [Z.AI](/uk/providers/zai)
|
||||
|
||||
## Спільні сторінки огляду
|
||||
## Спільні оглядові сторінки
|
||||
|
||||
- [Додаткові вбудовані варіанти](/uk/providers/models#additional-bundled-provider-variants) - Anthropic Vertex, Copilot Proxy і Gemini CLI OAuth
|
||||
- [Генерація зображень](/uk/tools/image-generation) - спільний інструмент `image_generate`, вибір постачальника та перемикання при відмові
|
||||
- [Генерація музики](/uk/tools/music-generation) - спільний інструмент `music_generate`, вибір постачальника та перемикання при відмові
|
||||
- [Генерація відео](/uk/tools/video-generation) - спільний інструмент `video_generate`, вибір постачальника та перемикання при відмові
|
||||
- [Додаткові вбудовані варіанти](/uk/providers/models#additional-bundled-provider-variants) - Anthropic Vertex, Copilot Proxy та Gemini CLI OAuth
|
||||
- [Генерація зображень](/uk/tools/image-generation) - Спільний інструмент `image_generate`, вибір постачальника та failover
|
||||
- [Генерація музики](/uk/tools/music-generation) - Спільний інструмент `music_generate`, вибір постачальника та failover
|
||||
- [Генерація відео](/uk/tools/video-generation) - Спільний інструмент `video_generate`, вибір постачальника та failover
|
||||
|
||||
## Постачальники транскрибування
|
||||
## Постачальники транскрипції
|
||||
|
||||
- [Deepgram (транскрибування аудіо)](/uk/providers/deepgram)
|
||||
- [Deepgram (транскрипція аудіо)](/uk/providers/deepgram)
|
||||
|
||||
## Інструменти спільноти
|
||||
|
||||
- [Claude Max API Proxy](/uk/providers/claude-max-api-proxy) - Проксі спільноти для облікових даних підписки Claude (перед використанням перевірте політику/умови Anthropic)
|
||||
|
||||
Повний каталог постачальників (xAI, Groq, Mistral тощо) і розширену конфігурацію див. у розділі [Постачальники моделей](/uk/concepts/model-providers).
|
||||
Щоб переглянути повний каталог постачальників (xAI, Groq, Mistral тощо) і розширену конфігурацію,
|
||||
див. [Постачальники моделей](/uk/concepts/model-providers).
|
||||
|
||||
@ -1,13 +1,13 @@
|
||||
---
|
||||
read_when:
|
||||
- Запуск або виправлення тестів
|
||||
summary: Як запускати тести локально (`vitest`) і коли використовувати режими force/coverage
|
||||
summary: Як запускати тести локально (`vitest`) і коли використовувати режими `force`/`coverage`
|
||||
title: Тести
|
||||
x-i18n:
|
||||
generated_at: "2026-04-20T22:38:11Z"
|
||||
generated_at: "2026-04-21T21:27:24Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 04bdcbc3a1121f4c460cd9060f581a49dfc6fa65c4b9ddb9c87db81c4a535166
|
||||
source_hash: ed665840ef2c7728da8ec923eb3ea2878d9b20a841cb2fe4116a7f6334567b8e
|
||||
source_path: reference/test.md
|
||||
workflow: 15
|
||||
---
|
||||
@ -16,35 +16,35 @@ x-i18n:
|
||||
|
||||
- Повний набір для тестування (набори тестів, live, Docker): [Тестування](/uk/help/testing)
|
||||
|
||||
- `pnpm test:force`: Завершує будь-який завислий процес gateway, який утримує стандартний control port, а потім запускає повний набір Vitest з ізольованим портом gateway, щоб серверні тести не конфліктували із запущеним екземпляром. Використовуйте це, якщо попередній запуск gateway залишив зайнятим порт 18789.
|
||||
- `pnpm test:coverage`: Запускає набір unit-тестів із покриттям V8 (через `vitest.unit.config.ts`). Це перевірка покриття unit-тестів для завантажених файлів, а не загальнорепозиторне покриття всіх файлів. Порогові значення: 70% для lines/functions/statements і 55% для branches. Оскільки `coverage.all` має значення false, перевірка вимірює файли, завантажені набором unit coverage, замість того щоб вважати всі вихідні файли розділених lane непокритими.
|
||||
- `pnpm test:coverage:changed`: Запускає unit coverage лише для файлів, змінених відносно `origin/main`.
|
||||
- `pnpm test:changed`: розгортає змінені git-шляхи у scoped lane Vitest, коли diff торкається лише routable source/test файлів. Зміни конфігурації/налаштування все одно повертаються до native root projects run, щоб за потреби зміни wiring запускали ширший повторний прогін.
|
||||
- `pnpm changed:lanes`: показує архітектурні lane, які запускаються diff відносно `origin/main`.
|
||||
- `pnpm check:changed`: запускає smart changed gate для diff відносно `origin/main`. Він запускає core-роботу з core test lane, роботу extensions — з extension test lane, зміни лише в тестах — тільки з test typecheck/tests, а також розширює зміни в публічному Plugin SDK або plugin-contract до валідації extensions.
|
||||
- `pnpm test`: маршрутизує явні цілі файлів/директорій через scoped lane Vitest. Запуски без цілі використовують фіксовані shard groups і розгортаються до leaf config для локального паралельного виконання; група extension завжди розгортається до per-extension shard config, а не до одного великого root-project process.
|
||||
- Повні запуски та запуски extension shard оновлюють локальні дані таймінгів у `.artifacts/vitest-shard-timings.json`; наступні запуски використовують ці таймінги для балансування повільних і швидких shard. Встановіть `OPENCLAW_TEST_PROJECTS_TIMINGS=0`, щоб ігнорувати локальний артефакт таймінгів.
|
||||
- Вибрані файли тестів `plugin-sdk` і `commands` тепер маршрутизуються через окремі легкі lane, які зберігають лише `test/setup.ts`, залишаючи resource-heavy випадки на їхніх наявних lane.
|
||||
- Вибрані вихідні helper-файли `plugin-sdk` і `commands` також маплять `pnpm test:changed` на явні sibling-тести в цих легких lane, щоб дрібні зміни helper не перезапускали важкі набори, що спираються на runtime.
|
||||
- `auto-reply` тепер також розділено на три окремі config (`core`, `top-level`, `reply`), щоб harness для reply не домінував над легшими top-level тестами status/token/helper.
|
||||
- Базова конфігурація Vitest тепер за замовчуванням використовує `pool: "threads"` і `isolate: false`, а спільний non-isolated runner увімкнено в конфігураціях усього репозиторію.
|
||||
- `pnpm test:force`: Завершує будь-який завислий процес gateway, що утримує типовий порт керування, а потім запускає повний набір Vitest з ізольованим портом gateway, щоб тести сервера не конфліктували із запущеним екземпляром. Використовуйте це, коли попередній запуск gateway залишив зайнятим порт 18789.
|
||||
- `pnpm test:coverage`: Запускає набір unit-тестів із покриттям V8 (через `vitest.unit.config.ts`). Це перевірка покриття unit-тестів для завантажених файлів, а не покриття всіх файлів у всьому репозиторії. Порогові значення: 70% для lines/functions/statements і 55% для branches. Оскільки `coverage.all` має значення false, перевірка вимірює файли, завантажені набором unit-тестів із покриттям, замість того щоб вважати всі файли вихідного коду у розбитих lane непокритими.
|
||||
- `pnpm test:coverage:changed`: Запускає unit-покриття лише для файлів, змінених відносно `origin/main`.
|
||||
- `pnpm test:changed`: розгортає змінені git-шляхи в scoped lane Vitest, коли diff зачіпає лише routable файли вихідного коду/тестів. Зміни конфігурації/налаштування все одно повертаються до нативного запуску root projects, щоб за потреби зміни у зв’язуванні запускали ширший прогін.
|
||||
- `pnpm changed:lanes`: показує архітектурні lane, що запускаються diff відносно `origin/main`.
|
||||
- `pnpm check:changed`: запускає розумну перевірку changed gate для diff відносно `origin/main`. Вона запускає core-роботу разом із core test lanes, роботу extension — разом із extension test lanes, зміни лише в тестах — лише з test typecheck/tests, розширює зміни публічного Plugin SDK або plugin-contract до перевірки extension, а також залишає version bump лише в release metadata на цільових перевірках version/config/root-dependency.
|
||||
- `pnpm test`: маршрутизує явні цілі файлів/каталогів через scoped lane Vitest. Запуски без цілі використовують фіксовані shard-групи й розгортаються до leaf configs для локального паралельного виконання; група extension завжди розгортається до per-extension shard configs, а не до одного великого процесу root-project.
|
||||
- Повні запуски та запуски extension shard оновлюють локальні дані часу в `.artifacts/vitest-shard-timings.json`; наступні запуски використовують ці значення часу для балансування повільних і швидких shard. Встановіть `OPENCLAW_TEST_PROJECTS_TIMINGS=0`, щоб ігнорувати локальний артефакт часу.
|
||||
- Вибрані тестові файли `plugin-sdk` і `commands` тепер маршрутизуються через окремі легкі lane, які зберігають лише `test/setup.ts`, залишаючи важкі з погляду runtime кейси в їхніх наявних lane.
|
||||
- Вибрані допоміжні файли вихідного коду `plugin-sdk` і `commands` також зіставляють `pnpm test:changed` з явними sibling tests у цих легких lane, щоб невеликі зміни helper не перезапускали важкі набори, прив’язані до runtime.
|
||||
- `auto-reply` тепер також розбивається на три окремі конфігурації (`core`, `top-level`, `reply`), щоб harness для reply не домінував над легшими top-level тестами status/token/helper.
|
||||
- Базова конфігурація Vitest тепер типово використовує `pool: "threads"` і `isolate: false`, а спільний неізольований runner увімкнено в конфігураціях усього репозиторію.
|
||||
- `pnpm test:channels` запускає `vitest.channels.config.ts`.
|
||||
- `pnpm test:extensions` і `pnpm test extensions` запускають усі shard extensions/plugins. Важкі channel extensions і OpenAI працюють як окремі shard; інші групи extensions залишаються згрупованими. Використовуйте `pnpm test extensions/<id>` для одного lane вбудованого Plugin.
|
||||
- `pnpm test:perf:imports`: вмикає звітність Vitest про import-duration та import-breakdown, при цьому все ще використовує маршрутизацію scoped lane для явних цілей файлів/директорій.
|
||||
- `pnpm test:perf:imports:changed`: те саме профілювання import, але лише для файлів, змінених відносно `origin/main`.
|
||||
- `pnpm test:perf:changed:bench -- --ref <git-ref>` порівнює продуктивність маршрутизованого режиму changed із native root-project run для того самого закоміченого git diff.
|
||||
- `pnpm test:perf:changed:bench -- --worktree` порівнює продуктивність поточного набору змін у worktree без попереднього коміту.
|
||||
- `pnpm test:perf:profile:main`: записує CPU profile для головного потоку Vitest (`.artifacts/vitest-main-profile`).
|
||||
- `pnpm test:perf:profile:runner`: записує CPU + heap profiles для unit runner (`.artifacts/vitest-runner-profile`).
|
||||
- Інтеграція Gateway: opt-in через `OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test` або `pnpm test:gateway`.
|
||||
- `pnpm test:e2e`: запускає наскрізні smoke-тести gateway (парування multi-instance WS/HTTP/node). За замовчуванням використовує `threads` + `isolate: false` з adaptive workers у `vitest.e2e.config.ts`; налаштовуйте через `OPENCLAW_E2E_WORKERS=<n>` і встановіть `OPENCLAW_E2E_VERBOSE=1` для докладних логів.
|
||||
- `pnpm test:live`: запускає live-тести provider (minimax/zai). Потрібні API keys і `LIVE=1` (або provider-specific `*_LIVE_TEST=1`) для зняття skip.
|
||||
- `pnpm test:docker:openwebui`: запускає Dockerized OpenClaw + Open WebUI, виконує вхід через Open WebUI, перевіряє `/api/models`, а потім запускає реальний проксійований чат через `/api/chat/completions`. Потребує придатного live model key (наприклад, OpenAI у `~/.profile`), завантажує зовнішній образ Open WebUI і не вважається стабільним для CI так, як звичайні unit/e2e набори.
|
||||
- `pnpm test:docker:mcp-channels`: запускає seeded контейнер Gateway і другий контейнер клієнта, який запускає `openclaw mcp serve`, а потім перевіряє routed conversation discovery, читання transcript, metadata вкладень, поведінку live event queue, маршрутизацію outbound send і сповіщення про channel + permissions у стилі Claude через реальний stdio bridge. Перевірка сповіщень Claude читає сирі stdio MCP frames безпосередньо, щоб smoke-тест відображав те, що bridge реально надсилає.
|
||||
- `pnpm test:extensions` і `pnpm test extensions` запускають усі shard extension/plugin. Важкі channel extensions і OpenAI запускаються як окремі shard; інші групи extension залишаються згрупованими. Використовуйте `pnpm test extensions/<id>` для одного lane вбудованого plugin.
|
||||
- `pnpm test:perf:imports`: вмикає звіти Vitest про тривалість імпорту та деталізацію імпортів, при цьому все ще використовує маршрутизацію scoped lane для явних цілей файлів/каталогів.
|
||||
- `pnpm test:perf:imports:changed`: те саме профілювання імпортів, але лише для файлів, змінених відносно `origin/main`.
|
||||
- `pnpm test:perf:changed:bench -- --ref <git-ref>` виконує benchmark маршрутизованого changed-режиму проти нативного запуску root-project для того самого закоміченого git diff.
|
||||
- `pnpm test:perf:changed:bench -- --worktree` виконує benchmark поточного набору змін у worktree без попереднього коміту.
|
||||
- `pnpm test:perf:profile:main`: записує CPU-профіль для головного потоку Vitest (`.artifacts/vitest-main-profile`).
|
||||
- `pnpm test:perf:profile:runner`: записує CPU + heap-профілі для unit runner (`.artifacts/vitest-runner-profile`).
|
||||
- Інтеграція Gateway: вмикається через `OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test` або `pnpm test:gateway`.
|
||||
- `pnpm test:e2e`: запускає smoke-тести gateway end-to-end (парування multi-instance WS/HTTP/node). Типово використовує `threads` + `isolate: false` з адаптивною кількістю workers у `vitest.e2e.config.ts`; налаштовуйте через `OPENCLAW_E2E_WORKERS=<n>` і встановіть `OPENCLAW_E2E_VERBOSE=1` для докладних журналів.
|
||||
- `pnpm test:live`: запускає live-тести provider (minimax/zai). Потребує API-ключів і `LIVE=1` (або provider-specific `*_LIVE_TEST=1`) для зняття пропуску.
|
||||
- `pnpm test:docker:openwebui`: запускає Dockerized OpenClaw + Open WebUI, виконує вхід через Open WebUI, перевіряє `/api/models`, а потім запускає реальний проксійований чат через `/api/chat/completions`. Потребує придатного ключа live model (наприклад, OpenAI у `~/.profile`), завантажує зовнішній образ Open WebUI і не вважається настільки стабільним для CI, як звичайні набори unit/e2e.
|
||||
- `pnpm test:docker:mcp-channels`: запускає seeded контейнер Gateway і другий контейнер-клієнт, який запускає `openclaw mcp serve`, а потім перевіряє routed conversation discovery, читання transcript, метадані вкладень, поведінку черги live events, outbound send routing і сповіщення про channel + permissions у стилі Claude через реальний міст stdio. Перевірка сповіщень Claude читає сирі stdio MCP-кадри безпосередньо, щоб smoke-тест відображав те, що міст справді надсилає.
|
||||
|
||||
## Локальний PR gate
|
||||
|
||||
Для локальних перевірок перед злиттям/проходження gate PR виконайте:
|
||||
Для локальних перевірок перед приземленням PR/gate запустіть:
|
||||
|
||||
- `pnpm check:changed`
|
||||
- `pnpm check`
|
||||
@ -53,27 +53,27 @@ x-i18n:
|
||||
- `pnpm test`
|
||||
- `pnpm check:docs`
|
||||
|
||||
Якщо `pnpm test` дає flaky-результат на навантаженому хості, перезапустіть один раз, перш ніж вважати це регресією, а потім ізолюйте через `pnpm test <path/to/test>`. Для хостів з обмеженою пам’яттю використовуйте:
|
||||
Якщо `pnpm test` дає флейк на навантаженому хості, перезапустіть один раз, перш ніж вважати це регресією, а потім ізолюйте через `pnpm test <path/to/test>`. Для хостів з обмеженою пам’яттю використовуйте:
|
||||
|
||||
- `OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test`
|
||||
- `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed`
|
||||
|
||||
## Бенч затримки моделі (локальні ключі)
|
||||
## Benchmark затримки моделі (локальні ключі)
|
||||
|
||||
Скрипт: [`scripts/bench-model.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/bench-model.ts)
|
||||
|
||||
Використання:
|
||||
|
||||
- `source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10`
|
||||
- Необов’язкові змінні середовища: `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY`
|
||||
- Типовий prompt: “Reply with a single word: ok. No punctuation or extra text.”
|
||||
- Необов’язкові env: `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY`
|
||||
- Типовий prompt: “Відповідай одним словом: ok. Без розділових знаків або додаткового тексту.”
|
||||
|
||||
Останній запуск (2025-12-31, 20 запусків):
|
||||
|
||||
- minimax median 1279ms (min 1114, max 2431)
|
||||
- opus median 2454ms (min 1224, max 3170)
|
||||
|
||||
## Бенч запуску CLI
|
||||
## Benchmark запуску CLI
|
||||
|
||||
Скрипт: [`scripts/bench-cli-startup.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/bench-cli-startup.ts)
|
||||
|
||||
@ -94,29 +94,29 @@ x-i18n:
|
||||
- `pnpm tsx scripts/bench-cli-startup.ts --preset real --cpu-prof-dir .artifacts/cli-cpu`
|
||||
- `pnpm tsx scripts/bench-cli-startup.ts --json`
|
||||
|
||||
Пресети:
|
||||
Набори preset:
|
||||
|
||||
- `startup`: `--version`, `--help`, `health`, `health --json`, `status --json`, `status`
|
||||
- `real`: `health`, `status`, `status --json`, `sessions`, `sessions --json`, `agents list --json`, `gateway status`, `gateway status --json`, `gateway health --json`, `config get gateway.port`
|
||||
- `all`: обидва пресети
|
||||
- `all`: обидва набори preset
|
||||
|
||||
Вивід містить `sampleCount`, avg, p50, p95, min/max, розподіл exit-code/signal і зведення max RSS для кожної команди. Необов’язкові `--cpu-prof-dir` / `--heap-prof-dir` записують V8 profiles для кожного запуску, тож збір таймінгів і profiles використовує той самий harness.
|
||||
Вивід містить `sampleCount`, avg, p50, p95, min/max, розподіл exit-code/signal і підсумки max RSS для кожної команди. Необов’язкові `--cpu-prof-dir` / `--heap-prof-dir` записують V8-профілі для кожного запуску, щоб вимірювання часу та збирання профілів використовували один і той самий harness.
|
||||
|
||||
Правила збереження виводу:
|
||||
Умовності для збереженого виводу:
|
||||
|
||||
- `pnpm test:startup:bench:smoke` записує цільовий smoke-артефакт у `.artifacts/cli-startup-bench-smoke.json`
|
||||
- `pnpm test:startup:bench:save` записує артефакт повного набору в `.artifacts/cli-startup-bench-all.json` з `runs=5` і `warmup=1`
|
||||
- `pnpm test:startup:bench:update` оновлює закомічений baseline fixture у `test/fixtures/cli-startup-bench.json` з `runs=5` і `warmup=1`
|
||||
- `pnpm test:startup:bench:save` записує артефакт повного набору в `.artifacts/cli-startup-bench-all.json`, використовуючи `runs=5` і `warmup=1`
|
||||
- `pnpm test:startup:bench:update` оновлює закомічений baseline fixture у `test/fixtures/cli-startup-bench.json`, використовуючи `runs=5` і `warmup=1`
|
||||
|
||||
Закомічений fixture:
|
||||
|
||||
- `test/fixtures/cli-startup-bench.json`
|
||||
- Оновіть через `pnpm test:startup:bench:update`
|
||||
- Порівняйте поточні результати з fixture через `pnpm test:startup:bench:check`
|
||||
- Оновлення через `pnpm test:startup:bench:update`
|
||||
- Порівняння поточних результатів із fixture через `pnpm test:startup:bench:check`
|
||||
|
||||
## Onboarding E2E (Docker)
|
||||
|
||||
Docker є необов’язковим; це потрібно лише для containerized smoke-тестів onboarding.
|
||||
Docker необов’язковий; це потрібно лише для containerized smoke-тестів onboarding.
|
||||
|
||||
Повний cold-start flow у чистому Linux-контейнері:
|
||||
|
||||
@ -124,11 +124,11 @@ Docker є необов’язковим; це потрібно лише для c
|
||||
scripts/e2e/onboard-docker.sh
|
||||
```
|
||||
|
||||
Цей скрипт керує інтерактивним wizard через pseudo-tty, перевіряє файли config/workspace/session, а потім запускає gateway і виконує `openclaw health`.
|
||||
Цей скрипт проходить інтерактивний майстер через pseudo-tty, перевіряє файли config/workspace/session, потім запускає gateway і виконує `openclaw health`.
|
||||
|
||||
## QR import smoke (Docker)
|
||||
## Smoke-тест імпорту QR (Docker)
|
||||
|
||||
Гарантує, що `qrcode-terminal` завантажується в підтримуваних Docker runtime Node (Node 24 за замовчуванням, Node 22 сумісний):
|
||||
Гарантує, що `qrcode-terminal` завантажується в підтримуваних runtime Node у Docker (типово Node 24, сумісність із Node 22):
|
||||
|
||||
```bash
|
||||
pnpm test:docker:qr
|
||||
|
||||
Loading…
Reference in New Issue
Block a user