diff --git a/docs/uk/nodes/talk.md b/docs/uk/nodes/talk.md index 40608e1d4..2ddee17cb 100644 --- a/docs/uk/nodes/talk.md +++ b/docs/uk/nodes/talk.md @@ -1,14 +1,14 @@ --- read_when: - Реалізація режиму розмови на macOS/iOS/Android - - Зміна голосу/TTS/поведінки переривання + - Зміна поведінки голосу/TTS/переривання summary: 'Режим розмови: безперервні голосові розмови з налаштованими TTS-провайдерами' title: Режим розмови x-i18n: - generated_at: "2026-04-25T07:53:39Z" + generated_at: "2026-04-25T19:17:37Z" model: gpt-5.4 provider: openai - source_hash: 84c99149c43bfe9fa4866b20271089d88d7e3d2f5abe6d16477a26915dad7829 + source_hash: 5f2130c58870000faa6c818587f4a487948f189b777426a81764e37c39204f51 source_path: nodes/talk.md workflow: 15 --- @@ -22,15 +22,15 @@ x-i18n: ## Поведінка (macOS) -- **Постійно активне накладання**, поки режим розмови увімкнено. -- Переходи між фазами **Слухання → Обробка → Озвучення**. -- Під час **короткої паузи** (вікно тиші) поточний транскрипт надсилається. -- Відповіді **записуються у WebChat** (так само, як і під час введення тексту). -- **Переривання мовленням** (типово ввімкнено): якщо користувач починає говорити, поки помічник озвучує відповідь, ми зупиняємо відтворення й фіксуємо часову позначку переривання для наступного запиту. +- **Завжди активне накладання** під час увімкненого режиму розмови. +- Переходи між фазами **Listening → Thinking → Speaking**. +- Після **короткої паузи** (вікно тиші) поточний транскрипт надсилається. +- Відповіді **записуються у WebChat** (так само, як і під час введення з клавіатури). +- **Переривання під час мовлення** (увімкнено за замовчуванням): якщо користувач починає говорити, поки асистент говорить, ми зупиняємо відтворення та позначаємо часову мітку переривання для наступного запиту. ## Голосові директиви у відповідях -Помічник може додати на початок своєї відповіді **один рядок JSON**, щоб керувати голосом: +Асистент може додати на початок своєї відповіді **один рядок JSON**, щоб керувати голосом: ```json { "voice": "", "once": true } @@ -41,14 +41,14 @@ x-i18n: - Лише перший непорожній рядок. - Невідомі ключі ігноруються. - `once: true` застосовується лише до поточної відповіді. -- Без `once` голос стає новим типовим голосом для режиму розмови. -- Рядок JSON видаляється перед відтворенням через TTS. +- Без `once` голос стає новим голосом за замовчуванням для режиму розмови. +- Рядок JSON видаляється перед TTS-відтворенням. Підтримувані ключі: - `voice` / `voice_id` / `voiceId` - `model` / `model_id` / `modelId` -- `speed`, `rate` (WPM), `stability`, `similarity`, `style`, `speakerBoost` +- `speed`, `rate` (слів за хвилину), `stability`, `similarity`, `style`, `speakerBoost` - `seed`, `normalize`, `lang`, `output_format`, `latency_tier` - `once` @@ -76,40 +76,47 @@ x-i18n: } ``` -Типові значення: +Значення за замовчуванням: - `interruptOnSpeech`: true -- `silenceTimeoutMs`: якщо не задано, Talk використовує типове для платформи вікно паузи перед надсиланням транскрипту (`700 ms` на macOS і Android, `900 ms` на iOS) +- `silenceTimeoutMs`: якщо не задано, Talk використовує стандартне для платформи вікно паузи перед надсиланням транскрипту (`700 ms` на macOS і Android, `900 ms` на iOS) - `provider`: вибирає активного Talk-провайдера. Використовуйте `elevenlabs`, `mlx` або `system` для локальних шляхів відтворення на macOS. -- `providers..voiceId`: використовує `ELEVENLABS_VOICE_ID` / `SAG_VOICE_ID` як запасний варіант для ElevenLabs (або перший голос ElevenLabs, якщо доступний API-ключ). -- `providers.elevenlabs.modelId`: якщо не задано, типово використовується `eleven_v3`. -- `providers.mlx.modelId`: якщо не задано, типово використовується `mlx-community/Soprano-80M-bf16`. -- `providers.elevenlabs.apiKey`: використовує `ELEVENLABS_API_KEY` як запасний варіант (або профіль shell Gateway, якщо доступно). -- `outputFormat`: типово `pcm_44100` на macOS/iOS і `pcm_24000` на Android (встановіть `mp3_*`, щоб примусово використовувати MP3-стримінг) +- `providers..voiceId`: використовує `ELEVENLABS_VOICE_ID` / `SAG_VOICE_ID` для ElevenLabs як резервне значення (або перший голос ElevenLabs, якщо доступний API-ключ). +- `providers.elevenlabs.modelId`: якщо не задано, за замовчуванням використовується `eleven_v3`. +- `providers.mlx.modelId`: якщо не задано, за замовчуванням використовується `mlx-community/Soprano-80M-bf16`. +- `providers.elevenlabs.apiKey`: використовує `ELEVENLABS_API_KEY` як резервне значення (або профіль shell шлюзу, якщо доступний). +- `outputFormat`: за замовчуванням `pcm_44100` на macOS/iOS і `pcm_24000` на Android (вкажіть `mp3_*`, щоб примусово використовувати MP3-потік) ## Інтерфейс macOS - Перемикач у рядку меню: **Talk** - Вкладка конфігурації: група **Talk Mode** (ідентифікатор голосу + перемикач переривання) - Накладання: - - **Listening**: хмара пульсує відповідно до рівня мікрофона + - **Listening**: пульсація хмари з рівнем мікрофона - **Thinking**: анімація занурення - - **Speaking**: кільця, що розходяться + - **Speaking**: розходження концентричних кілець - Натисніть на хмару: зупинити озвучення - Натисніть X: вийти з режиму розмови +## Інтерфейс Android + +- Перемикач на вкладці Voice: **Talk** +- Ручні режими захоплення **Mic** і **Talk** є взаємовиключними під час виконання. +- Ручний Mic зупиняється, коли застосунок виходить із переднього плану або користувач залишає вкладку Voice. +- Talk Mode продовжує працювати, доки його не буде вимкнено або доки Android Node не від’єднається, і під час активності використовує тип foreground service мікрофона Android. + ## Примітки - Потрібні дозволи на Speech і Microphone. - Використовує `chat.send` для ключа сесії `main`. -- Gateway виконує озвучення Talk через `talk.speak` з використанням активного Talk-провайдера. Android переходить на локальний системний TTS лише тоді, коли цей RPC недоступний. -- Локальне відтворення MLX на macOS використовує вбудований допоміжний інструмент `openclaw-mlx-tts`, якщо він доступний, або виконуваний файл у `PATH`. Установіть `OPENCLAW_MLX_TTS_BIN`, щоб указати на власний допоміжний бінарний файл під час розробки. +- Шлюз виконує відтворення Talk через `talk.speak` з використанням активного Talk-провайдера. Android переходить на локальний системний TTS лише тоді, коли цей RPC недоступний. +- Локальне відтворення MLX на macOS використовує вбудований допоміжний інструмент `openclaw-mlx-tts`, якщо він є, або виконуваний файл у `PATH`. Під час розробки встановіть `OPENCLAW_MLX_TTS_BIN`, щоб указати на власний допоміжний бінарний файл. - `stability` для `eleven_v3` перевіряється на значення `0.0`, `0.5` або `1.0`; інші моделі приймають `0..1`. -- `latency_tier` перевіряється в діапазоні `0..4`, якщо його задано. -- Android підтримує формати виводу `pcm_16000`, `pcm_22050`, `pcm_24000` і `pcm_44100` для низьколатентного стримінгу через AudioTrack. +- `latency_tier` перевіряється в діапазоні `0..4`, якщо задано. +- Android підтримує формати виводу `pcm_16000`, `pcm_22050`, `pcm_24000` і `pcm_44100` для низьколатентного потокового відтворення через AudioTrack. ## Пов’язане -- [Голосова активація](/uk/nodes/voicewake) +- [Активація голосом](/uk/nodes/voicewake) - [Аудіо та голосові нотатки](/uk/nodes/audio) - [Розуміння медіа](/uk/nodes/media-understanding) diff --git a/docs/uk/platforms/android.md b/docs/uk/platforms/android.md index 7c0246e46..76fab8258 100644 --- a/docs/uk/platforms/android.md +++ b/docs/uk/platforms/android.md @@ -1,53 +1,53 @@ --- read_when: - - Прив’язка або повторне підключення Android Node - - Налагодження виявлення Gateway або автентифікації Android - - Перевірка паритету історії чату між клієнтами -summary: 'Android app (node): інструкція з підключення + поверхня команд Connect/Chat/Voice/Canvas' -title: Android app + - Сполучення або повторне підключення Android Node + - Налагодження виявлення або автентифікації Android Gateway + - Перевірка відповідності історії чату між клієнтами +summary: 'Android застосунок (Node): інструкція з підключення + поверхня команд Connect/Chat/Voice/Canvas' +title: Android застосунок x-i18n: - generated_at: "2026-04-25T05:56:44Z" + generated_at: "2026-04-25T19:17:38Z" model: gpt-5.4 provider: openai - source_hash: 789de91275a11e63878ba670b9f316538d6b4731c22ec491b2c802f1cd14dcec + source_hash: 5a47c07e3301ad7b98f4827c9c34c42b7ba2f92c55aabd7b49606ab688191b66 source_path: platforms/android.md workflow: 15 --- -> **Примітка:** Android app ще не випущено публічно. Вихідний код доступний у [репозиторії OpenClaw](https://github.com/openclaw/openclaw) у `apps/android`. Ви можете зібрати його самостійно за допомогою Java 17 і Android SDK (`./gradlew :app:assemblePlayDebug`). Інструкції зі збирання дивіться в [apps/android/README.md](https://github.com/openclaw/openclaw/blob/main/apps/android/README.md). +> **Примітка:** Застосунок Android ще не було публічно випущено. Вихідний код доступний у [репозиторії OpenClaw](https://github.com/openclaw/openclaw) у `apps/android`. Ви можете зібрати його самостійно за допомогою Java 17 та Android SDK (`./gradlew :app:assemblePlayDebug`). Див. [apps/android/README.md](https://github.com/openclaw/openclaw/blob/main/apps/android/README.md) для інструкцій зі збирання. -## Стан підтримки +## Знімок підтримки -- Роль: супутній app Node (Android не розміщує Gateway). +- Роль: застосунок супутнього Node (Android не розміщує Gateway). - Gateway потрібен: так (запускайте його на macOS, Linux або Windows через WSL2). -- Встановлення: [Початок роботи](/uk/start/getting-started) + [Прив’язка](/uk/channels/pairing). +- Встановлення: [Початок роботи](/uk/start/getting-started) + [Сполучення](/uk/channels/pairing). - Gateway: [Інструкція](/uk/gateway) + [Конфігурація](/uk/gateway/configuration). - - Протоколи: [Протокол Gateway](/uk/gateway/protocol) (Nodes + площина керування). + - Протоколи: [Протокол Gateway](/uk/gateway/protocol) (Node + контрольна площина). ## Керування системою -Керування системою (launchd/systemd) розміщується на хості Gateway. Див. [Gateway](/uk/gateway). +Керування системою (`launchd`/`systemd`) розташоване на хості Gateway. Див. [Gateway](/uk/gateway). ## Інструкція з підключення -Android Node app ⇄ (mDNS/NSD + WebSocket) ⇄ **Gateway** +Застосунок Android Node ⇄ (mDNS/NSD + WebSocket) ⇄ **Gateway** -Android підключається безпосередньо до WebSocket Gateway і використовує прив’язку пристрою (`role: node`). +Android підключається безпосередньо до WebSocket Gateway і використовує сполучення пристрою (`role: node`). -Для Tailscale або публічних хостів Android потребує захищеного endpoint: +Для Tailscale або публічних хостів Android потребує захищену кінцеву точку: - Бажано: Tailscale Serve / Funnel з `https://` / `wss://` -- Також підтримується: будь-який інший URL Gateway `wss://` із реальним TLS endpoint -- Незашифрований `ws://` як і раніше підтримується для приватних LAN-адрес / хостів `.local`, а також `localhost`, `127.0.0.1` і мосту емулятора Android (`10.0.2.2`) +- Також підтримується: будь-який інший URL Gateway `wss://` із реальною TLS-кінцевою точкою +- Незашифрований `ws://` залишається підтримуваним для приватних LAN-адрес / хостів `.local`, а також `localhost`, `127.0.0.1` і мосту емулятора Android (`10.0.2.2`) ### Передумови -- Ви можете запустити Gateway на «головній» машині. +- Ви можете запустити Gateway на “master”-машині. - Пристрій/емулятор Android може досягти WebSocket gateway: - - Та сама LAN з mDNS/NSD, **або** - - Та сама tailnet Tailscale з Wide-Area Bonjour / unicast DNS-SD (див. нижче), **або** - - Ручне задання хоста/порту gateway (резервний варіант) -- Мобільна прив’язка через tailnet/публічну мережу **не** використовує сирі endpoint `ws://` на IP tailnet. Замість цього використовуйте Tailscale Serve або інший URL `wss://`. + - У тій самій LAN із mDNS/NSD, **або** + - У тій самій мережі Tailscale з Wide-Area Bonjour / unicast DNS-SD (див. нижче), **або** + - Ручний хост/порт gateway (резервний варіант) +- Мобільне сполучення через tailnet/публічну мережу **не** використовує сирі кінцеві точки `ws://` tailnet IP. Натомість використовуйте Tailscale Serve або інший URL `wss://`. - Ви можете запускати CLI (`openclaw`) на машині gateway (або через SSH). ### 1) Запустіть Gateway @@ -56,63 +56,62 @@ Android підключається безпосередньо до WebSocket Gat openclaw gateway --port 18789 --verbose ``` -Переконайтеся, що в журналах є щось на кшталт: +Підтвердьте в журналах, що бачите щось на кшталт: - `listening on ws://0.0.0.0:18789` -Для віддаленого доступу Android через Tailscale надавайте перевагу Serve/Funnel замість прямої прив’язки tailnet: +Для віддаленого доступу Android через Tailscale віддавайте перевагу Serve/Funnel замість сирого прив’язування tailnet: ```bash openclaw gateway --tailscale serve ``` -Це надає Android захищений endpoint `wss://` / `https://`. Звичайного налаштування `gateway.bind: "tailnet"` недостатньо для першої віддаленої прив’язки Android, якщо ви також окремо не завершуєте TLS. +Це надає Android захищену кінцеву точку `wss://` / `https://`. Простого налаштування `gateway.bind: "tailnet"` недостатньо для першого віддаленого сполучення Android, якщо ви також окремо не завершуєте TLS. ### 2) Перевірте виявлення (необов’язково) -З машини gateway: +На машині gateway: ```bash dns-sd -B _openclaw-gw._tcp local. ``` -Додаткові примітки з налагодження: [Bonjour](/uk/gateway/bonjour). +Більше приміток щодо налагодження: [Bonjour](/uk/gateway/bonjour). -Якщо ви також налаштували домен wide-area discovery, порівняйте з: +Якщо ви також налаштували wide-area домен для виявлення, порівняйте з: ```bash openclaw gateway discover --json ``` -Це показує `local.` разом із налаштованим wide-area доменом за один прохід і використовує розв’язаний -endpoint сервісу замість лише підказок TXT. +Це показує `local.` разом із налаштованим wide-area доменом за один прохід і використовує розв’язану кінцеву точку сервісу замість лише TXT-підказок. -#### Виявлення через tailnet (Відень ⇄ Лондон) за допомогою unicast DNS-SD +#### Виявлення через tailnet (Vienna ⇄ London) за допомогою unicast DNS-SD -Виявлення Android через NSD/mDNS не проходить між мережами. Якщо ваш Android Node і gateway перебувають у різних мережах, але з’єднані через Tailscale, натомість використовуйте Wide-Area Bonjour / unicast DNS-SD. +Виявлення Android NSD/mDNS не працює між різними мережами. Якщо ваш Android Node і gateway перебувають у різних мережах, але з’єднані через Tailscale, використовуйте Wide-Area Bonjour / unicast DNS-SD. -Самого лише виявлення недостатньо для прив’язки Android через tailnet/публічну мережу. Виявлений маршрут усе одно потребує захищеного endpoint (`wss://` або Tailscale Serve): +Самого виявлення недостатньо для сполучення Android через tailnet/публічну мережу. Виявлений маршрут усе одно потребує захищеної кінцевої точки (`wss://` або Tailscale Serve): 1. Налаштуйте зону DNS-SD (наприклад, `openclaw.internal.`) на хості gateway і опублікуйте записи `_openclaw-gw._tcp`. -2. Налаштуйте split DNS у Tailscale для вибраного домену з указанням на цей DNS-сервер. +2. Налаштуйте Tailscale split DNS для вибраного вами домену з вказанням цього DNS-сервера. Докладніше та приклад конфігурації CoreDNS: [Bonjour](/uk/gateway/bonjour). ### 3) Підключіться з Android -У Android app: +У застосунку Android: -- App підтримує з’єднання з gateway через **foreground service** (постійне сповіщення). +- Застосунок підтримує з’єднання з gateway через **foreground service** (постійну сповіщення). - Відкрийте вкладку **Connect**. -- Використайте режим **Setup Code** або **Manual**. -- Якщо виявлення заблоковане, використовуйте ручне задання хоста/порту в **Advanced controls**. Для приватних хостів LAN `ws://` усе ще працює. Для Tailscale/публічних хостів увімкніть TLS і використовуйте endpoint `wss://` / Tailscale Serve. +- Використовуйте режим **Setup Code** або **Manual**. +- Якщо виявлення заблоковане, використовуйте ручний хост/порт у **Advanced controls**. Для приватних LAN-хостів `ws://` усе ще працює. Для Tailscale/публічних хостів увімкніть TLS і використовуйте кінцеву точку `wss://` / Tailscale Serve. -Після першої успішної прив’язки Android автоматично перепідключається під час запуску: +Після першого успішного сполучення Android автоматично перепідключається під час запуску: -- Manual endpoint (якщо ввімкнено), інакше +- Ручна кінцева точка (якщо ввімкнено), інакше - Останній виявлений gateway (best-effort). -### 4) Схваліть прив’язку (CLI) +### 4) Підтвердьте сполучення (CLI) На машині gateway: @@ -122,10 +121,10 @@ openclaw devices approve openclaw devices reject ``` -Докладніше про прив’язку: [Прив’язка](/uk/channels/pairing). +Докладніше про сполучення: [Сполучення](/uk/channels/pairing). Необов’язково: якщо Android Node завжди підключається з жорстко контрольованої підмережі, -ви можете явно ввімкнути автосхвалення першої прив’язки Node за явними CIDR або точними IP: +ви можете явно ввімкнути авто-підтвердження першого сполучення Node для конкретних CIDR або точних IP: ```json5 { @@ -139,13 +138,11 @@ openclaw devices reject } ``` -За замовчуванням це вимкнено. Це застосовується лише до нової прив’язки `role: node` без -запитаних scopes. Прив’язка operator/browser і будь-яка зміна ролі, scope, metadata або -публічного ключа, як і раніше, потребують ручного схвалення. +Це вимкнено типово. Це застосовується лише до нового сполучення `role: node` без запитаних scopes. Сполучення operator/browser і будь-які зміни ролі, scope, metadata або відкритого ключа все одно потребують ручного підтвердження. ### 5) Перевірте, що Node підключено -- Через статус Nodes: +- Через статус Node: ```bash openclaw nodes status @@ -157,57 +154,53 @@ openclaw devices reject openclaw gateway call node.list --params "{}" ``` -### 6) Chat + історія +### 6) Chat + history -Вкладка Chat в Android підтримує вибір сесії (типово `main`, а також інші наявні сесії): +Вкладка Chat в Android підтримує вибір сеансу (типово `main`, а також інші наявні сеанси): -- Історія: `chat.history` (нормалізована для відображення; inline-теги директив - прибираються з видимого тексту, XML payload викликів інструментів у звичайному тексті (включно з - `...`, `...`, - `...`, `...` і - обрізаними блоками викликів інструментів) та витоки ASCII/повноширинних токенів керування моделлю - прибираються, чисті рядки асистента лише з тихими токенами, такі як точні `NO_REPLY` / - `no_reply`, пропускаються, а надто великі рядки можуть бути замінені заповнювачами) +- Історія: `chat.history` (нормалізовано для відображення; вбудовані теги директив видаляються з видимого тексту, XML-навантаження викликів інструментів у звичайному тексті (включно з `...`, `...`, `...`, `...`, а також обрізаними блоками викликів інструментів) і витіклі ASCII/повноширинні токени керування моделлю видаляються, чисті рядки помічника з тихими токенами, як-от точні `NO_REPLY` / `no_reply`, пропускаються, а надто великі рядки можуть бути замінені заповнювачами) - Надсилання: `chat.send` - Push-оновлення (best-effort): `chat.subscribe` → `event:"chat"` -### 7) Canvas + камера +### 7) Canvas + camera -#### Хост Canvas Gateway (рекомендовано для web-вмісту) +#### Хост Gateway Canvas (рекомендовано для вебвмісту) -Якщо ви хочете, щоб Node показував справжній HTML/CSS/JS, який агент може редагувати на диску, спрямуйте Node на canvas host Gateway. +Якщо ви хочете, щоб Node показував справжні HTML/CSS/JS, які агент може редагувати на диску, спрямуйте Node на хост canvas Gateway. -Примітка: Nodes завантажують canvas з HTTP-сервера Gateway (той самий порт, що й `gateway.port`, типово `18789`). +Примітка: Node завантажують canvas із HTTP-сервера Gateway (той самий порт, що й `gateway.port`, типово `18789`). 1. Створіть `~/.openclaw/workspace/canvas/index.html` на хості gateway. -2. Перейдіть до нього з Node (LAN): +2. Перейдіть до нього на Node (LAN): ```bash openclaw nodes invoke --node "" --command canvas.navigate --params '{"url":"http://.local:18789/__openclaw__/canvas/"}' ``` -Tailnet (необов’язково): якщо обидва пристрої в Tailscale, використовуйте ім’я MagicDNS або IP tailnet замість `.local`, наприклад `http://:18789/__openclaw__/canvas/`. +Tailnet (необов’язково): якщо обидва пристрої в Tailscale, використовуйте ім’я MagicDNS або tailnet IP замість `.local`, наприклад `http://:18789/__openclaw__/canvas/`. -Цей сервер ін’єктує клієнт live-reload у HTML і перезавантажує сторінку при зміні файлів. -Хост A2UI розташовано за адресою `http://:18789/__openclaw__/a2ui/`. +Цей сервер вбудовує клієнт live-reload в HTML і перезавантажує сторінку при зміні файлів. +Хост A2UI розташований за адресою `http://:18789/__openclaw__/a2ui/`. -Команди Canvas (лише на передньому плані): +Команди Canvas (лише у foreground): -- `canvas.eval`, `canvas.snapshot`, `canvas.navigate` (використовуйте `{"url":""}` або `{"url":"/"}`, щоб повернутися до типового scaffold). `canvas.snapshot` повертає `{ format, base64 }` (типово `format="jpeg"`). -- A2UI: `canvas.a2ui.push`, `canvas.a2ui.reset` (`canvas.a2ui.pushJSONL` — застарілий alias) +- `canvas.eval`, `canvas.snapshot`, `canvas.navigate` (використовуйте `{"url":""}` або `{"url":"/"}` для повернення до типової scaffolding-сторінки). `canvas.snapshot` повертає `{ format, base64 }` (типово `format="jpeg"`). +- A2UI: `canvas.a2ui.push`, `canvas.a2ui.reset` (`canvas.a2ui.pushJSONL` — застарілий псевдонім) -Команди камери (лише на передньому плані; обмежуються дозволами): +Команди camera (лише у foreground; із контролем дозволів): - `camera.snap` (jpg) - `camera.clip` (mp4) -Параметри та допоміжні інструменти CLI дивіться в [Camera node](/uk/nodes/camera). +Параметри та допоміжні засоби CLI див. у [Camera node](/uk/nodes/camera). ### 8) Voice + розширена поверхня команд Android -- Voice: Android використовує єдиний сценарій увімкнення/вимкнення мікрофона на вкладці Voice із захопленням транскрипту та відтворенням `talk.speak`. Локальний системний TTS використовується лише коли `talk.speak` недоступний. Voice зупиняється, коли app виходить із переднього плану. -- Перемикачі пробудження Voice/talk-mode наразі прибрані з UX/runtime Android. +- Вкладка Voice: Android має два явні режими захоплення. **Mic** — це ручний сеанс вкладки Voice, який надсилає кожну паузу як хід чату і зупиняється, коли застосунок виходить із foreground або користувач залишає вкладку Voice. **Talk** — це безперервний Talk Mode, який продовжує слухати, доки його не вимкнено або Node не відключиться. +- Talk Mode підвищує наявний foreground service з `dataSync` до `dataSync|microphone` перед початком захоплення, а потім знижує його, коли Talk Mode зупиняється. Android 14+ вимагає оголошення `FOREGROUND_SERVICE_MICROPHONE`, runtime-дозвіл `RECORD_AUDIO` і тип служби microphone під час виконання. +- Озвучені відповіді використовують `talk.speak` через налаштованого провайдера Talk gateway. Локальний системний TTS використовується лише тоді, коли `talk.speak` недоступний. +- Голосове пробудження залишається вимкненим в UX/runtime Android. - Додаткові сімейства команд Android (доступність залежить від пристрою та дозволів): - `device.status`, `device.info`, `device.permissions`, `device.health` - `notifications.list`, `notifications.actions` (див. [Пересилання сповіщень](#notification-forwarding) нижче) @@ -218,34 +211,32 @@ Tailnet (необов’язково): якщо обидва пристрої в - `sms.search` - `motion.activity`, `motion.pedometer` -## Точки входу Assistant +## Точки входу помічника -Android підтримує запуск OpenClaw із системного тригера Assistant (Google +Android підтримує запуск OpenClaw із системного тригера помічника (Google Assistant). Якщо це налаштовано, утримання кнопки home або фраза "Hey Google, ask -OpenClaw..." відкриває app і передає промпт у поле введення чату. +OpenClaw..." відкриває застосунок і передає запит у поле введення чату. -Для цього використовуються метадані Android **App Actions**, оголошені в маніфесті app. Жодної -додаткової конфігурації на боці gateway не потрібно — intent Assistant повністю -обробляється Android app і пересилається як звичайне повідомлення чату. +Для цього використовуються метадані Android **App Actions**, оголошені в маніфесті застосунку. Додаткове налаштування на боці gateway не потрібне -- намір помічника повністю обробляється застосунком Android і пересилається як звичайне повідомлення чату. Доступність App Actions залежить від пристрою, версії Google Play Services -і від того, чи встановив користувач OpenClaw як app Assistant за замовчуванням. +і від того, чи встановив користувач OpenClaw як типовий застосунок-помічник. ## Пересилання сповіщень -Android може пересилати сповіщення пристрою до gateway як події. Кілька елементів керування дають змогу обмежити, які сповіщення пересилаються і коли. +Android може пересилати сповіщення пристрою до gateway як події. Кілька елементів керування дають змогу обмежити, які саме сповіщення пересилаються і коли. -| Key | Type | Опис | -| -------------------------------- | -------------- | ------------------------------------------------------------------------------------------------- | -| `notifications.allowPackages` | string[] | Пересилати лише сповіщення від цих назв пакетів. Якщо задано, усі інші пакети ігноруються. | -| `notifications.denyPackages` | string[] | Ніколи не пересилати сповіщення від цих назв пакетів. Застосовується після `allowPackages`. | -| `notifications.quietHours.start` | string (HH:mm) | Початок вікна тихих годин (локальний час пристрою). Сповіщення пригнічуються в це вікно. | -| `notifications.quietHours.end` | string (HH:mm) | Кінець вікна тихих годин. | -| `notifications.rateLimit` | number | Максимум пересланих сповіщень на пакет за хвилину. Надлишкові сповіщення відкидаються. | +| Key | Type | Description | +| -------------------------------- | -------------- | ---------------------------------------------------------------------------------------------------- | +| `notifications.allowPackages` | string[] | Пересилати лише сповіщення від цих назв пакетів. Якщо задано, усі інші пакети ігноруються. | +| `notifications.denyPackages` | string[] | Ніколи не пересилати сповіщення від цих назв пакетів. Застосовується після `allowPackages`. | +| `notifications.quietHours.start` | string (HH:mm) | Початок вікна тихих годин (локальний час пристрою). Сповіщення пригнічуються протягом цього вікна. | +| `notifications.quietHours.end` | string (HH:mm) | Кінець вікна тихих годин. | +| `notifications.rateLimit` | number | Максимальна кількість пересланих сповіщень на пакет за хвилину. Надлишкові сповіщення відкидаються. | -Засіб вибору сповіщень також використовує безпечнішу поведінку для подій пересланих сповіщень, запобігаючи випадковому пересиланню чутливих системних сповіщень. +Пікер сповіщень також використовує безпечнішу поведінку для подій пересланих сповіщень, запобігаючи випадковому пересиланню чутливих системних сповіщень. Приклад конфігурації: @@ -264,11 +255,11 @@ Android може пересилати сповіщення пристрою до ``` -Пересилання сповіщень потребує дозволу Android Notification Listener. App запитує його під час налаштування. +Для пересилання сповіщень потрібен дозвіл Android Notification Listener. Під час налаштування застосунок запропонує надати його. ## Пов’язане -- [iOS app](/uk/platforms/ios) -- [Nodes](/uk/nodes) +- [Застосунок iOS](/uk/platforms/ios) +- [Node](/uk/nodes) - [Усунення несправностей Android Node](/uk/nodes/troubleshooting) diff --git a/docs/uk/reference/transcript-hygiene.md b/docs/uk/reference/transcript-hygiene.md index 2381f42a6..ba2c745a5 100644 --- a/docs/uk/reference/transcript-hygiene.md +++ b/docs/uk/reference/transcript-hygiene.md @@ -1,95 +1,96 @@ --- read_when: - - Ви налагоджуєте відхилення запитів постачальника, пов’язані з формою транскрипту - - Ви змінюєте логіку санітизації транскриптів або виправлення викликів інструментів - - Ви досліджуєте невідповідності ідентифікаторів викликів інструментів між постачальниками -summary: 'Довідка: правила санітизації та виправлення транскриптів, специфічні для постачальника' + - Ви налагоджуєте відхилення запитів провайдера, пов’язані з формою транскрипту + - Ви змінюєте санітизацію транскрипту або логіку відновлення викликів інструментів + - Ви досліджуєте невідповідності ідентифікаторів викликів інструментів між провайдерами +summary: 'Довідка: правила санітизації та відновлення транскриптів, специфічні для провайдера' title: Гігієна транскриптів x-i18n: - generated_at: "2026-04-25T19:09:04Z" + generated_at: "2026-04-25T19:17:40Z" model: gpt-5.4 provider: openai - source_hash: 784ef61cd4298d4095285b94bf45a97df700441a19d6020df12d1f5c90ba0ba1 + source_hash: e380be2b011afca5fedf89579e702c6d221d42e777c23bd766c8df07ff05ed18 source_path: reference/transcript-hygiene.md workflow: 15 --- -Цей документ описує **виправлення, специфічні для постачальника**, які застосовуються до транскриптів перед запуском -(побудовою контексту моделі). Більшість із них — це коригування **в пам’яті**, що використовуються для задоволення -суворих вимог постачальника. Окремий прохід виправлення файлу сесії також може переписувати -збережений JSONL до завантаження сесії — або видаляючи некоректні рядки JSONL, або -виправляючи збережені ходи, які є синтаксично коректними, але, як відомо, відхиляються -постачальником під час відтворення. Коли виконується виправлення, поруч із файлом сесії -зберігається резервна копія оригінального файлу. +Цей документ описує **специфічні для провайдера виправлення**, що застосовуються до транскриптів перед запуском +(побудовою контексту моделі). Більшість із них — це **в пам’яті** виконувані коригування, що використовуються для дотримання +суворих вимог провайдера. Окремий прохід відновлення файла сесії також може переписувати +збережений JSONL до завантаження сесії — або шляхом відкидання некоректних рядків JSONL, або +шляхом відновлення збережених ходів, які є синтаксично коректними, але, як відомо, відхиляються +провайдером під час повторного відтворення. Коли відновлення виконується, оригінальний файл +зберігається в резервній копії поруч із файлом сесії. -Охоплюється таке: +Обсяг охоплює: -- Контекст підказки лише для часу виконання, який не потрапляє у видимі користувачу ходи транскрипту -- Санітизація ідентифікаторів викликів інструментів -- Валідація вхідних даних викликів інструментів -- Виправлення парування результатів інструментів -- Валідація / упорядкування ходів +- Контекст промпту лише для виконання, який не потрапляє до видимих користувачеві ходів транскрипту +- Санітизацію ідентифікаторів викликів інструментів +- Валідацію вхідних даних викликів інструментів +- Відновлення парування результатів інструментів +- Валідацію / упорядкування ходів - Очищення сигнатур думок -- Санітизація корисного навантаження зображень -- Маркування походження користувацького вводу (для підказок, маршрутизованих між сесіями) -- Виправлення порожніх ходів помилок асистента для відтворення Bedrock Converse +- Очищення сигнатур мислення +- Санітизацію корисного навантаження зображень +- Позначення походження користувацького вводу (для промптів, маршрутизованих між сесіями) +- Відновлення порожніх ходів помилок асистента для повторного відтворення Bedrock Converse -Якщо вам потрібні подробиці про зберігання транскриптів, див. : +Якщо вам потрібні деталі про зберігання транскриптів, див.: - [Поглиблений розбір керування сесіями](/uk/reference/session-management-compaction) --- -## Глобальне правило: контекст часу виконання — це не користувацький транскрипт +## Глобальне правило: контекст виконання не є користувацьким транскриптом -Контекст часу виконання / системний контекст може бути доданий до підказки моделі для ходу, але це -не вміст, створений кінцевим користувачем. OpenClaw зберігає окреме тіло підказки, орієнтоване -на транскрипт, для відповідей Gateway, follow-up-повідомлень у черзі, ACP, CLI та вбудованих -запусків Pi. Збережені видимі користувацькі ходи використовують саме це тіло -транскрипту замість підказки, збагаченої контекстом часу виконання. +Контекст виконання/системний контекст може додаватися до промпту моделі для ходу, але це +не контент, створений кінцевим користувачем. OpenClaw зберігає окреме тіло +промпту, орієнтоване на транскрипт, для відповідей Gateway, поставлених у чергу подальших дій, +ACP, CLI та вбудованих запусків Pi. Видимі збережені користувацькі ходи використовують +це тіло транскрипту замість промпту, збагаченого контекстом виконання. -Для застарілих сесій, які вже зберегли обгортки часу виконання, поверхні історії -Gateway застосовують проєкцію відображення перед поверненням повідомлень у WebChat, -TUI, REST або SSE-клієнти. +Для застарілих сесій, які вже зберегли обгортки виконання, поверхні історії Gateway +застосовують проєкцію відображення перед поверненням повідомлень до WebChat, +TUI, REST або SSE-клієнтів. --- ## Де це виконується -Уся гігієна транскриптів централізована у вбудованому ранері: +Уся гігієна транскриптів централізована у вбудованому раннері: - Вибір політики: `src/agents/transcript-policy.ts` -- Застосування санітизації / виправлення: `sanitizeSessionHistory` у `src/agents/pi-embedded-runner/replay-history.ts` +- Застосування санітизації/відновлення: `sanitizeSessionHistory` у `src/agents/pi-embedded-runner/replay-history.ts` Політика використовує `provider`, `modelApi` і `modelId`, щоб визначити, що застосовувати. -Окремо від гігієни транскриптів, файли сесій виправляються (за потреби) перед завантаженням: +Окремо від гігієни транскриптів, файли сесій відновлюються (за потреби) до завантаження: - `repairSessionFileIfNeeded` у `src/agents/session-file-repair.ts` -- Викликається з `run/attempt.ts` і `compact.ts` (вбудований ранер) +- Викликається з `run/attempt.ts` і `compact.ts` (вбудований раннер) --- ## Глобальне правило: санітизація зображень -Корисне навантаження зображень завжди санітизується, щоб запобігти відхиленню на боці постачальника через -обмеження розміру (зменшення масштабу / повторне стиснення надто великих base64-зображень). +Корисне навантаження зображень завжди санітизується, щоб запобігти відхиленню з боку провайдера через +обмеження розміру (зменшення масштабу/повторне стиснення надто великих base64-зображень). -Це також допомагає контролювати тиск на токени, спричинений зображеннями, для моделей із підтримкою зору. -Менші максимальні розміри зазвичай зменшують використання токенів; більші розміри зберігають деталі. +Це також допомагає контролювати тиск на токени, спричинений зображеннями, для моделей із підтримкою бачення. +Менші максимальні розміри зазвичай зменшують використання токенів; більші розміри зберігають деталізацію. Реалізація: - `sanitizeSessionMessagesImages` у `src/agents/pi-embedded-helpers/images.ts` - `sanitizeContentBlocksImages` у `src/agents/tool-images.ts` -- Максимальна сторона зображення налаштовується через `agents.defaults.imageMaxDimensionPx` (типово: `1200`). +- Максимальний бік зображення налаштовується через `agents.defaults.imageMaxDimensionPx` (типово: `1200`). --- ## Глобальне правило: некоректні виклики інструментів Блоки викликів інструментів асистента, у яких відсутні і `input`, і `arguments`, відкидаються -до побудови контексту моделі. Це запобігає відхиленням постачальника через частково +до побудови контексту моделі. Це запобігає відхиленням з боку провайдера через частково збережені виклики інструментів (наприклад, після помилки обмеження швидкості). Реалізація: @@ -99,69 +100,74 @@ TUI, REST або SSE-клієнти. --- -## Глобальне правило: походження міжсесійного вводу +## Глобальне правило: походження вводу між сесіями -Коли агент надсилає підказку в іншу сесію через `sessions_send` (зокрема -на кроках agent-to-agent reply / announce), OpenClaw зберігає створений користувацький хід із: +Коли агент надсилає промпт до іншої сесії через `sessions_send` (включно з +кроками відповіді/оголошення від агента до агента), OpenClaw зберігає створений користувацький хід із: - `message.provenance.kind = "inter_session"` Ці метадані записуються під час додавання до транскрипту і не змінюють роль -(`role: "user"` зберігається для сумісності з постачальником). Читачі транскриптів можуть використовувати -це, щоб не трактувати маршрутизовані внутрішні підказки як інструкції, створені кінцевим користувачем. +(`role: "user"` залишається для сумісності з провайдерами). Читачі транскрипту можуть використовувати +це, щоб не трактувати маршрутизовані внутрішні промпти як інструкції, створені кінцевим користувачем. -Під час перебудови контексту OpenClaw також додає на початок таких користувацьких ходів короткий -маркер `[Inter-session message]` у пам’яті, щоб модель могла відрізняти їх від +Під час перебудови контексту OpenClaw також додає на початку короткий маркер `[Inter-session message]` +до таких користувацьких ходів у пам’яті, щоб модель могла відрізняти їх від зовнішніх інструкцій кінцевого користувача. --- -## Матриця постачальників (поточна поведінка) +## Матриця провайдерів (поточна поведінка) **OpenAI / OpenAI Codex** - Лише санітизація зображень. -- Відкидаються осиротілі сигнатури міркування (окремі елементи міркування без наступного блоку вмісту) для транскриптів OpenAI Responses/Codex, а також відкидається придатне до відтворення міркування OpenAI після перемикання маршруту моделі. +- Відкидання осиротілих сигнатур міркувань (окремих елементів reasoning без наступного блока контенту) для транскриптів OpenAI Responses/Codex, а також відкидання відтворюваних міркувань OpenAI після перемикання маршруту моделі. - Без санітизації ідентифікаторів викликів інструментів. -- Виправлення парування результатів інструментів може переміщувати реальні відповідні виводи та синтезувати виводи `aborted` у стилі Codex для відсутніх викликів інструментів. +- Відновлення парування результатів інструментів може переміщувати реальні відповідні виводи та синтезувати виводи `aborted` у стилі Codex для відсутніх викликів інструментів. - Без валідації чи перевпорядкування ходів. -- Відсутні виводи інструментів сімейства OpenAI Responses синтезуються як `aborted`, щоб відповідати нормалізації відтворення Codex. +- Відсутні виводи інструментів сімейства OpenAI Responses синтезуються як `aborted`, щоб відповідати нормалізації повторного відтворення Codex. - Без видалення сигнатур думок. **Google (Generative AI / Gemini CLI / Antigravity)** -- Санітизація ідентифікаторів викликів інструментів: суворо буквено-цифрові. -- Виправлення парування результатів інструментів і синтетичні результати інструментів. +- Санітизація ідентифікаторів викликів інструментів: суворо алфавітно-цифрові. +- Відновлення парування результатів інструментів і синтетичні результати інструментів. - Валідація ходів (чергування ходів у стилі Gemini). -- Виправлення порядку ходів Google (додає на початок крихітний bootstrap-користувацький хід, якщо історія починається з асистента). -- Antigravity Claude: нормалізація сигнатур thinking; відкидання блоків thinking без сигнатури. +- Виправлення порядку ходів Google (додавання малого початкового ходу користувача, якщо історія починається з асистента). +- Antigravity Claude: нормалізація сигнатур мислення; відкидання блоків мислення без сигнатури. **Anthropic / Minimax (сумісні з Anthropic)** -- Виправлення парування результатів інструментів і синтетичні результати інструментів. +- Відновлення парування результатів інструментів і синтетичні результати інструментів. - Валідація ходів (об’єднання послідовних користувацьких ходів для дотримання суворого чергування). -- Старіші ходи асистента лише з thinking, які потрібно видалити, замінюються - непорожнім текстом omitted-reasoning, щоб адаптери постачальника не відкидали - хід під час відтворення. +- Блоки thinking з відсутніми, порожніми або пробільними сигнатурами повторного відтворення видаляються + перед перетворенням для провайдера. Якщо через це хід асистента стає порожнім, OpenClaw зберігає + форму ходу за допомогою непорожнього тексту пропущеного міркування. +- Старіші ходи асистента, що містять лише thinking і мають бути видалені, замінюються + непорожнім текстом пропущеного міркування, щоб адаптери провайдера не відкинули хід + під час повторного відтворення. **Amazon Bedrock (Converse API)** -- Порожні ходи помилок потоку асистента виправляються до непорожнього резервного текстового блоку - перед відтворенням. Bedrock Converse відхиляє повідомлення асистента з `content: []`, тому - збережені ходи асистента з `stopReason: "error"` і порожнім вмістом також - виправляються на диску перед завантаженням. -- Старіші ходи асистента лише з thinking, які потрібно видалити, замінюються - непорожнім текстом omitted-reasoning, щоб відтворення Converse зберігало сувору форму ходів. -- Відтворення фільтрує OpenClaw delivery-mirror і ходи асистента, ін’єктовані Gateway. +- Порожні ходи помилок потоку асистента відновлюються до непорожнього резервного текстового блока + перед повторним відтворенням. Bedrock Converse відхиляє повідомлення асистента з `content: []`, тому + збережені ходи асистента з `stopReason: "error"` і порожнім контентом також відновлюються на диску до завантаження. +- Блоки thinking Claude з відсутніми, порожніми або пробільними сигнатурами повторного відтворення + видаляються перед повторним відтворенням Converse. Якщо через це хід асистента стає порожнім, OpenClaw + зберігає форму ходу за допомогою непорожнього тексту пропущеного міркування. +- Старіші ходи асистента, що містять лише thinking і мають бути видалені, замінюються + непорожнім текстом пропущеного міркування, щоб повторне відтворення Converse зберігало сувору форму ходу. +- Повторне відтворення фільтрує дзеркальні ходи доставки OpenClaw та ходи асистента, вставлені Gateway. - Санітизація зображень застосовується через глобальне правило. -**Mistral (зокрема визначення за `model-id`)** +**Mistral (включно з виявленням за `model-id`)** -- Санітизація ідентифікаторів викликів інструментів: strict9 (буквено-цифрові, довжина 9). +- Санітизація ідентифікаторів викликів інструментів: strict9 (алфавітно-цифрові, довжина 9). **OpenRouter Gemini** -- Очищення сигнатур думок: видалення значень `thought_signature`, що не є base64 (base64 зберігаються). +- Очищення сигнатур думок: видалення значень `thought_signature`, які не є base64 (base64 зберігаються). **Усе інше** @@ -171,20 +177,20 @@ TUI, REST або SSE-клієнти. ## Історична поведінка (до 2026.1.22) -До випуску 2026.1.22 OpenClaw застосовував кілька шарів гігієни транскриптів: +До релізу 2026.1.22 OpenClaw застосовував кілька шарів гігієни транскриптів: -- **Розширення transcript-sanitize** запускалося під час кожної побудови контексту і могло: - - Виправляти парування використання інструментів / результатів. - - Санітизувати ідентифікатори викликів інструментів (зокрема в несуворому режимі, який зберігав `_` / `-`). -- Ранер також виконував санітизацію, специфічну для постачальника, що дублювало роботу. -- Додаткові мутації відбувалися поза політикою постачальника, зокрема: - - Видалення тегів `` із тексту асистента перед збереженням. +- Розширення **transcript-sanitize** виконувалося під час кожної побудови контексту і могло: + - Відновлювати парування використання/результатів інструментів. + - Санітизувати ідентифікатори викликів інструментів (включно з несуворим режимом, який зберігав `_`/`-`). +- Раннер також виконував специфічну для провайдера санітизацію, що дублювало роботу. +- Додаткові мутації відбувалися поза політикою провайдера, зокрема: + - Видалення тегів `` з тексту асистента перед збереженням. - Відкидання порожніх ходів помилок асистента. - - Обрізання вмісту асистента після викликів інструментів. + - Обрізання контенту асистента після викликів інструментів. -Ця складність спричиняла регресії між постачальниками (особливо для парування -`call_id|fc_id` в `openai-responses`). Очищення у 2026.1.22 прибрало розширення, централізувало -логіку в ранері та зробило OpenAI **без змін** за винятком санітизації зображень. +Ця складність спричиняла міжпровайдерні регресії (зокрема, для парування +`openai-responses` `call_id|fc_id`). Очищення 2026.1.22 прибрало розширення, централізувало +логіку в раннері й зробило OpenAI режимом **без змін** поза санітизацією зображень. ## Пов’язане