chore(i18n): refresh uk translations
This commit is contained in:
parent
4f741721db
commit
d912fe8bc0
@ -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": "<voice-id>", "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.<provider>.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.<provider>.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)
|
||||
|
||||
@ -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://<magicdns>` / `wss://<magicdns>`
|
||||
- Також підтримується: будь-який інший 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 <requestId>
|
||||
openclaw devices reject <requestId>
|
||||
```
|
||||
|
||||
Докладніше про прив’язку: [Прив’язка](/uk/channels/pairing).
|
||||
Докладніше про сполучення: [Сполучення](/uk/channels/pairing).
|
||||
|
||||
Необов’язково: якщо Android Node завжди підключається з жорстко контрольованої підмережі,
|
||||
ви можете явно ввімкнути автосхвалення першої прив’язки Node за явними CIDR або точними IP:
|
||||
ви можете явно ввімкнути авто-підтвердження першого сполучення Node для конкретних CIDR або точних IP:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -139,13 +138,11 @@ openclaw devices reject <requestId>
|
||||
}
|
||||
```
|
||||
|
||||
За замовчуванням це вимкнено. Це застосовується лише до нової прив’язки `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 <requestId>
|
||||
openclaw gateway call node.list --params "{}"
|
||||
```
|
||||
|
||||
### 6) Chat + історія
|
||||
### 6) Chat + history
|
||||
|
||||
Вкладка Chat в Android підтримує вибір сесії (типово `main`, а також інші наявні сесії):
|
||||
Вкладка Chat в Android підтримує вибір сеансу (типово `main`, а також інші наявні сеанси):
|
||||
|
||||
- Історія: `chat.history` (нормалізована для відображення; inline-теги директив
|
||||
прибираються з видимого тексту, XML payload викликів інструментів у звичайному тексті (включно з
|
||||
`<tool_call>...</tool_call>`, `<function_call>...</function_call>`,
|
||||
`<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` і
|
||||
обрізаними блоками викликів інструментів) та витоки ASCII/повноширинних токенів керування моделлю
|
||||
прибираються, чисті рядки асистента лише з тихими токенами, такі як точні `NO_REPLY` /
|
||||
`no_reply`, пропускаються, а надто великі рядки можуть бути замінені заповнювачами)
|
||||
- Історія: `chat.history` (нормалізовано для відображення; вбудовані теги директив видаляються з видимого тексту, XML-навантаження викликів інструментів у звичайному тексті (включно з `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>`, а також обрізаними блоками викликів інструментів) і витіклі 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 "<Android Node>" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18789/__openclaw__/canvas/"}'
|
||||
```
|
||||
|
||||
Tailnet (необов’язково): якщо обидва пристрої в Tailscale, використовуйте ім’я MagicDNS або IP tailnet замість `.local`, наприклад `http://<gateway-magicdns>:18789/__openclaw__/canvas/`.
|
||||
Tailnet (необов’язково): якщо обидва пристрої в Tailscale, використовуйте ім’я MagicDNS або tailnet IP замість `.local`, наприклад `http://<gateway-magicdns>:18789/__openclaw__/canvas/`.
|
||||
|
||||
Цей сервер ін’єктує клієнт live-reload у HTML і перезавантажує сторінку при зміні файлів.
|
||||
Хост A2UI розташовано за адресою `http://<gateway-host>:18789/__openclaw__/a2ui/`.
|
||||
Цей сервер вбудовує клієнт live-reload в HTML і перезавантажує сторінку при зміні файлів.
|
||||
Хост A2UI розташований за адресою `http://<gateway-host>: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 і пересилається як звичайне повідомлення чату.
|
||||
|
||||
<Note>
|
||||
Доступність App Actions залежить від пристрою, версії Google Play Services
|
||||
і від того, чи встановив користувач OpenClaw як app Assistant за замовчуванням.
|
||||
і від того, чи встановив користувач OpenClaw як типовий застосунок-помічник.
|
||||
</Note>
|
||||
|
||||
## Пересилання сповіщень
|
||||
|
||||
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 може пересилати сповіщення пристрою до
|
||||
```
|
||||
|
||||
<Note>
|
||||
Пересилання сповіщень потребує дозволу Android Notification Listener. App запитує його під час налаштування.
|
||||
Для пересилання сповіщень потрібен дозвіл Android Notification Listener. Під час налаштування застосунок запропонує надати його.
|
||||
</Note>
|
||||
|
||||
## Пов’язане
|
||||
|
||||
- [iOS app](/uk/platforms/ios)
|
||||
- [Nodes](/uk/nodes)
|
||||
- [Застосунок iOS](/uk/platforms/ios)
|
||||
- [Node](/uk/nodes)
|
||||
- [Усунення несправностей Android Node](/uk/nodes/troubleshooting)
|
||||
|
||||
@ -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** запускалося під час кожної побудови контексту і могло:
|
||||
- Виправляти парування використання інструментів / результатів.
|
||||
- Санітизувати ідентифікатори викликів інструментів (зокрема в несуворому режимі, який зберігав `_` / `-`).
|
||||
- Ранер також виконував санітизацію, специфічну для постачальника, що дублювало роботу.
|
||||
- Додаткові мутації відбувалися поза політикою постачальника, зокрема:
|
||||
- Видалення тегів `<final>` із тексту асистента перед збереженням.
|
||||
- Розширення **transcript-sanitize** виконувалося під час кожної побудови контексту і могло:
|
||||
- Відновлювати парування використання/результатів інструментів.
|
||||
- Санітизувати ідентифікатори викликів інструментів (включно з несуворим режимом, який зберігав `_`/`-`).
|
||||
- Раннер також виконував специфічну для провайдера санітизацію, що дублювало роботу.
|
||||
- Додаткові мутації відбувалися поза політикою провайдера, зокрема:
|
||||
- Видалення тегів `<final>` з тексту асистента перед збереженням.
|
||||
- Відкидання порожніх ходів помилок асистента.
|
||||
- Обрізання вмісту асистента після викликів інструментів.
|
||||
- Обрізання контенту асистента після викликів інструментів.
|
||||
|
||||
Ця складність спричиняла регресії між постачальниками (особливо для парування
|
||||
`call_id|fc_id` в `openai-responses`). Очищення у 2026.1.22 прибрало розширення, централізувало
|
||||
логіку в ранері та зробило OpenAI **без змін** за винятком санітизації зображень.
|
||||
Ця складність спричиняла міжпровайдерні регресії (зокрема, для парування
|
||||
`openai-responses` `call_id|fc_id`). Очищення 2026.1.22 прибрало розширення, централізувало
|
||||
логіку в раннері й зробило OpenAI режимом **без змін** поза санітизацією зображень.
|
||||
|
||||
## Пов’язане
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user