chore(i18n): refresh uk translations
This commit is contained in:
parent
6950244fae
commit
1608734fda
File diff suppressed because it is too large
Load Diff
@ -1,28 +1,28 @@
|
||||
---
|
||||
read_when:
|
||||
- Ви хочете використовувати вбудований harness app-server Codex
|
||||
- Ви хочете використовувати комплектований harness app-server Codex
|
||||
- Вам потрібні приклади конфігурації harness Codex
|
||||
- Ви хочете вимкнути резервний перехід на Pi для розгортань лише з Codex
|
||||
summary: Запускайте вбудовані ходи агента OpenClaw через вбудований harness app-server Codex
|
||||
- Ви хочете, щоб розгортання лише з Codex завершувалися помилкою замість переходу до Pi
|
||||
summary: Запустіть вбудовані ходи агента OpenClaw через комплектований harness app-server Codex
|
||||
title: harness Codex
|
||||
x-i18n:
|
||||
generated_at: "2026-04-24T19:52:02Z"
|
||||
generated_at: "2026-04-24T21:43:41Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 1bd8f23e8c807d0c97c99ca9c8a41e39f42a35a0bfed5c7f53793a15b6d24e18
|
||||
source_hash: 674bc34552401d1a492b348ceb86fd513a894760987a0c6fef6e79fdb0b3ebfb
|
||||
source_path: plugins/codex-harness.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
Вбудований Plugin `codex` дозволяє OpenClaw запускати вбудовані ходи агента через
|
||||
app-server Codex замість вбудованого harness Pi.
|
||||
Комплектований Plugin `codex` дає OpenClaw змогу запускати вбудовані ходи агента через
|
||||
app-server Codex замість вбудованого harness PI.
|
||||
|
||||
Використовуйте це, коли хочете, щоб Codex керував низькорівневим сеансом агента: виявленням
|
||||
моделей, нативним відновленням thread, нативним Compaction і виконанням через app-server.
|
||||
OpenClaw, як і раніше, керує чат-каналами, файлами сеансів, вибором моделей, інструментами,
|
||||
Використовуйте це, коли хочете, щоб Codex керував низькорівневою сесією агента: виявленням
|
||||
моделей, нативним відновленням потоку, нативною Compaction та виконанням app-server.
|
||||
OpenClaw і далі керує каналами чату, файлами сесії, вибором моделі, інструментами,
|
||||
погодженнями, доставкою медіа та видимим дзеркалом транскрипту.
|
||||
|
||||
Нативні ходи Codex зберігають хуки Plugin OpenClaw як публічний шар сумісності.
|
||||
Нативні ходи Codex зберігають хука Plugin OpenClaw як публічний шар сумісності.
|
||||
Це внутрішньопроцесні хуки OpenClaw, а не командні хуки Codex `hooks.json`:
|
||||
|
||||
- `before_prompt_build`
|
||||
@ -32,86 +32,87 @@ OpenClaw, як і раніше, керує чат-каналами, файлам
|
||||
- `before_message_write` для дзеркальних записів транскрипту
|
||||
- `agent_end`
|
||||
|
||||
Plugins також можуть реєструвати нейтральне до harness middleware для результатів інструментів, щоб переписувати
|
||||
Plugins також можуть реєструвати нейтральне до harness middleware результатів інструментів, щоб переписувати
|
||||
динамічні результати інструментів OpenClaw після того, як OpenClaw виконає інструмент, і до того,
|
||||
як результат буде повернуто в Codex. Це окремо від публічного
|
||||
хука Plugin `tool_result_persist`, який перетворює записи результатів інструментів у транскрипті,
|
||||
якими володіє OpenClaw.
|
||||
як результат буде повернено до Codex. Це окремо від публічного
|
||||
хука Plugin `tool_result_persist`, який трансформує записи результатів
|
||||
інструментів у транскрипті, що належать OpenClaw.
|
||||
|
||||
harness вимкнений за замовчуванням. У нових конфігураціях слід зберігати посилання на моделі OpenAI
|
||||
у канонічному вигляді `openai/gpt-*` і явно примусово вказувати
|
||||
`embeddedHarness.runtime: "codex"` або `OPENCLAW_AGENT_RUNTIME=codex`, якщо вони
|
||||
хочуть нативне виконання через app-server. Застарілі посилання на моделі `codex/*` і далі автоматично вибирають
|
||||
harness для сумісності, але вони не показуються як звичайні варіанти моделі/провайдера.
|
||||
За замовчуванням harness вимкнено. У нових конфігураціях слід зберігати посилання на моделі OpenAI
|
||||
канонічними як `openai/gpt-*` і явно примусово вказувати
|
||||
`embeddedHarness.runtime: "codex"` або `OPENCLAW_AGENT_RUNTIME=codex`, коли
|
||||
потрібне нативне виконання app-server. Застарілі посилання на моделі `codex/*` і далі автоматично вибирають
|
||||
harness для сумісності, але не показуються як звичайні варіанти моделі/провайдера.
|
||||
|
||||
## Виберіть правильний префікс моделі
|
||||
|
||||
Маршрути сімейства OpenAI залежать від префікса. Використовуйте `openai-codex/*`, якщо вам потрібен
|
||||
OAuth Codex через Pi; використовуйте `openai/*`, якщо вам потрібен прямий доступ до OpenAI API або
|
||||
якщо ви примусово використовуєте нативний harness app-server Codex:
|
||||
Маршрути сімейства OpenAI залежать від префікса. Використовуйте `openai-codex/*`, коли хочете
|
||||
Codex OAuth через PI; використовуйте `openai/*`, коли хочете прямий доступ до OpenAI API або
|
||||
коли примусово використовуєте нативний harness app-server Codex:
|
||||
|
||||
| Посилання на модель | Шлях runtime | Використовуйте, коли |
|
||||
| --------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------------------------- |
|
||||
| `openai/gpt-5.4` | Провайдер OpenAI через OpenClaw/Pi plumbing | Вам потрібен поточний прямий доступ до OpenAI Platform API з `OPENAI_API_KEY`. |
|
||||
| `openai-codex/gpt-5.5` | OAuth OpenAI Codex через OpenClaw/Pi | Вам потрібна автентифікація підписки ChatGPT/Codex із типовим runner Pi. |
|
||||
| `openai/gpt-5.5` + `embeddedHarness.runtime: "codex"` | harness app-server Codex | Вам потрібне нативне виконання через app-server Codex для вбудованого ходу агента. |
|
||||
| Посилання на модель | Шлях runtime | Використовуйте, коли |
|
||||
| ---------------------------------------------------- | -------------------------------------------- | --------------------------------------------------------------------------- |
|
||||
| `openai/gpt-5.4` | Провайдер OpenAI через обв’язку OpenClaw/PI | Вам потрібен поточний прямий доступ до API платформи OpenAI з `OPENAI_API_KEY`. |
|
||||
| `openai-codex/gpt-5.5` | OpenAI Codex OAuth через OpenClaw/PI | Вам потрібна автентифікація передплати ChatGPT/Codex із runner PI за замовчуванням. |
|
||||
| `openai/gpt-5.5` + `embeddedHarness.runtime: "codex"` | harness app-server Codex | Вам потрібне нативне виконання app-server Codex для вбудованого ходу агента. |
|
||||
|
||||
GPT-5.5 наразі в OpenClaw доступна лише через підписку/OAuth. Використовуйте
|
||||
`openai-codex/gpt-5.5` для OAuth через Pi або `openai/gpt-5.5` з harness app-server
|
||||
Codex. Прямий доступ за API-ключем для `openai/gpt-5.5` буде підтримуватися,
|
||||
GPT-5.5 у OpenClaw наразі доступна лише через передплату/OAuth. Використовуйте
|
||||
`openai-codex/gpt-5.5` для PI OAuth або `openai/gpt-5.5` з harness
|
||||
app-server Codex. Прямий доступ через API key для `openai/gpt-5.5` підтримуватиметься,
|
||||
щойно OpenAI увімкне GPT-5.5 у публічному API.
|
||||
|
||||
Застарілі посилання `codex/gpt-*` і далі приймаються як псевдоніми для сумісності. Doctor
|
||||
міграції сумісності переписує застарілі основні посилання `codex/*` на `openai/*`
|
||||
і окремо записує політику harness Codex. У нових конфігураціях PI OAuth Codex
|
||||
слід використовувати `openai-codex/gpt-*`; у нових конфігураціях нативного harness app-server слід
|
||||
використовувати `openai/gpt-*` разом із `embeddedHarness.runtime: "codex"`.
|
||||
Застарілі посилання `codex/gpt-*` і далі приймаються як псевдоніми сумісності. Doctor
|
||||
міграція сумісності переписує застарілі основні посилання `codex/*` на `openai/*`
|
||||
і окремо записує політику harness Codex. Нові конфігурації PI Codex OAuth
|
||||
мають використовувати `openai-codex/gpt-*`; нові конфігурації нативного harness app-server
|
||||
мають використовувати `openai/gpt-*` плюс `embeddedHarness.runtime: "codex"`.
|
||||
|
||||
`agents.defaults.imageModel` використовує той самий поділ за префіксами. Використовуйте
|
||||
`openai-codex/gpt-*`, якщо розуміння зображень має виконуватися через шлях провайдера OAuth OpenAI
|
||||
Codex. Використовуйте `codex/gpt-*`, якщо розуміння зображень має виконуватися
|
||||
через обмежений хід app-server Codex. Модель app-server Codex повинна
|
||||
підтримувати введення зображень; текстові моделі Codex завершуються з помилкою ще до початку
|
||||
`agents.defaults.imageModel` дотримується такого самого поділу префіксів. Використовуйте
|
||||
`openai-codex/gpt-*`, коли розуміння зображень має виконуватися через шлях провайдера OpenAI
|
||||
Codex OAuth. Використовуйте `codex/gpt-*`, коли розуміння зображень має виконуватися
|
||||
через обмежений хід app-server Codex. Модель app-server Codex має
|
||||
оголошувати підтримку вхідних зображень; текстові моделі Codex завершуються з помилкою до початку
|
||||
медіа-ходу.
|
||||
|
||||
Використовуйте `/status`, щоб підтвердити фактичний harness для поточного сеансу. Якщо
|
||||
вибір виглядає неочікуваним, увімкніть журналювання налагодження для підсистеми `agents/harness`
|
||||
і перегляньте структурований запис Gateway `agent harness selected`. Він
|
||||
містить ідентифікатор вибраного harness, причину вибору, політику runtime/fallback і,
|
||||
Використовуйте `/status`, щоб підтвердити ефективний harness для поточної сесії. Якщо
|
||||
вибір виглядає несподіваним, увімкніть журналювання налагодження для підсистеми `agents/harness`
|
||||
і перегляньте структурований запис шлюзу `agent harness selected`. Він
|
||||
містить ідентифікатор вибраного harness, причину вибору, політику runtime/fallback, а також,
|
||||
у режимі `auto`, результат підтримки для кожного кандидата Plugin.
|
||||
|
||||
Вибір harness не є засобом керування активним сеансом. Коли вбудований хід виконується,
|
||||
OpenClaw записує ідентифікатор вибраного harness у цей сеанс і продовжує використовувати його для
|
||||
наступних ходів у тому самому ідентифікаторі сеансу. Змінюйте конфігурацію `embeddedHarness` або
|
||||
`OPENCLAW_AGENT_RUNTIME`, якщо хочете, щоб майбутні сеанси використовували інший harness;
|
||||
використовуйте `/new` або `/reset`, щоб почати новий сеанс перед перемиканням наявної
|
||||
розмови між Pi і Codex. Це дозволяє уникнути відтворення одного транскрипту через
|
||||
дві несумісні нативні системи сеансів.
|
||||
Вибір harness не є елементом керування живою сесією. Коли вбудований хід виконується,
|
||||
OpenClaw записує ідентифікатор вибраного harness у цій сесії та продовжує використовувати його для
|
||||
наступних ходів у межах того самого ідентифікатора сесії. Змінюйте конфігурацію `embeddedHarness` або
|
||||
`OPENCLAW_AGENT_RUNTIME`, коли хочете, щоб майбутні сесії використовували інший harness;
|
||||
використовуйте `/new` або `/reset`, щоб почати нову сесію перед перемиканням наявної
|
||||
розмови між PI та Codex. Це запобігає повторному відтворенню одного транскрипту через
|
||||
дві несумісні нативні системи сесій.
|
||||
|
||||
Застарілі сеанси, створені до закріплення harness, вважаються закріпленими за Pi, щойно вони
|
||||
мають історію транскрипту. Використовуйте `/new` або `/reset`, щоб перевести таку розмову на
|
||||
Застарілі сесії, створені до закріплення harness, вважаються закріпленими за PI, щойно в них
|
||||
з’являється історія транскрипту. Використовуйте `/new` або `/reset`, щоб перевести таку розмову на
|
||||
Codex після зміни конфігурації.
|
||||
|
||||
`/status` показує фактичний не-Pi harness поруч із `Fast`, наприклад
|
||||
`Fast · codex`. Типовий harness Pi і далі відображається як `Runner: pi (embedded)` і
|
||||
не додає окремого бейджа harness.
|
||||
`/status` показує ефективний не-PI harness поруч із `Fast`, наприклад
|
||||
`Fast · codex`. Типовий harness PI і далі відображається як `Runner: pi (embedded)` і
|
||||
не додає окремий бейдж harness.
|
||||
|
||||
## Вимоги
|
||||
|
||||
- OpenClaw із доступним вбудованим Plugin `codex`.
|
||||
- app-server Codex версії `0.118.0` або новішої.
|
||||
- Автентифікація Codex, доступна процесу app-server.
|
||||
- OpenClaw із доступним комплектованим Plugin `codex`.
|
||||
- Codex app-server `0.118.0` або новіший.
|
||||
- Автентифікація Codex, доступна для процесу app-server.
|
||||
|
||||
Plugin блокує старіші або неверсіоновані handshake app-server. Це дозволяє
|
||||
OpenClaw залишатися на поверхні протоколу, з якою його було протестовано.
|
||||
Plugin блокує старіші або неверсіоновані handshake app-server. Це залишає
|
||||
OpenClaw на поверхні протоколу, з якою його було протестовано.
|
||||
|
||||
Для live- і Docker smoke-тестів автентифікація зазвичай надходить з `OPENAI_API_KEY`, а також
|
||||
Для live- і Docker smoke-тестів автентифікація зазвичай надходить із `OPENAI_API_KEY`, а також з
|
||||
необов’язкових файлів Codex CLI, таких як `~/.codex/auth.json` і
|
||||
`~/.codex/config.toml`. Використовуйте ті самі матеріали автентифікації, що й ваш локальний app-server Codex.
|
||||
`~/.codex/config.toml`. Використовуйте той самий матеріал автентифікації, що й ваш локальний
|
||||
app-server Codex.
|
||||
|
||||
## Мінімальна конфігурація
|
||||
|
||||
Використовуйте `openai/gpt-5.5`, увімкніть вбудований Plugin і примусово використайте harness `codex`:
|
||||
Використовуйте `openai/gpt-5.5`, увімкніть комплектований Plugin і примусово вкажіть harness `codex`:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -134,7 +135,7 @@ OpenClaw залишатися на поверхні протоколу, з як
|
||||
}
|
||||
```
|
||||
|
||||
Якщо у вашій конфігурації використовується `plugins.allow`, додайте туди також `codex`:
|
||||
Якщо ваша конфігурація використовує `plugins.allow`, включіть туди також `codex`:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -149,15 +150,15 @@ OpenClaw залишатися на поверхні протоколу, з як
|
||||
}
|
||||
```
|
||||
|
||||
Застарілі конфігурації, які встановлюють `agents.defaults.model` або модель агента в
|
||||
`codex/<model>`, і далі автоматично вмикають вбудований Plugin `codex`. У нових конфігураціях
|
||||
слід віддавати перевагу `openai/<model>` разом із явним записом `embeddedHarness`, наведеним вище.
|
||||
Застарілі конфігурації, які встановлюють `agents.defaults.model` або модель агента на
|
||||
`codex/<model>`, усе ще автоматично вмикають комплектований Plugin `codex`. У нових конфігураціях слід
|
||||
надавати перевагу `openai/<model>` плюс явному запису `embeddedHarness`, наведеному вище.
|
||||
|
||||
## Додайте Codex, не замінюючи інші моделі
|
||||
## Додайте Codex без заміни інших моделей
|
||||
|
||||
Зберігайте `runtime: "auto"`, якщо хочете, щоб застарілі посилання `codex/*` вибирали Codex, а
|
||||
Pi використовувався для всього іншого. Для нових конфігурацій краще явно вказувати `runtime: "codex"`
|
||||
для агентів, які мають використовувати цей harness.
|
||||
Залишайте `runtime: "auto"`, якщо хочете, щоб застарілі посилання `codex/*` вибирали Codex, а
|
||||
PI — для всього іншого. Для нових конфігурацій надавайте перевагу явному `runtime: "codex"` для
|
||||
агентів, які мають використовувати harness.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -187,16 +188,17 @@ Pi використовувався для всього іншого. Для н
|
||||
}
|
||||
```
|
||||
|
||||
За такої структури:
|
||||
За такої форми:
|
||||
|
||||
- `/model gpt` або `/model openai/gpt-5.5` використовує harness app-server Codex для цієї конфігурації.
|
||||
- `/model opus` використовує шлях провайдера Anthropic.
|
||||
- Якщо вибрано не-Codex модель, Pi залишається harness сумісності.
|
||||
- Якщо вибрано не-Codex модель, PI залишається harness сумісності.
|
||||
|
||||
## Розгортання лише з Codex
|
||||
|
||||
Вимкніть fallback на Pi, якщо вам потрібно довести, що кожен вбудований хід агента використовує
|
||||
harness Codex:
|
||||
Примусово використовуйте harness Codex, коли потрібно довести, що кожен вбудований хід агента
|
||||
використовує Codex. Явні runtime Plugin за замовчуванням не мають fallback до PI, тому
|
||||
`fallback: "none"` необов’язковий, але часто корисний як документація:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -215,13 +217,13 @@ harness Codex:
|
||||
Перевизначення через середовище:
|
||||
|
||||
```bash
|
||||
OPENCLAW_AGENT_RUNTIME=codex \
|
||||
OPENCLAW_AGENT_HARNESS_FALLBACK=none \
|
||||
openclaw gateway run
|
||||
OPENCLAW_AGENT_RUNTIME=codex openclaw gateway run
|
||||
```
|
||||
|
||||
Коли fallback вимкнено, OpenClaw завершується з помилкою на ранньому етапі, якщо Plugin Codex вимкнено,
|
||||
app-server надто старий або app-server не може запуститися.
|
||||
Коли Codex примусово увімкнено, OpenClaw завершується з помилкою на ранньому етапі, якщо Plugin Codex вимкнено,
|
||||
app-server застарий або app-server не може запуститися. Встановлюйте
|
||||
`OPENCLAW_AGENT_HARNESS_FALLBACK=pi` лише якщо ви навмисно хочете, щоб PI обробляв
|
||||
відсутній вибір harness.
|
||||
|
||||
## Codex для окремого агента
|
||||
|
||||
@ -257,15 +259,15 @@ app-server надто старий або app-server не може запуст
|
||||
}
|
||||
```
|
||||
|
||||
Використовуйте звичайні команди сеансу, щоб перемикати агентів і моделі. `/new` створює новий
|
||||
сеанс OpenClaw, а harness Codex створює або відновлює свій sidecar thread app-server
|
||||
за потреби. `/reset` очищає прив’язку сеансу OpenClaw для цього thread
|
||||
і дозволяє наступному ходу знову визначити harness із поточної конфігурації.
|
||||
Використовуйте звичайні команди сесії для перемикання агентів і моделей. `/new` створює нову
|
||||
сесію OpenClaw, а harness Codex створює або відновлює свій sidecar-потік app-server
|
||||
за потреби. `/reset` очищає прив’язку сесії OpenClaw для цього потоку
|
||||
і дозволяє наступному ходу знову визначити harness з поточної конфігурації.
|
||||
|
||||
## Виявлення моделей
|
||||
|
||||
За замовчуванням Plugin Codex запитує в app-server доступні моделі. Якщо
|
||||
виявлення не вдається або завершується за timeout, він використовує вбудований резервний каталог для:
|
||||
За замовчуванням Plugin Codex запитує app-server про доступні моделі. Якщо
|
||||
виявлення не вдається або завершується за тайм-аутом, використовується комплектований резервний каталог для:
|
||||
|
||||
- GPT-5.5
|
||||
- GPT-5.4 mini
|
||||
@ -291,7 +293,7 @@ app-server надто старий або app-server не може запуст
|
||||
}
|
||||
```
|
||||
|
||||
Вимкніть виявлення, якщо хочете, щоб під час запуску не виконувалося зондування Codex і використовувався
|
||||
Вимкніть виявлення, якщо хочете, щоб під час запуску не відбувалося зондування Codex і використовувався
|
||||
резервний каталог:
|
||||
|
||||
```json5
|
||||
@ -311,21 +313,21 @@ app-server надто старий або app-server не може запуст
|
||||
}
|
||||
```
|
||||
|
||||
## Підключення app-server і політика
|
||||
## Підключення до app-server і політика
|
||||
|
||||
За замовчуванням Plugin запускає Codex локально за допомогою:
|
||||
За замовчуванням Plugin запускає Codex локально так:
|
||||
|
||||
```bash
|
||||
codex app-server --listen stdio://
|
||||
```
|
||||
|
||||
За замовчуванням OpenClaw запускає локальні сеанси harness Codex у режимі YOLO:
|
||||
За замовчуванням OpenClaw запускає локальні сесії harness Codex у режимі YOLO:
|
||||
`approvalPolicy: "never"`, `approvalsReviewer: "user"` і
|
||||
`sandbox: "danger-full-access"`. Це позиція довіреного локального оператора, яка використовується
|
||||
для автономних Heartbeat: Codex може використовувати shell і мережеві інструменти без
|
||||
зупинки на нативних запитах погодження, на які нікому відповісти.
|
||||
для автономних Heartbeat: Codex може використовувати shell- і мережеві інструменти, не
|
||||
зупиняючись на нативних запитах погодження, коли нікому відповісти.
|
||||
|
||||
Щоб увімкнути перегляд погоджень через guardian Codex, установіть `appServer.mode:
|
||||
Щоб увімкнути погодження Codex, перевірені guardian, установіть `appServer.mode:
|
||||
"guardian"`:
|
||||
|
||||
```json5
|
||||
@ -346,9 +348,9 @@ codex app-server --listen stdio://
|
||||
}
|
||||
```
|
||||
|
||||
Guardian — це нативний рецензент погоджень Codex. Коли Codex просить вийти з пісочниці, записати за межі робочого простору або додати дозволи, наприклад доступ до мережі, Codex спрямовує цей запит на погодження до субагента-рецензента, а не до людини через підказку. Рецензент застосовує модель ризиків Codex і схвалює або відхиляє конкретний запит. Використовуйте Guardian, якщо вам потрібно більше запобіжників, ніж у режимі YOLO, але водночас необхідно, щоб агенти без нагляду могли просуватися далі.
|
||||
Guardian — це нативний рецензент погоджень Codex. Коли Codex просить вийти за межі sandbox, записати поза межами workspace або додати дозволи, як-от мережевий доступ, Codex надсилає цей запит на погодження рецензенту-субагенту, а не людині через prompt. Рецензент застосовує модель ризиків Codex і погоджує або відхиляє конкретний запит. Використовуйте Guardian, коли вам потрібно більше запобіжників, ніж у режимі YOLO, але при цьому потрібно, щоб агенти без нагляду продовжували роботу.
|
||||
|
||||
Пресет `guardian` розгортається в `approvalPolicy: "on-request"`, `approvalsReviewer: "guardian_subagent"` і `sandbox: "workspace-write"`. Окремі поля політики все одно мають пріоритет над `mode`, тож у складніших розгортаннях можна поєднувати пресет із явними виборами.
|
||||
Пресет `guardian` розгортається в `approvalPolicy: "on-request"`, `approvalsReviewer: "guardian_subagent"` і `sandbox: "workspace-write"`. Окремі поля політики й далі мають пріоритет над `mode`, тому розширені розгортання можуть поєднувати пресет із явними налаштуваннями.
|
||||
|
||||
Для вже запущеного app-server використовуйте транспорт WebSocket:
|
||||
|
||||
@ -374,22 +376,22 @@ Guardian — це нативний рецензент погоджень Codex.
|
||||
|
||||
Підтримувані поля `appServer`:
|
||||
|
||||
| Поле | Значення за замовчуванням | Значення |
|
||||
| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------- |
|
||||
| `transport` | `"stdio"` | `"stdio"` запускає Codex; `"websocket"` підключається до `url`. |
|
||||
| `command` | `"codex"` | Виконуваний файл для транспорту stdio. |
|
||||
| `args` | `["app-server", "--listen", "stdio://"]` | Аргументи для транспорту stdio. |
|
||||
| `url` | не встановлено | URL WebSocket app-server. |
|
||||
| `authToken` | не встановлено | Bearer-токен для транспорту WebSocket. |
|
||||
| `headers` | `{}` | Додаткові заголовки WebSocket. |
|
||||
| `requestTimeoutMs` | `60000` | Timeout для викликів control-plane app-server. |
|
||||
| `mode` | `"yolo"` | Пресет для виконання в режимі YOLO або з перевіркою guardian. |
|
||||
| `approvalPolicy` | `"never"` | Нативна політика погоджень Codex, що надсилається під час запуску/відновлення thread і під час ходу. |
|
||||
| `sandbox` | `"danger-full-access"` | Нативний режим пісочниці Codex, що надсилається під час запуску/відновлення thread. |
|
||||
| `approvalsReviewer` | `"user"` | Використовуйте `"guardian_subagent"`, щоб дозволити Codex Guardian перевіряти запити. |
|
||||
| `serviceTier` | не встановлено | Необов’язковий рівень сервісу app-server Codex: `"fast"`, `"flex"` або `null`. Некоректні застарілі значення ігноруються. |
|
||||
| Поле | Типове значення | Значення |
|
||||
| ------------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
||||
| `transport` | `"stdio"` | `"stdio"` запускає Codex; `"websocket"` підключається до `url`. |
|
||||
| `command` | `"codex"` | Виконуваний файл для транспорту stdio. |
|
||||
| `args` | `["app-server", "--listen", "stdio://"]` | Аргументи для транспорту stdio. |
|
||||
| `url` | не встановлено | URL WebSocket app-server. |
|
||||
| `authToken` | не встановлено | Bearer token для транспорту WebSocket. |
|
||||
| `headers` | `{}` | Додаткові заголовки WebSocket. |
|
||||
| `requestTimeoutMs` | `60000` | Тайм-аут для викликів control plane app-server. |
|
||||
| `mode` | `"yolo"` | Пресет для виконання в режимі YOLO або з перевіркою guardian. |
|
||||
| `approvalPolicy` | `"never"` | Нативна політика погодження Codex, що надсилається під час запуску/відновлення потоку/ходу. |
|
||||
| `sandbox` | `"danger-full-access"` | Нативний режим sandbox Codex, що надсилається під час запуску/відновлення потоку. |
|
||||
| `approvalsReviewer` | `"user"` | Використовуйте `"guardian_subagent"`, щоб дозволити Codex Guardian перевіряти prompt. |
|
||||
| `serviceTier` | не встановлено | Необов’язковий service tier app-server Codex: `"fast"`, `"flex"` або `null`. Неприпустимі застарілі значення ігноруються. |
|
||||
|
||||
Старіші змінні середовища все ще працюють як fallback для локального тестування, коли
|
||||
Старіші змінні середовища й далі працюють як fallback для локального тестування, коли
|
||||
відповідне поле конфігурації не встановлено:
|
||||
|
||||
- `OPENCLAW_CODEX_APP_SERVER_BIN`
|
||||
@ -398,11 +400,11 @@ Guardian — це нативний рецензент погоджень Codex.
|
||||
- `OPENCLAW_CODEX_APP_SERVER_APPROVAL_POLICY`
|
||||
- `OPENCLAW_CODEX_APP_SERVER_SANDBOX`
|
||||
|
||||
`OPENCLAW_CODEX_APP_SERVER_GUARDIAN=1` було вилучено. Натомість використовуйте
|
||||
`plugins.entries.codex.config.appServer.mode: "guardian"` або
|
||||
`OPENCLAW_CODEX_APP_SERVER_MODE=guardian` для разового локального тестування. Конфігурація
|
||||
є кращою для відтворюваних розгортань, оскільки зберігає поведінку Plugin в тому самому
|
||||
перевіреному файлі, що й решта налаштувань harness Codex.
|
||||
`OPENCLAW_CODEX_APP_SERVER_GUARDIAN=1` було вилучено. Використовуйте
|
||||
`plugins.entries.codex.config.appServer.mode: "guardian"` натомість або
|
||||
`OPENCLAW_CODEX_APP_SERVER_MODE=guardian` для одноразового локального тестування. Конфігурації
|
||||
надається перевага для відтворюваних розгортань, оскільки вона зберігає поведінку Plugin в тому
|
||||
самому перевіреному файлі, що й решта налаштувань harness Codex.
|
||||
|
||||
## Поширені рецепти
|
||||
|
||||
@ -420,7 +422,7 @@ Guardian — це нативний рецензент погоджень Codex.
|
||||
}
|
||||
```
|
||||
|
||||
Перевірка harness лише-Codex із вимкненим fallback на Pi:
|
||||
Перевірка harness лише-Codex із вимкненим fallback до PI:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -437,7 +439,7 @@ Guardian — це нативний рецензент погоджень Codex.
|
||||
}
|
||||
```
|
||||
|
||||
Погодження Codex із перевіркою Guardian:
|
||||
Погодження Codex із перевіркою guardian:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -482,115 +484,115 @@ Guardian — це нативний рецензент погоджень Codex.
|
||||
}
|
||||
```
|
||||
|
||||
Перемикання моделей і далі контролюється OpenClaw. Коли сеанс OpenClaw приєднано
|
||||
до наявного thread Codex, наступний хід знову надсилає до
|
||||
app-server поточну вибрану модель OpenAI, провайдера, політику погоджень, пісочницю та рівень сервісу.
|
||||
Перемикання з `openai/gpt-5.5` на `openai/gpt-5.2` зберігає прив’язку до
|
||||
thread, але просить Codex продовжити роботу з новою вибраною моделлю.
|
||||
Перемикання моделей залишається під керуванням OpenClaw. Коли сесію OpenClaw прив’язано
|
||||
до наявного потоку Codex, наступний хід знову надсилає до
|
||||
app-server поточну вибрану модель OpenAI, провайдера, політику погодження, sandbox і
|
||||
service tier. Перемикання з `openai/gpt-5.5` на `openai/gpt-5.2` зберігає
|
||||
прив’язку до потоку, але просить Codex продовжити з новою вибраною моделлю.
|
||||
|
||||
## Команда Codex
|
||||
|
||||
Вбудований Plugin реєструє `/codex` як авторизовану slash-команду. Вона
|
||||
загальна й працює в будь-якому каналі, що підтримує текстові команди OpenClaw.
|
||||
Комплектований Plugin реєструє `/codex` як авторизовану slash-команду. Вона є
|
||||
загальною та працює в будь-якому каналі, який підтримує текстові команди OpenClaw.
|
||||
|
||||
Поширені форми:
|
||||
|
||||
- `/codex status` показує поточне підключення до app-server, моделі, обліковий запис, ліміти швидкості, сервери MCP і Skills.
|
||||
- `/codex models` показує поточні моделі app-server Codex.
|
||||
- `/codex threads [filter]` показує нещодавні threads Codex.
|
||||
- `/codex resume <thread-id>` приєднує поточний сеанс OpenClaw до наявного thread Codex.
|
||||
- `/codex compact` просить app-server Codex виконати Compaction для приєднаного thread.
|
||||
- `/codex review` запускає нативну перевірку Codex для приєднаного thread.
|
||||
- `/codex status` показує живе підключення до app-server, моделі, обліковий запис, ліміти швидкості, MCP-сервери та skills.
|
||||
- `/codex models` показує список живих моделей app-server Codex.
|
||||
- `/codex threads [filter]` показує список нещодавніх потоків Codex.
|
||||
- `/codex resume <thread-id>` прив’язує поточну сесію OpenClaw до наявного потоку Codex.
|
||||
- `/codex compact` просить app-server Codex виконати compaction для прив’язаного потоку.
|
||||
- `/codex review` запускає нативну перевірку Codex для прив’язаного потоку.
|
||||
- `/codex account` показує стан облікового запису та лімітів швидкості.
|
||||
- `/codex mcp` показує стан серверів MCP app-server Codex.
|
||||
- `/codex skills` показує Skills app-server Codex.
|
||||
- `/codex mcp` показує список станів MCP-серверів app-server Codex.
|
||||
- `/codex skills` показує список Skills app-server Codex.
|
||||
|
||||
`/codex resume` записує той самий sidecar-файл прив’язки, який harness використовує для
|
||||
звичайних ходів. У наступному повідомленні OpenClaw відновлює цей thread Codex, передає
|
||||
поточну вибрану модель OpenClaw до app-server і зберігає увімкненою
|
||||
розширену історію.
|
||||
звичайних ходів. У наступному повідомленні OpenClaw відновлює цей потік Codex, передає
|
||||
поточну вибрану модель OpenClaw до app-server і зберігає розширену історію
|
||||
увімкненою.
|
||||
|
||||
Поверхня команд вимагає app-server Codex версії `0.118.0` або новішої. Окремі
|
||||
Поверхня команд вимагає Codex app-server `0.118.0` або новішої версії. Окремі
|
||||
методи керування позначаються як `unsupported by this Codex app-server`, якщо
|
||||
майбутній або кастомний app-server не надає цей метод JSON-RPC.
|
||||
майбутній або кастомний app-server не надає цей JSON-RPC метод.
|
||||
|
||||
## Межі хуків
|
||||
|
||||
harness Codex має три шари хуків:
|
||||
Harness Codex має три шари хуків:
|
||||
|
||||
| Шар | Власник | Призначення |
|
||||
| ------------------------------------- | ------------------------ | ------------------------------------------------------------------- |
|
||||
| Хуки Plugin OpenClaw | OpenClaw | Сумісність продукту/Plugin між harness Pi і Codex. |
|
||||
| Middleware розширення app-server Codex | Вбудовані Plugins OpenClaw | Поведінка адаптера навколо динамічних інструментів OpenClaw для кожного ходу. |
|
||||
| Нативні хуки Codex | Codex | Низькорівневий життєвий цикл Codex і політика нативних інструментів із конфігурації Codex. |
|
||||
| хуки Plugin OpenClaw | OpenClaw | Сумісність продукту/Plugin між harness PI і Codex. |
|
||||
| middleware розширення app-server Codex | комплектовані Plugins OpenClaw | Поведінка адаптера навколо динамічних інструментів OpenClaw для кожного ходу. |
|
||||
| нативні хуки Codex | Codex | Низькорівневий життєвий цикл Codex і нативна політика інструментів із конфігурації Codex. |
|
||||
|
||||
OpenClaw не використовує файли Codex `hooks.json` проєкту або глобального рівня для маршрутизації
|
||||
поведінки Plugin OpenClaw. Нативні хуки Codex корисні для операцій, якими володіє
|
||||
Codex, як-от політика shell, нативна перевірка результатів інструментів, обробка зупинки та
|
||||
нативний життєвий цикл Compaction/моделі, але вони не є API Plugin OpenClaw.
|
||||
OpenClaw не використовує файли проєктного або глобального Codex `hooks.json` для маршрутизації
|
||||
поведінки Plugin OpenClaw. Нативні хуки Codex корисні для операцій,
|
||||
що належать Codex, як-от політика shell, нативна перевірка результатів інструментів, обробка зупинки та
|
||||
нативна Compaction/життєвий цикл моделі, але вони не є API Plugin OpenClaw.
|
||||
|
||||
Для динамічних інструментів OpenClaw виконує інструмент після того, як Codex запитує
|
||||
Для динамічних інструментів OpenClaw, OpenClaw виконує інструмент після того, як Codex запитує
|
||||
виклик, тому OpenClaw запускає поведінку Plugin і middleware, якою він володіє, у
|
||||
адаптері harness. Для нативних інструментів Codex канонічним записом інструмента володіє Codex.
|
||||
OpenClaw може віддзеркалювати вибрані події, але не може переписати нативний thread Codex,
|
||||
якщо тільки Codex не відкриває цю операцію через app-server або колбеки
|
||||
нативних хуків.
|
||||
адаптері harness. Для нативних інструментів Codex саме Codex володіє канонічним записом інструмента.
|
||||
OpenClaw може віддзеркалювати окремі події, але не може переписати нативний потік Codex,
|
||||
якщо тільки Codex не надає цю операцію через app-server або нативні callback-хуки.
|
||||
|
||||
Коли новіші збірки app-server Codex відкривають нативні події хуків життєвого циклу Compaction і моделі,
|
||||
OpenClaw має обмежувати підтримку цього протоколу за версією та відображати
|
||||
події в наявний контракт хуків OpenClaw там, де семантика є чесною.
|
||||
Коли новіші збірки app-server Codex надаватимуть події хуків нативної Compaction і життєвого циклу моделі,
|
||||
OpenClaw має з урахуванням версії протоколу вмикати цю підтримку та зіставляти
|
||||
події з наявним контрактом хуків OpenClaw там, де семантика є коректною.
|
||||
До того часу події OpenClaw `before_compaction`, `after_compaction`, `llm_input` і
|
||||
`llm_output` є спостереженнями на рівні адаптера, а не побайтними копіями
|
||||
внутрішнього запиту або payload Compaction у Codex.
|
||||
внутрішнього запиту Codex або payload Compaction.
|
||||
|
||||
Нативні сповіщення app-server Codex `hook/started` і `hook/completed` проєктуються як
|
||||
події агента `codex_app_server.hook` для траєкторії та налагодження.
|
||||
Нативні сповіщення app-server Codex `hook/started` і `hook/completed`
|
||||
проєктуються як події агента `codex_app_server.hook` для траєкторії та налагодження.
|
||||
Вони не викликають хуки Plugin OpenClaw.
|
||||
|
||||
## Інструменти, медіа та Compaction
|
||||
|
||||
harness Codex змінює лише низькорівневий виконавець вбудованого агента.
|
||||
Harness Codex змінює лише низькорівневий виконавець вбудованого агента.
|
||||
|
||||
OpenClaw, як і раніше, будує список інструментів і отримує динамічні результати інструментів від
|
||||
harness. Текст, зображення, відео, музика, TTS, погодження та вивід інструмента повідомлень
|
||||
і далі проходять через звичайний шлях доставки OpenClaw.
|
||||
OpenClaw і далі формує список інструментів і отримує результати динамічних інструментів від
|
||||
harness. Текст, зображення, відео, музика, TTS, погодження та вивід інструментів повідомлень
|
||||
і далі проходять звичайним шляхом доставки OpenClaw.
|
||||
|
||||
Запити на погодження інструментів Codex MCP маршрутизуються через потік погоджень Plugin OpenClaw, коли
|
||||
Codex позначає `_meta.codex_approval_kind` як
|
||||
`"mcp_tool_call"`. Запити Codex `request_user_input` надсилаються назад до
|
||||
початкового чату, а наступне поставлене в чергу повідомлення-відповідь відповідає на цей нативний
|
||||
запит сервера замість того, щоб додаватися як додатковий контекст. Інші запити MCP на
|
||||
уточнення й далі завершуються з відмовою за замовчуванням.
|
||||
Запити погодження інструментів Codex MCP маршрутизуються через потік погодження Plugin
|
||||
OpenClaw, коли Codex позначає `_meta.codex_approval_kind` як
|
||||
`"mcp_tool_call"`. Prompt Codex `request_user_input` надсилаються назад у
|
||||
початковий чат, а наступне поставлене в чергу повідомлення-відповідь відповідає на цей нативний
|
||||
запит сервера замість того, щоб спрямовуватися як додатковий контекст. Інші запити elicitation MCP
|
||||
і далі завершуються за принципом fail closed.
|
||||
|
||||
Коли вибрана модель використовує harness Codex, нативний thread Compaction делегується
|
||||
Коли вибрана модель використовує harness Codex, нативна Compaction потоку делегується
|
||||
app-server Codex. OpenClaw зберігає дзеркало транскрипту для історії каналу,
|
||||
пошуку, `/new`, `/reset` і майбутнього перемикання моделі або harness. Дзеркало
|
||||
включає запит користувача, фінальний текст асистента та спрощені записи міркувань або плану Codex,
|
||||
коли app-server їх надсилає. Наразі OpenClaw лише записує сигнали початку й завершення
|
||||
нативного Compaction. Він ще не показує зрозумілий для людини підсумок Compaction або
|
||||
аудитований список того, які записи Codex зберіг після Compaction.
|
||||
містить prompt користувача, фінальний текст помічника та полегшені записи міркувань або
|
||||
плану Codex, коли app-server їх надсилає. Наразі OpenClaw записує лише сигнали
|
||||
початку та завершення нативної Compaction. Він ще не надає зрозумілого для людини
|
||||
зведення Compaction або придатного до аудиту списку того, які записи Codex
|
||||
зберіг після Compaction.
|
||||
|
||||
Оскільки канонічним нативним thread володіє Codex, `tool_result_persist` наразі не
|
||||
Оскільки Codex володіє канонічним нативним потоком, `tool_result_persist` наразі не
|
||||
переписує записи результатів нативних інструментів Codex. Він застосовується лише тоді, коли
|
||||
OpenClaw записує результат інструмента в транскрипт сеансу, яким володіє OpenClaw.
|
||||
OpenClaw записує результат інструмента в транскрипт сесії, що належить OpenClaw.
|
||||
|
||||
Генерація медіа не потребує Pi. Генерація зображень, відео, музики, PDF, TTS і
|
||||
розуміння медіа й далі використовують відповідні налаштування провайдера/моделі, як-от
|
||||
Генерація медіа не вимагає PI. Генерація зображень, відео, музики, PDF, TTS і
|
||||
розуміння медіа й далі використовують відповідні налаштування провайдера/моделі, такі як
|
||||
`agents.defaults.imageGenerationModel`, `videoGenerationModel`, `pdfModel` і
|
||||
`messages.tts`.
|
||||
|
||||
## Усунення несправностей
|
||||
## Усунення проблем
|
||||
|
||||
**Codex не з’являється в `/model`:** увімкніть `plugins.entries.codex.enabled`,
|
||||
виберіть модель `openai/gpt-*` з `embeddedHarness.runtime: "codex"` (або
|
||||
застаріле посилання `codex/*`) і перевірте, чи `plugins.allow` не виключає `codex`.
|
||||
|
||||
**OpenClaw використовує Pi замість Codex:** якщо жоден harness Codex не бере на себе запуск,
|
||||
OpenClaw може використовувати Pi як бекенд сумісності. Установіть
|
||||
`embeddedHarness.runtime: "codex"`, щоб примусово вибрати Codex під час тестування, або
|
||||
`embeddedHarness.fallback: "none"`, щоб завершуватися з помилкою, коли жоден harness Plugin не підходить. Щойно
|
||||
вибрано app-server Codex, його збої відображаються безпосередньо без додаткової
|
||||
конфігурації fallback.
|
||||
**OpenClaw використовує PI замість Codex:** `runtime: "auto"` усе ще може використовувати PI як
|
||||
бекенд сумісності, коли жоден harness Codex не бере виконання на себе. Установіть
|
||||
`embeddedHarness.runtime: "codex"`, щоб примусово вибрати Codex під час тестування. Тепер
|
||||
примусовий runtime Codex завершується з помилкою замість fallback до PI, якщо ви
|
||||
явно не встановите `embeddedHarness.fallback: "pi"`. Щойно вибрано app-server Codex,
|
||||
його збої проявляються безпосередньо без додаткової конфігурації fallback.
|
||||
|
||||
**app-server відхиляється:** оновіть Codex, щоб handshake app-server
|
||||
повідомляв версію `0.118.0` або новішу.
|
||||
@ -598,16 +600,16 @@ OpenClaw може використовувати Pi як бекенд суміс
|
||||
**Виявлення моделей повільне:** зменште `plugins.entries.codex.config.discovery.timeoutMs`
|
||||
або вимкніть виявлення.
|
||||
|
||||
**Транспорт WebSocket одразу завершується з помилкою:** перевірте `appServer.url`, `authToken`
|
||||
**Транспорт WebSocket відразу завершується з помилкою:** перевірте `appServer.url`, `authToken`,
|
||||
і що віддалений app-server використовує ту саму версію протоколу app-server Codex.
|
||||
|
||||
**Не-Codex модель використовує Pi:** це очікувано, якщо ви не примусово встановили
|
||||
**Не-Codex модель використовує PI:** це очікувано, якщо ви не примусово встановили
|
||||
`embeddedHarness.runtime: "codex"` (або не вибрали застаріле посилання `codex/*`). Звичайні
|
||||
`openai/gpt-*` та інші посилання провайдерів залишаються на своєму звичайному шляху провайдера.
|
||||
|
||||
## Пов’язане
|
||||
|
||||
- [Agent Harness Plugins](/uk/plugins/sdk-agent-harness)
|
||||
- [Plugins Harness агента](/uk/plugins/sdk-agent-harness)
|
||||
- [Провайдери моделей](/uk/concepts/model-providers)
|
||||
- [Довідник із конфігурації](/uk/gateway/configuration-reference)
|
||||
- [Тестування](/uk/help/testing-live#live-codex-app-server-harness-smoke)
|
||||
|
||||
@ -6,46 +6,46 @@ read_when:
|
||||
summary: 'Плагін Google Meet: приєднання до явних URL-адрес Meet через Chrome або Twilio з типовими налаштуваннями голосу в реальному часі'
|
||||
title: Плагін Google Meet
|
||||
x-i18n:
|
||||
generated_at: "2026-04-24T21:15:37Z"
|
||||
generated_at: "2026-04-24T21:43:39Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 8c109e07170601a81f1802bcfb1477d82ff22d69966f73c7811d4c158a1854d7
|
||||
source_hash: 3075b803b04001a7a205215d2606087a38ce75cbde1ab0a44f61f8d5c88ccf78
|
||||
source_path: plugins/google-meet.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
Підтримка учасників Google Meet для OpenClaw — плагін навмисно зроблено явним:
|
||||
Підтримка учасника Google Meet для OpenClaw — Plugin є навмисно явним за дизайном:
|
||||
|
||||
- Він приєднується лише до явного URL `https://meet.google.com/...`.
|
||||
- Він може створити новий простір Meet через API Google Meet, а потім приєднатися за поверненим URL.
|
||||
- `realtime` — це типовий режим голосу.
|
||||
- Голос `realtime` є режимом за замовчуванням.
|
||||
- Голос у режимі реального часу може повертатися до повного агента OpenClaw, коли потрібні глибше міркування або інструменти.
|
||||
- Агенти вибирають поведінку приєднання через `mode`: використовуйте `realtime` для живого прослуховування/відповіді голосом або `transcribe`, щоб приєднатися/керувати браузером без голосового мосту реального часу.
|
||||
- Автентифікація починається як особистий Google OAuth або вже виконаний вхід у профіль Chrome.
|
||||
- Агенти обирають поведінку приєднання за допомогою `mode`: використовуйте `realtime` для живого прослуховування/зворотного мовлення або `transcribe`, щоб приєднатися/керувати браузером без голосового моста режиму реального часу.
|
||||
- Автентифікація починається як персональний Google OAuth або вже виконаний вхід у профіль Chrome.
|
||||
- Автоматичного оголошення згоди немає.
|
||||
- Типовий аудіобекенд Chrome — `BlackHole 2ch`.
|
||||
- Chrome може працювати локально або на під’єднаному вузлі.
|
||||
- Twilio приймає номер для дозвону та необов’язковий PIN або послідовність DTMF.
|
||||
- Команда CLI — `googlemeet`; `meet` зарезервовано для ширших сценаріїв телеконференцій агента.
|
||||
- Chrome може працювати локально або на підключеному хості Node.
|
||||
- Twilio приймає номер для дозвону та необов’язкову послідовність PIN або DTMF.
|
||||
- Команда CLI — `googlemeet`; `meet` зарезервовано для ширших робочих процесів телеконференцій агента.
|
||||
|
||||
## Швидкий старт
|
||||
|
||||
Установіть локальні аудіозалежності та налаштуйте постачальника голосу реального часу для бекенду. Типовим є OpenAI; Google Gemini Live також працює з `realtime.provider: "google"`:
|
||||
Установіть локальні аудіозалежності та налаштуйте бекенд-провайдера голосу в режимі реального часу. OpenAI використовується за замовчуванням; Google Gemini Live також працює з `realtime.provider: "google"`:
|
||||
|
||||
```bash
|
||||
brew install blackhole-2ch sox
|
||||
export OPENAI_API_KEY=sk-...
|
||||
# або
|
||||
# or
|
||||
export GEMINI_API_KEY=...
|
||||
```
|
||||
|
||||
`blackhole-2ch` установлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор Homebrew потребує перезавантаження, перш ніж macOS покаже цей пристрій:
|
||||
`blackhole-2ch` установлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор Homebrew вимагає перезавантаження, перш ніж macOS зробить пристрій доступним:
|
||||
|
||||
```bash
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
Після перезавантаження перевірте обидва компоненти:
|
||||
Після перезавантаження перевірте обидві складові:
|
||||
|
||||
```bash
|
||||
system_profiler SPAudioDataType | grep -i BlackHole
|
||||
@ -73,9 +73,8 @@ command -v rec play
|
||||
openclaw googlemeet setup
|
||||
```
|
||||
|
||||
Вивід налаштування призначено для читання агентом. Він повідомляє про профіль Chrome, аудіоміст, закріплення вузла, відкладений вступ у режимі реального часу та, якщо налаштовано делегування Twilio, чи готові плагін `voice-call` і облікові дані Twilio.
|
||||
Вважайте будь-яку перевірку `ok: false` блокером, перш ніж просити агента приєднатися.
|
||||
Для скриптів або машинозчитуваного виводу використовуйте `openclaw googlemeet setup --json`.
|
||||
Вивід налаштування призначений для читання агентом. Він повідомляє про профіль Chrome, аудіоміст, прив’язку до Node, відкладене вступне повідомлення режиму реального часу, а також, коли налаштовано делегування Twilio, чи готові Plugin `voice-call` і облікові дані Twilio. Вважайте будь-яку перевірку з `ok: false` блокувальною, перш ніж просити агента приєднатися.
|
||||
Використовуйте `openclaw googlemeet setup --json` для скриптів або машинозчитуваного виводу.
|
||||
|
||||
Приєднайтеся до зустрічі:
|
||||
|
||||
@ -101,7 +100,14 @@ openclaw googlemeet create
|
||||
openclaw googlemeet join https://meet.google.com/new-abcd-xyz --transport chrome-node
|
||||
```
|
||||
|
||||
Або скажіть агенту: «Створи Google Meet, приєднайся до нього з голосом у режимі реального часу і надішли мені посилання». Агент має викликати `google_meet` з `action: "create"`, скопіювати повернений `meetingUri`, а потім викликати `google_meet` з `action: "join"` і цим URL.
|
||||
`googlemeet create` має два шляхи:
|
||||
|
||||
- Створення через API: використовується, коли налаштовано облікові дані Google Meet OAuth. Це найдетермінованіший шлях, який не залежить від стану інтерфейсу браузера.
|
||||
- Резервний варіант через браузер: використовується, коли облікові дані OAuth відсутні. OpenClaw використовує закріплений Chrome Node, відкриває `https://meet.google.com/new`, чекає, поки Google перенаправить на реальний URL із кодом зустрічі, а потім повертає цей URL. Цей шлях вимагає, щоб профіль OpenClaw Chrome на Node уже мав виконаний вхід у Google.
|
||||
|
||||
Вивід команди містить поле `source` (`api` або `browser`), щоб агенти могли пояснити, який шлях було використано.
|
||||
|
||||
Або скажіть агенту: "Створи Google Meet, приєднайся до нього з голосом у режимі реального часу та надішли мені посилання". Агент має викликати `google_meet` з `action: "create"`, скопіювати повернений `meetingUri`, а потім викликати `google_meet` з `action: "join"` і цим URL.
|
||||
|
||||
```json
|
||||
{
|
||||
@ -118,19 +124,19 @@ openclaw googlemeet join https://meet.google.com/new-abcd-xyz --transport chrome
|
||||
}
|
||||
```
|
||||
|
||||
Для приєднання лише для спостереження/керування браузером установіть `"mode": "transcribe"`. Це не запускає двобічний міст моделі реального часу, тому вона не буде відповідати голосом у зустрічі.
|
||||
Для приєднання лише зі спостереженням/керуванням браузером установіть `"mode": "transcribe"`. Це не запускає міст дуплексної моделі режиму реального часу, тому він не буде відповідати голосом у зустрічі.
|
||||
|
||||
Chrome приєднується як профіль Chrome, у якому виконано вхід. У Meet виберіть `BlackHole 2ch` для шляху мікрофона/динаміка, який використовує OpenClaw. Для чистого двобічного аудіо використовуйте окремі віртуальні пристрої або граф у стилі Loopback; одного пристрою BlackHole достатньо для першого smoke-тесту, але він може створювати відлуння.
|
||||
Chrome приєднується як профіль Chrome, у якому виконано вхід. У Meet виберіть `BlackHole 2ch` для шляху мікрофона/динаміка, який використовує OpenClaw. Для чистого дуплексного аудіо використовуйте окремі віртуальні пристрої або граф на кшталт Loopback; одного пристрою BlackHole достатньо для першого smoke-тесту, але може бути луна.
|
||||
|
||||
### Локальний Gateway + Parallels Chrome
|
||||
|
||||
Вам **не** потрібен повний OpenClaw Gateway або ключ API моделі всередині macOS VM лише для того, щоб VM володіла Chrome. Запустіть Gateway і агента локально, а потім запустіть вузол у VM. Увімкніть вбудований плагін у VM один раз, щоб вузол рекламував команду Chrome:
|
||||
Вам **не** потрібен повний OpenClaw Gateway або ключ API моделі всередині macOS VM лише для того, щоб VM володіла Chrome. Запустіть Gateway і агента локально, а потім запустіть хост Node у VM. Один раз увімкніть у VM вбудований Plugin, щоб Node оголошував команду Chrome:
|
||||
|
||||
Що де працює:
|
||||
Що де запускається:
|
||||
|
||||
- Хост Gateway: OpenClaw Gateway, робочий простір агента, ключі моделі/API, постачальник режиму реального часу та конфігурація плагіна Google Meet.
|
||||
- macOS VM у Parallels: CLI/node host OpenClaw, Google Chrome, SoX, BlackHole 2ch і профіль Chrome з виконаним входом у Google.
|
||||
- Не потрібно у VM: служба Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування постачальника моделі.
|
||||
- Хост Gateway: OpenClaw Gateway, робочий простір агента, ключі моделі/API, провайдер режиму реального часу та конфігурація Plugin Google Meet.
|
||||
- macOS VM у Parallels: OpenClaw CLI/хост Node, Google Chrome, SoX, BlackHole 2ch і профіль Chrome з виконаним входом у Google.
|
||||
- Не потрібно у VM: сервіс Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування провайдера моделі.
|
||||
|
||||
Установіть залежності у VM:
|
||||
|
||||
@ -138,13 +144,13 @@ Chrome приєднується як профіль Chrome, у якому вик
|
||||
brew install blackhole-2ch sox
|
||||
```
|
||||
|
||||
Перезавантажте VM після встановлення BlackHole, щоб macOS показала `BlackHole 2ch`:
|
||||
Перезавантажте VM після встановлення BlackHole, щоб macOS зробила `BlackHole 2ch` доступним:
|
||||
|
||||
```bash
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
Після перезавантаження перевірте, що VM бачить аудіопристрій і команди SoX:
|
||||
Після перезавантаження переконайтеся, що VM бачить аудіопристрій і команди SoX:
|
||||
|
||||
```bash
|
||||
system_profiler SPAudioDataType | grep -i BlackHole
|
||||
@ -157,20 +163,20 @@ command -v rec play
|
||||
openclaw plugins enable google-meet
|
||||
```
|
||||
|
||||
Запустіть вузол у VM:
|
||||
Запустіть хост Node у VM:
|
||||
|
||||
```bash
|
||||
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
|
||||
```
|
||||
|
||||
Якщо `<gateway-host>` — це IP-адреса LAN і ви не використовуєте TLS, вузол відхиляє незашифрований WebSocket, якщо ви явно не дозволите це для цієї довіреної приватної мережі:
|
||||
Якщо `<gateway-host>` є LAN IP і ви не використовуєте TLS, Node відхилить незашифрований WebSocket, якщо ви явно не дозволите це для цієї довіреної приватної мережі:
|
||||
|
||||
```bash
|
||||
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
|
||||
```
|
||||
|
||||
Використовуйте ту саму змінну середовища, коли встановлюєте вузол як LaunchAgent:
|
||||
Використовуйте ту саму змінну середовища під час установлення Node як LaunchAgent:
|
||||
|
||||
```bash
|
||||
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
@ -178,22 +184,22 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
openclaw node restart
|
||||
```
|
||||
|
||||
`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` — це змінна середовища процесу, а не параметр `openclaw.json`. `openclaw node install` зберігає її в середовищі LaunchAgent, якщо вона присутня в команді встановлення.
|
||||
`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` — це середовище процесу, а не параметр `openclaw.json`. `openclaw node install` зберігає його в середовищі LaunchAgent, коли воно присутнє в команді встановлення.
|
||||
|
||||
Підтвердьте вузол із хоста Gateway:
|
||||
Схваліть Node з хоста Gateway:
|
||||
|
||||
```bash
|
||||
openclaw devices list
|
||||
openclaw devices approve <requestId>
|
||||
```
|
||||
|
||||
Підтвердьте, що Gateway бачить вузол і що він рекламує як `googlemeet.chrome`, так і можливість браузера/`browser.proxy`:
|
||||
Підтвердьте, що Gateway бачить Node і що він оголошує як `googlemeet.chrome`, так і можливість браузера/`browser.proxy`:
|
||||
|
||||
```bash
|
||||
openclaw nodes status
|
||||
```
|
||||
|
||||
Спрямуйте Meet через цей вузол на хості Gateway:
|
||||
Спрямуйте Meet через цей Node на хості Gateway:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -223,7 +229,7 @@ openclaw nodes status
|
||||
}
|
||||
```
|
||||
|
||||
Тепер приєднуйтеся як зазвичай із хоста Gateway:
|
||||
Тепер приєднуйтеся звичайним способом із хоста Gateway:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij
|
||||
@ -231,54 +237,53 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij
|
||||
|
||||
або попросіть агента використати інструмент `google_meet` з `transport: "chrome-node"`.
|
||||
|
||||
Для smoke-тесту однією командою, який створює або повторно використовує сеанс, вимовляє відому фразу та виводить стан сеансу:
|
||||
Для smoke-тесту однією командою, який створює або повторно використовує сесію, промовляє відому фразу та виводить стан сесії:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij
|
||||
```
|
||||
|
||||
Якщо в профілі браузера не виконано вхід, Meet очікує допуску хостом або Chrome потребує дозволу на мікрофон/камеру, результат join/test-speech повідомляє `manualActionRequired: true` разом із `manualActionReason` і `manualActionMessage`. Агенти мають припинити повторні спроби приєднання, повідомити це повідомлення оператору й повторити спробу лише після завершення ручної дії в браузері.
|
||||
Якщо в профілі браузера не виконано вхід, Meet очікує допуску від організатора або Chrome потребує дозволу на мікрофон/камеру, результат join/test-speech повідомляє `manualActionRequired: true` разом із `manualActionReason` і `manualActionMessage`. Агенти повинні припинити повторні спроби приєднання, повідомити оператору це повідомлення та повторити спробу лише після завершення ручної дії в браузері.
|
||||
|
||||
Якщо `chromeNode.node` пропущено, OpenClaw виконує автовибір лише тоді, коли рівно один підключений вузол рекламує і `googlemeet.chrome`, і керування браузером. Якщо підключено кілька придатних вузлів, установіть `chromeNode.node` на id вузла, відображуване ім’я або віддалену IP-адресу.
|
||||
Якщо `chromeNode.node` пропущено, OpenClaw автоматично обирає Node лише тоді, коли рівно один підключений Node оголошує і `googlemeet.chrome`, і керування браузером. Якщо підключено кілька придатних Node, установіть `chromeNode.node` в ідентифікатор Node, відображуване ім’я або віддалену IP-адресу.
|
||||
|
||||
Поширені перевірки помилок:
|
||||
Поширені перевірки збоїв:
|
||||
|
||||
- `No connected Google Meet-capable node`: запустіть `openclaw node run` у VM, підтвердьте сполучення та переконайтеся, що у VM було виконано `openclaw plugins enable google-meet` і `openclaw plugins enable browser`. Також підтвердьте, що хост Gateway дозволяє обидві команди вузла через `gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`.
|
||||
- `No connected Google Meet-capable node`: запустіть `openclaw node run` у VM, схваліть сполучення та переконайтеся, що у VM було виконано `openclaw plugins enable google-meet` і `openclaw plugins enable browser`. Також підтвердьте, що хост Gateway дозволяє обидві команди Node через `gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`.
|
||||
- `BlackHole 2ch audio device not found on the node`: установіть `blackhole-2ch` у VM і перезавантажте VM.
|
||||
- Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM або залиште `chrome.guestName` встановленим для гостьового приєднання. Автоприєднання гостя використовує автоматизацію браузера OpenClaw через проксі браузера вузла; переконайтеся, що конфігурація браузера вузла вказує на потрібний профіль, наприклад `browser.defaultProfile: "user"` або іменований профіль наявного сеансу.
|
||||
- Дубльовані вкладки Meet: залиште ввімкненим `chrome.reuseExistingTab: true`. OpenClaw активує наявну вкладку для того самого URL Meet перед відкриттям нової.
|
||||
- Немає аудіо: у Meet спрямовуйте аудіо мікрофона/динаміка через шлях віртуального аудіопристрою, який використовує OpenClaw; для чистого двобічного аудіо використовуйте окремі віртуальні пристрої або маршрутизацію в стилі Loopback.
|
||||
- Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM або залиште `chrome.guestName` увімкненим для гостьового приєднання. Автоприєднання гостя використовує автоматизацію браузера OpenClaw через проксі браузера Node; переконайтеся, що конфігурація браузера Node вказує на потрібний вам профіль, наприклад `browser.defaultProfile: "user"` або іменований профіль наявної сесії.
|
||||
- Дубльовані вкладки Meet: залишайте `chrome.reuseExistingTab: true` увімкненим. OpenClaw активує наявну вкладку для того самого URL Meet перед відкриттям нової.
|
||||
- Немає аудіо: у Meet спрямовуйте мікрофон і динамік через шлях віртуального аудіопристрою, який використовує OpenClaw; для чистого дуплексного аудіо використовуйте окремі віртуальні пристрої або маршрутизацію на кшталт Loopback.
|
||||
|
||||
## Примітки щодо встановлення
|
||||
|
||||
Типовий режим Chrome realtime використовує два зовнішні інструменти:
|
||||
Типовий режим реального часу для Chrome використовує два зовнішні інструменти:
|
||||
|
||||
- `sox`: утиліта командного рядка для аудіо. Плагін використовує її команди `rec` і `play` для типового аудіомосту G.711 mu-law 8 кГц.
|
||||
- `blackhole-2ch`: віртуальний аудіодрайвер macOS. Він створює аудіопристрій `BlackHole 2ch`, через який Chrome/Meet можуть маршрутизувати аудіо.
|
||||
- `sox`: утиліта командного рядка для роботи з аудіо. Plugin використовує її команди `rec` і `play` для типового аудіомоста G.711 mu-law 8 кГц.
|
||||
- `blackhole-2ch`: віртуальний аудіодрайвер macOS. Він створює аудіопристрій `BlackHole 2ch`, через який можна маршрутизувати Chrome/Meet.
|
||||
|
||||
OpenClaw не включає й не розповсюджує жоден із цих пакетів. У документації користувачам пропонується встановлювати їх як залежності хоста через Homebrew. SoX ліцензовано як `LGPL-2.0-only AND GPL-2.0-only`; BlackHole має ліцензію GPL-3.0. Якщо ви збираєте інсталятор або appliance, що включає BlackHole разом з OpenClaw, перегляньте умови вихідної ліцензії BlackHole або отримайте окрему ліцензію від Existential Audio.
|
||||
OpenClaw не постачає й не розповсюджує жоден із цих пакетів. У документації користувачам пропонується встановлювати їх як залежності хоста через Homebrew. SoX ліцензовано як `LGPL-2.0-only AND GPL-2.0-only`; BlackHole — GPL-3.0. Якщо ви збираєте інсталятор або appliance, що постачає BlackHole разом з OpenClaw, перегляньте умови ліцензування BlackHole в джерелі або отримайте окрему ліцензію від Existential Audio.
|
||||
|
||||
## Транспорти
|
||||
|
||||
### Chrome
|
||||
|
||||
Транспорт Chrome відкриває URL Meet у Google Chrome і приєднується як профіль Chrome, у якому виконано вхід. На macOS плагін перед запуском перевіряє наявність `BlackHole 2ch`.
|
||||
Якщо налаштовано, він також запускає команду перевірки стану аудіомосту та команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо працюють на під’єднаному вузлі, наприклад у macOS VM Parallels.
|
||||
Транспорт Chrome відкриває URL Meet у Google Chrome і приєднується як профіль Chrome, у якому виконано вхід. У macOS Plugin перед запуском перевіряє наявність `BlackHole 2ch`. Якщо налаштовано, він також запускає команду перевірки стану аудіомоста та команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо працюють на підключеному Node, наприклад у macOS VM Parallels.
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node
|
||||
```
|
||||
|
||||
Спрямуйте аудіо мікрофона та динаміка Chrome через локальний аудіоміст OpenClaw. Якщо `BlackHole 2ch` не встановлено, приєднання завершується помилкою налаштування замість тихого приєднання без аудіошляху.
|
||||
Спрямуйте аудіо мікрофона та динаміка Chrome через локальний аудіоміст OpenClaw. Якщо `BlackHole 2ch` не встановлено, приєднання завершиться помилкою налаштування замість тихого приєднання без аудіошляху.
|
||||
|
||||
### Twilio
|
||||
|
||||
Транспорт Twilio — це строгий план набору, делегований плагіну Voice Call. Він не аналізує сторінки Meet, щоб витягти телефонні номери.
|
||||
Транспорт Twilio — це строгий план набору, делегований Plugin Voice Call. Він не аналізує сторінки Meet у пошуку телефонних номерів.
|
||||
|
||||
Використовуйте це, коли участь через Chrome недоступна або коли вам потрібен резервний варіант із телефонним дозвоном. Google Meet має показувати номер для телефонного дозвону та PIN для зустрічі; OpenClaw не визначає їх зі сторінки Meet.
|
||||
Використовуйте це, коли участь через Chrome недоступна або коли вам потрібен резервний варіант через телефонний дозвін. Google Meet має надавати номер для телефонного підключення та PIN для зустрічі; OpenClaw не виявляє їх зі сторінки Meet.
|
||||
|
||||
Увімкніть плагін Voice Call на хості Gateway, а не на вузлі Chrome:
|
||||
Увімкніть Plugin Voice Call на хості Gateway, а не на Node із Chrome:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -289,7 +294,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
|
||||
enabled: true,
|
||||
config: {
|
||||
defaultTransport: "chrome-node",
|
||||
// або встановіть "twilio", якщо Twilio має бути типовим
|
||||
// or set "twilio" if Twilio should be the default
|
||||
},
|
||||
},
|
||||
"voice-call": {
|
||||
@ -311,7 +316,7 @@ export TWILIO_AUTH_TOKEN=...
|
||||
export TWILIO_FROM_NUMBER=+15550001234
|
||||
```
|
||||
|
||||
Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації плагіна не з’являються в уже запущеному процесі Gateway, доки він не буде перезавантажений.
|
||||
Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації Plugin не з’являються у вже запущеному процесі Gateway, доки він не буде перезавантажений.
|
||||
|
||||
Потім перевірте:
|
||||
|
||||
@ -321,7 +326,7 @@ openclaw plugins list | grep -E 'google-meet|voice-call'
|
||||
openclaw googlemeet setup
|
||||
```
|
||||
|
||||
Коли делегування Twilio налаштоване, `googlemeet setup` містить успішні перевірки `twilio-voice-call-plugin` і `twilio-voice-call-credentials`.
|
||||
Коли делегування Twilio підключено, `googlemeet setup` містить успішні перевірки `twilio-voice-call-plugin` і `twilio-voice-call-credentials`.
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
@ -330,7 +335,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
--pin 123456
|
||||
```
|
||||
|
||||
Використовуйте `--dtmf-sequence`, коли зустріч потребує власної послідовності:
|
||||
Використовуйте `--dtmf-sequence`, коли зустріч потребує спеціальної послідовності:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
@ -341,23 +346,21 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
|
||||
## OAuth і попередня перевірка
|
||||
|
||||
Доступ до Google Meet Media API спочатку використовує особистий OAuth-клієнт. Налаштуйте
|
||||
`oauth.clientId` і за потреби `oauth.clientSecret`, а потім виконайте:
|
||||
OAuth є необов’язковим для створення посилання Meet, оскільки `googlemeet create` може перейти до резервного варіанта з автоматизацією браузера. Налаштуйте OAuth, якщо вам потрібні офіційне створення через API, розв’язання простору або перевірки перед запуском через Meet Media API.
|
||||
|
||||
Доступ до API Google Meet спочатку використовує персональний OAuth client. Налаштуйте `oauth.clientId` і, за потреби, `oauth.clientSecret`, а потім виконайте:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet auth login --json
|
||||
```
|
||||
|
||||
Команда виводить блок конфігурації `oauth` з refresh token. Вона використовує PKCE,
|
||||
локальний callback на `http://localhost:8085/oauth2callback` і ручний
|
||||
потік копіювання/вставлення з `--manual`.
|
||||
Команда виводить блок конфігурації `oauth` із токеном оновлення. Вона використовує PKCE, локальний callback на `http://localhost:8085/oauth2callback` і ручний сценарій копіювання/вставлення з `--manual`.
|
||||
|
||||
Згода OAuth включає створення просторів Meet, доступ на читання просторів Meet і
|
||||
доступ на читання медіаданих конференцій Meet. Якщо ви пройшли автентифікацію до того, як з’явилася
|
||||
підтримка створення зустрічей, повторно виконайте `openclaw googlemeet auth login --json`, щоб
|
||||
refresh token мав область доступу `meetings.space.created`.
|
||||
Згода OAuth включає створення просторів Meet, доступ на читання простору Meet і доступ на читання медіаданих конференції Meet. Якщо ви проходили автентифікацію до появи підтримки створення зустрічей, повторно виконайте `openclaw googlemeet auth login --json`, щоб токен оновлення мав область дії `meetings.space.created`.
|
||||
|
||||
Ці змінні середовища приймаються як резервні варіанти:
|
||||
Для резервного варіанта через браузер облікові дані OAuth не потрібні. У цьому режимі автентифікація Google походить із профілю Chrome із виконаним входом на вибраному Node, а не з конфігурації OpenClaw.
|
||||
|
||||
Як резервні варіанти приймаються такі змінні середовища:
|
||||
|
||||
- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID`
|
||||
- `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` або `GOOGLE_MEET_CLIENT_SECRET`
|
||||
@ -374,46 +377,63 @@ refresh token мав область доступу `meetings.space.created`.
|
||||
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
|
||||
```
|
||||
|
||||
Виконайте попередню перевірку перед роботою з медіа:
|
||||
Запустіть попередню перевірку перед роботою з медіаданими:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
|
||||
```
|
||||
|
||||
Створіть новий простір Meet з тією самою конфігурацією OAuth:
|
||||
Створіть новий простір Meet:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet create
|
||||
```
|
||||
|
||||
Команда виводить нові `meeting uri` і `space`. Агенти можуть використовувати
|
||||
інструмент `google_meet` з `action: "create"` для створення зустрічі, а потім викликати
|
||||
`action: "join"` з поверненим `meetingUri`.
|
||||
Команда виводить новий `meeting uri` і джерело. За наявності облікових даних OAuth вона використовує офіційний API Google Meet. Без облікових даних OAuth вона використовує профіль браузера із виконаним входом на закріпленому Chrome Node як резервний варіант. Агенти можуть використовувати інструмент `google_meet` з `action: "create"` для створення зустрічі, а потім викликати `action: "join"` з поверненим `meetingUri`.
|
||||
|
||||
Створення простору Meet створює лише URL зустрічі. Транспорт Chrome або Chrome-node
|
||||
усе одно потребує профілю Google Chrome з виконаним входом, щоб приєднатися через
|
||||
браузер. Якщо в профілі виконано вихід, OpenClaw повідомляє
|
||||
`manualActionRequired: true` і просить оператора завершити вхід у Google перед
|
||||
повторною спробою приєднання.
|
||||
Приклад виводу JSON із резервного варіанта через браузер:
|
||||
|
||||
Установлюйте `preview.enrollmentAcknowledged: true` лише після підтвердження, що ваш Cloud
|
||||
project, OAuth principal і учасники зустрічі зареєстровані в програмі
|
||||
Google Workspace Developer Preview Program для медіа-API Meet.
|
||||
```json
|
||||
{
|
||||
"source": "browser",
|
||||
"meetingUri": "https://meet.google.com/abc-defg-hij",
|
||||
"browser": {
|
||||
"nodeId": "ba0f4e4bc...",
|
||||
"targetId": "tab-1"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Приклад виводу JSON зі створення через API:
|
||||
|
||||
```json
|
||||
{
|
||||
"source": "api",
|
||||
"meetingUri": "https://meet.google.com/abc-defg-hij",
|
||||
"space": {
|
||||
"name": "spaces/abc-defg-hij",
|
||||
"meetingCode": "abc-defg-hij",
|
||||
"meetingUri": "https://meet.google.com/abc-defg-hij"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Створення Meet лише створює або виявляє URL зустрічі. Транспорт Chrome або Chrome-node усе ще потребує профілю Google Chrome із виконаним входом, щоб приєднатися через браузер. Якщо в профілі виконано вихід, OpenClaw повідомляє `manualActionRequired: true` або помилку резервного варіанта через браузер і просить оператора завершити вхід у Google перед повторною спробою.
|
||||
|
||||
Установлюйте `preview.enrollmentAcknowledged: true` лише після підтвердження, що ваш проєкт Cloud, OAuth principal і учасники зустрічі зареєстровані в Google Workspace Developer Preview Program для медіа-API Meet.
|
||||
|
||||
## Конфігурація
|
||||
|
||||
Звичайному шляху Chrome realtime потрібні лише ввімкнений плагін, BlackHole, SoX
|
||||
і ключ постачальника голосу реального часу для бекенду. Типовим є OpenAI; установіть
|
||||
`realtime.provider: "google"`, щоб використовувати Google Gemini Live:
|
||||
Для поширеного шляху Chrome у режимі реального часу потрібні лише ввімкнений Plugin, BlackHole, SoX і ключ бекенд-провайдера голосу в режимі реального часу. OpenAI використовується за замовчуванням; установіть `realtime.provider: "google"`, щоб використовувати Google Gemini Live:
|
||||
|
||||
```bash
|
||||
brew install blackhole-2ch sox
|
||||
export OPENAI_API_KEY=sk-...
|
||||
# або
|
||||
# or
|
||||
export GEMINI_API_KEY=...
|
||||
```
|
||||
|
||||
Установіть конфігурацію плагіна в `plugins.entries.google-meet.config`:
|
||||
Установіть конфігурацію Plugin у `plugins.entries.google-meet.config`:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -432,26 +452,18 @@ export GEMINI_API_KEY=...
|
||||
|
||||
- `defaultTransport: "chrome"`
|
||||
- `defaultMode: "realtime"`
|
||||
- `chromeNode.node`: необов’язковий id/ім’я/IP вузла для `chrome-node`
|
||||
- `chromeNode.node`: необов’язковий id/ім’я/IP Node для `chrome-node`
|
||||
- `chrome.audioBackend: "blackhole-2ch"`
|
||||
- `chrome.guestName: "OpenClaw Agent"`: ім’я, яке використовується на екрані
|
||||
гостя Meet без входу
|
||||
- `chrome.autoJoin: true`: заповнення імені гостя та натискання Join Now у
|
||||
режимі best-effort через автоматизацію браузера OpenClaw на `chrome-node`
|
||||
- `chrome.reuseExistingTab: true`: активувати наявну вкладку Meet замість
|
||||
відкриття дублікатів
|
||||
- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet не повідомить про стан in-call,
|
||||
перш ніж буде запущено вступ у режимі реального часу
|
||||
- `chrome.audioInputCommand`: команда SoX `rec`, що записує аудіо G.711 mu-law 8 кГц
|
||||
у stdout
|
||||
- `chrome.audioOutputCommand`: команда SoX `play`, що читає аудіо G.711 mu-law 8 кГц
|
||||
із stdin
|
||||
- `chrome.guestName: "OpenClaw Agent"`: ім’я, яке використовується на екрані гостя Meet без входу
|
||||
- `chrome.autoJoin: true`: найкраща можлива спроба заповнення імені гостя й натискання Join Now через автоматизацію браузера OpenClaw на `chrome-node`
|
||||
- `chrome.reuseExistingTab: true`: активувати наявну вкладку Meet замість відкриття дублікатів
|
||||
- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet не повідомить про вхід у виклик, перш ніж буде запущено вступ у режимі реального часу
|
||||
- `chrome.audioInputCommand`: команда SoX `rec`, яка записує аудіо G.711 mu-law 8 кГц у stdout
|
||||
- `chrome.audioOutputCommand`: команда SoX `play`, яка читає аудіо G.711 mu-law 8 кГц зі stdin
|
||||
- `realtime.provider: "openai"`
|
||||
- `realtime.toolPolicy: "safe-read-only"`
|
||||
- `realtime.instructions`: короткі усні відповіді, з
|
||||
`openclaw_agent_consult` для глибших відповідей
|
||||
- `realtime.introMessage`: коротка усна перевірка готовності, коли міст
|
||||
реального часу підключається; установіть `""`, щоб приєднуватися беззвучно
|
||||
- `realtime.instructions`: короткі усні відповіді, з `openclaw_agent_consult` для глибших відповідей
|
||||
- `realtime.introMessage`: коротка усна перевірка готовності, коли підключається міст режиму реального часу; установіть `""`, щоб приєднуватися беззвучно
|
||||
|
||||
Необов’язкові перевизначення:
|
||||
|
||||
@ -471,7 +483,7 @@ export GEMINI_API_KEY=...
|
||||
realtime: {
|
||||
provider: "google",
|
||||
toolPolicy: "owner",
|
||||
introMessage: "Скажи рівно: I'm here.",
|
||||
introMessage: "Say exactly: I'm here.",
|
||||
providers: {
|
||||
google: {
|
||||
model: "gemini-2.5-flash-native-audio-preview-12-2025",
|
||||
@ -497,10 +509,7 @@ export GEMINI_API_KEY=...
|
||||
}
|
||||
```
|
||||
|
||||
`voiceCall.enabled` типово має значення `true`; з транспортом Twilio він делегує
|
||||
фактичний PSTN-виклик і DTMF плагіну Voice Call. Якщо `voice-call` не
|
||||
ввімкнено, Google Meet усе одно може перевірити й записати план набору, але не може
|
||||
виконати виклик Twilio.
|
||||
`voiceCall.enabled` за замовчуванням має значення `true`; із транспортом Twilio він делегує фактичний виклик PSTN і DTMF Plugin `Voice Call`. Якщо `voice-call` не ввімкнено, Google Meet усе ще може перевіряти й записувати план набору, але не може виконати виклик Twilio.
|
||||
|
||||
## Інструмент
|
||||
|
||||
@ -515,59 +524,39 @@ export GEMINI_API_KEY=...
|
||||
}
|
||||
```
|
||||
|
||||
Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. Використовуйте
|
||||
`transport: "chrome-node"`, коли Chrome працює на під’єднаному вузлі, наприклад у Parallels
|
||||
VM. В обох випадках модель реального часу та `openclaw_agent_consult` працюють на
|
||||
хості Gateway, тому облікові дані моделі залишаються там.
|
||||
Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. Використовуйте `transport: "chrome-node"`, коли Chrome працює на підключеному Node, наприклад у Parallels VM. В обох випадках модель режиму реального часу та `openclaw_agent_consult` працюють на хості Gateway, тож облікові дані моделі залишаються там.
|
||||
|
||||
Використовуйте `action: "status"`, щоб перелічити активні сеанси або перевірити ID сеансу. Використовуйте
|
||||
`action: "speak"` із `sessionId` і `message`, щоб змусити агента реального часу
|
||||
говорити негайно. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сеанс,
|
||||
запустити відому фразу й повернути стан `inCall`, якщо хост Chrome може
|
||||
його повідомити. Використовуйте `action: "leave"`, щоб позначити сеанс завершеним.
|
||||
Використовуйте `action: "status"`, щоб перелічити активні сесії або перевірити id сесії. Використовуйте `action: "speak"` із `sessionId` і `message`, щоб агент режиму реального часу негайно заговорив. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сесію, запустити відому фразу й повернути стан `inCall`, коли хост Chrome може про нього повідомити. Використовуйте `action: "leave"`, щоб позначити завершення сесії.
|
||||
|
||||
`status` включає стан Chrome, коли він доступний:
|
||||
`status` містить стан Chrome, коли він доступний:
|
||||
|
||||
- `inCall`: Chrome, імовірно, перебуває всередині виклику Meet
|
||||
- `micMuted`: best-effort стан мікрофона Meet
|
||||
- `manualActionRequired` / `manualActionReason` / `manualActionMessage`: профіль
|
||||
браузера потребує ручного входу, допуску хостом Meet, дозволів або
|
||||
виправлення керування браузером, перш ніж мовлення зможе працювати
|
||||
- `providerConnected` / `realtimeReady`: стан голосового мосту реального часу
|
||||
- `lastInputAt` / `lastOutputAt`: час останнього аудіо, отриманого від мосту або надісланого до нього
|
||||
- `inCall`: схоже, що Chrome перебуває всередині виклику Meet
|
||||
- `micMuted`: найкраща можлива оцінка стану мікрофона Meet
|
||||
- `manualActionRequired` / `manualActionReason` / `manualActionMessage`: профіль браузера потребує ручного входу, допуску організатора Meet, дозволів або відновлення керування браузером, перш ніж мовлення зможе працювати
|
||||
- `providerConnected` / `realtimeReady`: стан голосового моста режиму реального часу
|
||||
- `lastInputAt` / `lastOutputAt`: останнє аудіо, отримане мостом або надіслане до нього
|
||||
|
||||
```json
|
||||
{
|
||||
"action": "speak",
|
||||
"sessionId": "meet_...",
|
||||
"message": "Скажи рівно: I'm here and listening."
|
||||
"message": "Say exactly: I'm here and listening."
|
||||
}
|
||||
```
|
||||
|
||||
## Консультація агента в режимі реального часу
|
||||
## Консультація агента режиму реального часу
|
||||
|
||||
Режим Chrome realtime оптимізовано для живого голосового циклу. Постачальник
|
||||
голосу реального часу чує аудіо зустрічі та говорить через налаштований
|
||||
аудіоміст. Коли моделі реального часу потрібні глибше міркування, актуальна
|
||||
інформація або звичайні інструменти OpenClaw, вона може викликати `openclaw_agent_consult`.
|
||||
Режим Chrome у режимі реального часу оптимізовано для живого голосового циклу. Провайдер голосу режиму реального часу чує аудіо зустрічі й говорить через налаштований аудіоміст. Коли моделі режиму реального часу потрібні глибші міркування, актуальна інформація або звичайні інструменти OpenClaw, вона може викликати `openclaw_agent_consult`.
|
||||
|
||||
Інструмент консультації у фоновому режимі запускає звичайного агента OpenClaw
|
||||
із контекстом нещодавньої розшифровки зустрічі й повертає стислу усну відповідь
|
||||
до голосового сеансу реального часу. Потім голосова модель може озвучити цю
|
||||
відповідь назад у зустріч.
|
||||
Інструмент консультації запускає звичайного агента OpenClaw у фоновому режимі з контекстом нещодавньої розшифровки зустрічі та повертає стислу усну відповідь до голосової сесії режиму реального часу. Потім голосова модель може озвучити цю відповідь назад у зустріч.
|
||||
|
||||
`realtime.toolPolicy` керує запуском консультації:
|
||||
|
||||
- `safe-read-only`: показати інструмент консультації та обмежити звичайного агента
|
||||
інструментами `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і
|
||||
`memory_get`.
|
||||
- `owner`: показати інструмент консультації та дозволити звичайному агенту використовувати
|
||||
звичайну політику інструментів агента.
|
||||
- `none`: не показувати інструмент консультації моделі голосу реального часу.
|
||||
- `safe-read-only`: показувати інструмент консультації та обмежувати звичайного агента інструментами `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`.
|
||||
- `owner`: показувати інструмент консультації й дозволяти звичайному агенту використовувати нормальну політику інструментів агента.
|
||||
- `none`: не показувати інструмент консультації моделі голосу режиму реального часу.
|
||||
|
||||
Ключ сеансу консультації має область дії в межах одного сеансу Meet, тому
|
||||
наступні виклики консультації можуть повторно використовувати попередній контекст
|
||||
консультації під час тієї самої зустрічі.
|
||||
Ключ сесії консультації має область дії в межах кожної сесії Meet, тож подальші виклики консультації можуть повторно використовувати попередній контекст консультації під час тієї самої зустрічі.
|
||||
|
||||
Щоб примусово виконати усну перевірку готовності після того, як Chrome повністю приєднався до виклику:
|
||||
|
||||
@ -575,7 +564,7 @@ VM. В обох випадках модель реального часу та `
|
||||
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."
|
||||
```
|
||||
|
||||
Для повного smoke-тесту join-and-speak:
|
||||
Для повного smoke-тесту приєднання й мовлення:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
|
||||
@ -585,7 +574,7 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
|
||||
|
||||
## Контрольний список live-тесту
|
||||
|
||||
Використовуйте цю послідовність перед передачею зустрічі агенту без нагляду:
|
||||
Використовуйте цю послідовність перед передаванням зустрічі агенту без нагляду:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet setup
|
||||
@ -598,12 +587,11 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
|
||||
Очікуваний стан Chrome-node:
|
||||
|
||||
- `googlemeet setup` повністю зелений.
|
||||
- `nodes status` показує, що вибраний вузол підключений.
|
||||
- Вибраний вузол рекламує і `googlemeet.chrome`, і `browser.proxy`.
|
||||
- Вкладка Meet приєднується до виклику, а `test-speech` повертає стан Chrome з
|
||||
`inCall: true`.
|
||||
- `nodes status` показує, що вибраний Node підключено.
|
||||
- Вибраний Node оголошує і `googlemeet.chrome`, і `browser.proxy`.
|
||||
- Вкладка Meet приєднується до виклику, а `test-speech` повертає стан Chrome з `inCall: true`.
|
||||
|
||||
Для smoke-тесту Twilio використовуйте зустріч, яка показує деталі телефонного дозвону:
|
||||
Для smoke-тесту Twilio використовуйте зустріч, яка показує дані для телефонного підключення:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet setup
|
||||
@ -615,17 +603,16 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
|
||||
Очікуваний стан Twilio:
|
||||
|
||||
- `googlemeet setup` включає зелені перевірки `twilio-voice-call-plugin` і
|
||||
`twilio-voice-call-credentials`.
|
||||
- `googlemeet setup` містить зелені перевірки `twilio-voice-call-plugin` і `twilio-voice-call-credentials`.
|
||||
- `voicecall` доступний у CLI після перезавантаження Gateway.
|
||||
- Повернений сеанс має `transport: "twilio"` і `twilio.voiceCallId`.
|
||||
- Повернена сесія має `transport: "twilio"` і `twilio.voiceCallId`.
|
||||
- `googlemeet leave <sessionId>` завершує делегований голосовий виклик.
|
||||
|
||||
## Усунення несправностей
|
||||
|
||||
### Агент не бачить інструмент Google Meet
|
||||
|
||||
Підтвердьте, що плагін увімкнено в конфігурації Gateway, і перезавантажте Gateway:
|
||||
Підтвердьте, що Plugin увімкнено в конфігурації Gateway, і перезавантажте Gateway:
|
||||
|
||||
```bash
|
||||
openclaw plugins list | grep google-meet
|
||||
@ -633,11 +620,11 @@ openclaw googlemeet setup
|
||||
```
|
||||
|
||||
Якщо ви щойно відредагували `plugins.entries.google-meet`, перезапустіть або перезавантажте Gateway.
|
||||
Запущений агент бачить лише інструменти плагінів, зареєстровані поточним процесом Gateway.
|
||||
Запущений агент бачить лише інструменти Plugin, зареєстровані поточним процесом Gateway.
|
||||
|
||||
### Немає підключеного вузла з підтримкою Google Meet
|
||||
### Немає підключеного Node з підтримкою Google Meet
|
||||
|
||||
На хості вузла виконайте:
|
||||
На хості Node виконайте:
|
||||
|
||||
```bash
|
||||
openclaw plugins enable google-meet
|
||||
@ -646,7 +633,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
|
||||
```
|
||||
|
||||
На хості Gateway підтвердьте вузол і перевірте команди:
|
||||
На хості Gateway схваліть Node і перевірте команди:
|
||||
|
||||
```bash
|
||||
openclaw devices list
|
||||
@ -654,8 +641,8 @@ openclaw devices approve <requestId>
|
||||
openclaw nodes status
|
||||
```
|
||||
|
||||
Вузол має бути підключений і перелічувати `googlemeet.chrome` та `browser.proxy`.
|
||||
Конфігурація Gateway має дозволяти ці команди вузла:
|
||||
Node має бути підключеним і містити `googlemeet.chrome` та `browser.proxy`.
|
||||
Конфігурація Gateway має дозволяти ці команди Node:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -669,58 +656,48 @@ openclaw nodes status
|
||||
|
||||
### Браузер відкривається, але агент не може приєднатися
|
||||
|
||||
Запустіть `googlemeet test-speech` і перевірте повернений стан Chrome. Якщо він
|
||||
повідомляє `manualActionRequired: true`, покажіть `manualActionMessage` оператору
|
||||
та припиніть повторні спроби, доки дію в браузері не буде завершено.
|
||||
Запустіть `googlemeet test-speech` і перевірте повернутий стан Chrome. Якщо він повідомляє `manualActionRequired: true`, покажіть `manualActionMessage` оператору й припиніть повторні спроби, доки не буде завершено дію в браузері.
|
||||
|
||||
Поширені ручні дії:
|
||||
|
||||
- Увійти в профіль Chrome.
|
||||
- Допустити гостя з облікового запису хоста Meet.
|
||||
- Надати Chrome дозволи на мікрофон/камеру.
|
||||
- Закрити або виправити завислий діалог дозволів Meet.
|
||||
- Увійдіть у профіль Chrome.
|
||||
- Допустіть гостя з облікового запису організатора Meet.
|
||||
- Надайте Chrome дозволи на мікрофон/камеру.
|
||||
- Закрийте або виправте зависле діалогове вікно дозволів Meet.
|
||||
|
||||
### Не вдається створити зустріч
|
||||
|
||||
`googlemeet create` використовує endpoint `spaces.create` API Google Meet. Підтвердьте:
|
||||
`googlemeet create` спочатку використовує endpoint `spaces.create` API Google Meet, коли налаштовано облікові дані OAuth. Без облікових даних OAuth він переходить до резервного варіанта через браузер закріпленого Chrome Node. Переконайтеся в такому:
|
||||
|
||||
- налаштовано `oauth.clientId` і `oauth.refreshToken`, або наявні відповідні
|
||||
змінні середовища `OPENCLAW_GOOGLE_MEET_*`.
|
||||
- refresh token було створено після додавання підтримки create. Старі токени можуть
|
||||
не мати області доступу `meetings.space.created`; повторно виконайте
|
||||
`openclaw googlemeet auth login --json` і оновіть конфігурацію плагіна.
|
||||
- Google Cloud project і OAuth principal мають право використовувати потрібні
|
||||
області доступу API Google Meet.
|
||||
- Для створення через API: налаштовано `oauth.clientId` і `oauth.refreshToken`, або присутні відповідні змінні середовища `OPENCLAW_GOOGLE_MEET_*`.
|
||||
- Для створення через API: токен оновлення було видано після додавання підтримки створення. Старіші токени можуть не містити область дії `meetings.space.created`; повторно виконайте `openclaw googlemeet auth login --json` і оновіть конфігурацію Plugin.
|
||||
- Для резервного варіанта через браузер: `defaultTransport: "chrome-node"` і `chromeNode.node` вказують на підключений Node з `browser.proxy` і `googlemeet.chrome`.
|
||||
- Для резервного варіанта через браузер: профіль OpenClaw Chrome на цьому Node має виконаний вхід у Google і може відкрити `https://meet.google.com/new`.
|
||||
|
||||
### Агент приєднується, але не говорить
|
||||
|
||||
Перевірте шлях realtime:
|
||||
Перевірте шлях режиму реального часу:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet setup
|
||||
openclaw googlemeet status
|
||||
```
|
||||
|
||||
Використовуйте `mode: "realtime"` для прослуховування/відповіді голосом. `mode: "transcribe"` навмисно
|
||||
не запускає двобічний голосовий міст реального часу.
|
||||
Використовуйте `mode: "realtime"` для прослуховування/зворотного мовлення. `mode: "transcribe"` навмисно не запускає міст дуплексного голосу режиму реального часу.
|
||||
|
||||
Також перевірте:
|
||||
|
||||
- На хості Gateway доступний ключ постачальника режиму реального часу, наприклад
|
||||
`OPENAI_API_KEY` або `GEMINI_API_KEY`.
|
||||
- На хості Gateway доступний ключ провайдера режиму реального часу, наприклад `OPENAI_API_KEY` або `GEMINI_API_KEY`.
|
||||
- `BlackHole 2ch` видимий на хості Chrome.
|
||||
- `rec` і `play` існують на хості Chrome.
|
||||
- Мікрофон і динамік Meet маршрутизовано через віртуальний аудіошлях, який використовує
|
||||
OpenClaw.
|
||||
- Мікрофон і динамік Meet спрямовано через шлях віртуального аудіо, який використовує OpenClaw.
|
||||
|
||||
### Не проходять перевірки налаштування Twilio
|
||||
|
||||
`twilio-voice-call-plugin` завершується помилкою, коли `voice-call` не дозволено або не ввімкнено.
|
||||
Додайте його до `plugins.allow`, увімкніть `plugins.entries.voice-call` і перезавантажте
|
||||
Gateway.
|
||||
`twilio-voice-call-plugin` не проходить, коли `voice-call` не дозволено або не ввімкнено.
|
||||
Додайте його до `plugins.allow`, увімкніть `plugins.entries.voice-call` і перезавантажте Gateway.
|
||||
|
||||
`twilio-voice-call-credentials` завершується помилкою, коли в бекенді Twilio бракує account
|
||||
SID, auth token або номера абонента. Установіть це на хості Gateway:
|
||||
`twilio-voice-call-credentials` не проходить, коли в бекенді Twilio відсутні account SID, auth token або номер абонента. Установіть це на хості Gateway:
|
||||
|
||||
```bash
|
||||
export TWILIO_ACCOUNT_SID=AC...
|
||||
@ -736,8 +713,7 @@ openclaw googlemeet setup
|
||||
|
||||
### Виклик Twilio починається, але ніколи не входить у зустріч
|
||||
|
||||
Підтвердьте, що подія Meet містить деталі телефонного дозвону. Передайте точний номер
|
||||
для дозвону та PIN або власну послідовність DTMF:
|
||||
Підтвердьте, що подія Meet показує дані для телефонного підключення. Передайте точний номер для дозвону та PIN або спеціальну послідовність DTMF:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
@ -746,34 +722,25 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
--dtmf-sequence ww123456#
|
||||
```
|
||||
|
||||
Використовуйте початковий `w` або коми в `--dtmf-sequence`, якщо постачальнику потрібна пауза
|
||||
перед введенням PIN.
|
||||
Використовуйте початковий `w` або коми в `--dtmf-sequence`, якщо провайдеру потрібна пауза перед введенням PIN.
|
||||
|
||||
## Примітки
|
||||
|
||||
Офіційний media API Google Meet орієнтований на отримання, тому для мовлення у виклику Meet
|
||||
усе одно потрібен шлях учасника. Цей плагін робить цю межу видимою:
|
||||
Chrome відповідає за участь через браузер і локальну маршрутизацію аудіо; Twilio відповідає за
|
||||
участь через телефонний дозвін.
|
||||
Офіційний медіа-API Google Meet орієнтований на отримання, тому для мовлення у виклику Meet усе ще потрібен шлях учасника. Цей Plugin зберігає цю межу видимою:
|
||||
Chrome обробляє участь через браузер і локальну маршрутизацію аудіо; Twilio обробляє участь через телефонний дозвін.
|
||||
|
||||
Режиму Chrome realtime потрібне одне з такого:
|
||||
Режим Chrome у режимі реального часу потребує одного з такого:
|
||||
|
||||
- `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw керує
|
||||
мостом моделі реального часу та передає аудіо G.711 mu-law 8 кГц між цими
|
||||
командами й вибраним постачальником голосу реального часу.
|
||||
- `chrome.audioBridgeCommand`: зовнішня команда мосту керує всім локальним
|
||||
аудіошляхом і має завершитися після запуску або перевірки свого демона.
|
||||
- `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw керує мостом моделі режиму реального часу та передає аудіо G.711 mu-law 8 кГц між цими командами та вибраним провайдером голосу режиму реального часу.
|
||||
- `chrome.audioBridgeCommand`: зовнішня команда моста керує всім локальним аудіошляхом і має завершитися після запуску або перевірки свого daemon.
|
||||
|
||||
Для чистого двобічного аудіо маршрутизуйте вихід Meet і мікрофон Meet через окремі
|
||||
віртуальні пристрої або граф віртуальних пристроїв у стилі Loopback. Один спільний
|
||||
пристрій BlackHole може повертати в дзвінок відлуння інших учасників.
|
||||
Для чистого дуплексного аудіо маршрутизуйте вихід Meet і мікрофон Meet через окремі віртуальні пристрої або граф віртуальних пристроїв на кшталт Loopback. Один спільний пристрій BlackHole може повертати голоси інших учасників назад у виклик.
|
||||
|
||||
`googlemeet speak` запускає активний аудіоміст реального часу для сеансу
|
||||
Chrome. `googlemeet leave` зупиняє цей міст. Для сеансів Twilio, делегованих
|
||||
через плагін Voice Call, `leave` також завершує базовий голосовий виклик.
|
||||
`googlemeet speak` запускає активний аудіоміст режиму реального часу для сесії Chrome.
|
||||
`googlemeet leave` зупиняє цей міст. Для сесій Twilio, делегованих через Plugin Voice Call, `leave` також завершує базовий голосовий виклик.
|
||||
|
||||
## Пов’язане
|
||||
|
||||
- [Плагін Voice Call](/uk/plugins/voice-call)
|
||||
- [Режим розмови](/uk/nodes/talk)
|
||||
- [Створення плагінів](/uk/plugins/building-plugins)
|
||||
- [Plugin Voice Call](/uk/plugins/voice-call)
|
||||
- [Режим talk](/uk/nodes/talk)
|
||||
- [Створення Plugin](/uk/plugins/building-plugins)
|
||||
|
||||
@ -2,41 +2,41 @@
|
||||
read_when:
|
||||
- Ви хочете здійснити вихідний голосовий дзвінок з OpenClaw
|
||||
- Ви налаштовуєте або розробляєте плагін voice-call
|
||||
summary: 'Плагін Voice Call: вихідні + вхідні дзвінки через Twilio/Telnyx/Plivo (встановлення плагіна + конфігурація + CLI)'
|
||||
summary: 'Плагін Voice Call: вихідні + вхідні дзвінки через Twilio/Telnyx/Plivo (встановлення Plugin + конфігурація + CLI)'
|
||||
title: Плагін Voice call
|
||||
x-i18n:
|
||||
generated_at: "2026-04-24T09:19:22Z"
|
||||
generated_at: "2026-04-24T21:43:34Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 6aed4e33ce090c86f43c71280f033e446f335c53d42456fdc93c9938250e9af6
|
||||
source_hash: a6d03153cf6ba1b4cd7cf2e4c0ffcdf96595363473b172b2d4b21b4100c20e3c
|
||||
source_path: plugins/voice-call.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Voice Call (плагін)
|
||||
|
||||
Голосові дзвінки для OpenClaw через плагін. Підтримує вихідні сповіщення та
|
||||
багатоходові розмови з політиками для вхідних викликів.
|
||||
Голосові дзвінки для OpenClaw через Plugin. Підтримує вихідні сповіщення та
|
||||
багатокрокові розмови з вхідними політиками.
|
||||
|
||||
Поточні провайдери:
|
||||
|
||||
- `twilio` (Programmable Voice + Media Streams)
|
||||
- `telnyx` (Call Control v2)
|
||||
- `plivo` (Voice API + XML transfer + GetInput speech)
|
||||
- `mock` (dev/без мережі)
|
||||
- `mock` (розробка/без мережі)
|
||||
|
||||
Коротка ментальна модель:
|
||||
Швидка ментальна модель:
|
||||
|
||||
- Встановіть плагін
|
||||
- Встановіть Plugin
|
||||
- Перезапустіть Gateway
|
||||
- Налаштуйте в `plugins.entries.voice-call.config`
|
||||
- Використовуйте `openclaw voicecall ...` або інструмент `voice_call`
|
||||
|
||||
## Де це працює (локально чи віддалено)
|
||||
|
||||
Плагін Voice Call працює **всередині процесу Gateway**.
|
||||
Plugin Voice Call працює **всередині процесу Gateway**.
|
||||
|
||||
Якщо ви використовуєте віддалений Gateway, встановіть/налаштуйте плагін на **машині, де запущено Gateway**, а потім перезапустіть Gateway, щоб завантажити його.
|
||||
Якщо ви використовуєте віддалений Gateway, встановіть/налаштуйте Plugin на **машині, де запущено Gateway**, а потім перезапустіть Gateway, щоб він його завантажив.
|
||||
|
||||
## Встановлення
|
||||
|
||||
@ -48,7 +48,7 @@ openclaw plugins install @openclaw/voice-call
|
||||
|
||||
Після цього перезапустіть Gateway.
|
||||
|
||||
### Варіант B: встановлення з локальної папки (dev, без копіювання)
|
||||
### Варіант B: встановлення з локальної папки (розробка, без копіювання)
|
||||
|
||||
```bash
|
||||
PLUGIN_SRC=./path/to/local/voice-call-plugin
|
||||
@ -81,7 +81,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
telnyx: {
|
||||
apiKey: "...",
|
||||
connectionId: "...",
|
||||
// Публічний ключ Webhook Telnyx з Telnyx Mission Control Portal
|
||||
// Публічний ключ webhook Telnyx з Telnyx Mission Control Portal
|
||||
// (рядок Base64; також можна задати через TELNYX_PUBLIC_KEY).
|
||||
publicKey: "...",
|
||||
},
|
||||
@ -103,7 +103,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
trustedProxyIPs: ["100.64.0.1"],
|
||||
},
|
||||
|
||||
// Публічна експозиція (виберіть один варіант)
|
||||
// Публічне відкриття доступу (оберіть один варіант)
|
||||
// publicUrl: "https://example.ngrok.app/voice/webhook",
|
||||
// tunnel: { provider: "ngrok" },
|
||||
// tailscale: { mode: "funnel", path: "/voice/webhook" }
|
||||
@ -114,7 +114,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
streaming: {
|
||||
enabled: true,
|
||||
provider: "openai", // необов’язково; якщо не вказано, використовується перший зареєстрований провайдер транскрипції в реальному часі
|
||||
provider: "openai", // необов’язково; якщо не задано — перший зареєстрований провайдер транскрипції в реальному часі
|
||||
streamPath: "/voice/stream",
|
||||
providers: {
|
||||
openai: {
|
||||
@ -132,7 +132,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
realtime: {
|
||||
enabled: false,
|
||||
provider: "google", // необов’язково; якщо не вказано, використовується перший зареєстрований голосовий провайдер у реальному часі
|
||||
provider: "google", // необов’язково; якщо не задано — перший зареєстрований голосовий провайдер у реальному часі
|
||||
providers: {
|
||||
google: {
|
||||
model: "gemini-2.5-flash-native-audio-preview-12-2025",
|
||||
@ -149,26 +149,26 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
Примітки:
|
||||
|
||||
- Twilio/Telnyx вимагають **публічно доступний** URL Webhook.
|
||||
- Plivo вимагає **публічно доступний** URL Webhook.
|
||||
- `mock` — це локальний dev-провайдер (без мережевих викликів).
|
||||
- Якщо старі конфігурації досі використовують `provider: "log"`, `twilio.from` або застарілі ключі `streaming.*` для OpenAI, виконайте `openclaw doctor --fix`, щоб переписати їх.
|
||||
- Для Telnyx потрібен `telnyx.publicKey` (або `TELNYX_PUBLIC_KEY`), якщо тільки `skipSignatureVerification` не має значення true.
|
||||
- `skipSignatureVerification` призначений лише для локального тестування.
|
||||
- Якщо ви використовуєте безкоштовний рівень ngrok, задайте `publicUrl` як точний URL ngrok; перевірка підпису завжди примусово увімкнена.
|
||||
- `tunnel.allowNgrokFreeTierLoopbackBypass: true` дозволяє Webhook-и Twilio з невалідними підписами **лише** коли `tunnel.provider="ngrok"` і `serve.bind` є loopback (локальний агент ngrok). Використовуйте лише для локальної розробки.
|
||||
- URL-адреси безкоштовного рівня Ngrok можуть змінюватися або додавати проміжну поведінку; якщо `publicUrl` зміниться, підписи Twilio не пройдуть перевірку. Для production віддавайте перевагу стабільному домену або Tailscale funnel.
|
||||
- `realtime.enabled` запускає повноцінні голосові розмови голос-до-голосу; не вмикайте його разом із `streaming.enabled`.
|
||||
- Типові параметри безпеки streaming:
|
||||
- `streaming.preStartTimeoutMs` закриває сокети, які так і не надсилають валідний кадр `start`.
|
||||
- Twilio/Telnyx потребують **публічно доступного** URL Webhook.
|
||||
- Plivo потребує **публічно доступного** URL Webhook.
|
||||
- `mock` — це локальний провайдер для розробки (без мережевих викликів).
|
||||
- Якщо в старіших конфігураціях усе ще використовується `provider: "log"`, `twilio.from` або застарілі ключі OpenAI `streaming.*`, виконайте `openclaw doctor --fix`, щоб переписати їх.
|
||||
- Telnyx потребує `telnyx.publicKey` (або `TELNYX_PUBLIC_KEY`), якщо тільки `skipSignatureVerification` не має значення true.
|
||||
- `skipSignatureVerification` — лише для локального тестування.
|
||||
- Якщо ви використовуєте безкоштовний рівень ngrok, задайте `publicUrl` точно як URL ngrok; перевірка підпису завжди примусово увімкнена.
|
||||
- `tunnel.allowNgrokFreeTierLoopbackBypass: true` дозволяє webhook-и Twilio з недійсними підписами **лише** коли `tunnel.provider="ngrok"` і `serve.bind` — це local loopback (локальний агент ngrok). Використовуйте лише для локальної розробки.
|
||||
- URL-адреси ngrok на безкоштовному рівні можуть змінюватися або додавати проміжну поведінку; якщо `publicUrl` зміниться, підписи Twilio не проходитимуть перевірку. Для продакшну надавайте перевагу стабільному домену або Tailscale funnel.
|
||||
- `realtime.enabled` запускає повноцінні голосові розмови voice-to-voice; не вмикайте його разом із `streaming.enabled`.
|
||||
- Типові налаштування безпеки для streaming:
|
||||
- `streaming.preStartTimeoutMs` закриває сокети, які так і не надсилають коректний кадр `start`.
|
||||
- `streaming.maxPendingConnections` обмежує загальну кількість неавтентифікованих сокетів до старту.
|
||||
- `streaming.maxPendingConnectionsPerIp` обмежує кількість неавтентифікованих сокетів до старту з однієї IP-адреси джерела.
|
||||
- `streaming.maxConnections` обмежує загальну кількість відкритих сокетів медіапотоку (очікувальні + активні).
|
||||
- Під час виконання fallback наразі все ще приймає ці старі ключі voice-call, але шлях переписування — це `openclaw doctor --fix`, а шар сумісності є тимчасовим.
|
||||
- `streaming.maxPendingConnectionsPerIp` обмежує кількість неавтентифікованих сокетів до старту для кожної вихідної IP-адреси.
|
||||
- `streaming.maxConnections` обмежує загальну кількість відкритих сокетів медіапотоку (очікування + активні).
|
||||
- На рівні виконання резервна сумісність поки що все ще приймає ці старі ключі voice-call, але шлях переписування — це `openclaw doctor --fix`, а шар сумісності є тимчасовим.
|
||||
|
||||
## Голосові розмови в реальному часі
|
||||
|
||||
`realtime` вибирає повнодуплексного голосового провайдера в реальному часі для аудіо живого дзвінка.
|
||||
`realtime` вибирає повнодуплексного голосового провайдера реального часу для аудіо дзвінка вживу.
|
||||
Він відокремлений від `streaming`, який лише пересилає аудіо провайдерам
|
||||
транскрипції в реальному часі.
|
||||
|
||||
@ -176,18 +176,18 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
- `realtime.enabled` підтримується для Twilio Media Streams.
|
||||
- `realtime.enabled` не можна поєднувати з `streaming.enabled`.
|
||||
- `realtime.provider` є необов’язковим. Якщо не вказано, Voice Call використовує першого
|
||||
зареєстрованого голосового провайдера в реальному часі.
|
||||
- Вбудовані голосові провайдери в реальному часі включають Google Gemini Live (`google`) та
|
||||
OpenAI (`openai`), зареєстровані їхніми плагінами провайдерів.
|
||||
- Сирий конфіг, що належить провайдеру, розташовано в `realtime.providers.<providerId>`.
|
||||
- Якщо `realtime.provider` вказує на незареєстрованого провайдера або якщо жодного голосового
|
||||
провайдера в реальному часі взагалі не зареєстровано, Voice Call записує попередження в лог і пропускає
|
||||
медіа в реальному часі замість того, щоб ламати весь плагін.
|
||||
- `realtime.provider` — необов’язковий. Якщо не задано, Voice Call використовує першого
|
||||
зареєстрованого голосового провайдера реального часу.
|
||||
- Вбудовані голосові провайдери реального часу включають Google Gemini Live (`google`) і
|
||||
OpenAI (`openai`), зареєстровані їхніми Plugin провайдерів.
|
||||
- Власна сира конфігурація провайдера розміщується в `realtime.providers.<providerId>`.
|
||||
- Якщо `realtime.provider` вказує на незареєстрованого провайдера або взагалі не зареєстровано
|
||||
жодного голосового провайдера реального часу, Voice Call записує попередження в журнал і пропускає
|
||||
медіа реального часу замість того, щоб зламати весь Plugin.
|
||||
|
||||
Типові значення Google Gemini Live realtime:
|
||||
Типові значення для realtime Google Gemini Live:
|
||||
|
||||
- API key: `realtime.providers.google.apiKey`, `GEMINI_API_KEY` або
|
||||
- API-ключ: `realtime.providers.google.apiKey`, `GEMINI_API_KEY` або
|
||||
`GOOGLE_GENERATIVE_AI_API_KEY`
|
||||
- model: `gemini-2.5-flash-native-audio-preview-12-2025`
|
||||
- voice: `Kore`
|
||||
@ -206,7 +206,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
realtime: {
|
||||
enabled: true,
|
||||
provider: "google",
|
||||
instructions: "Говоріть коротко й запитуйте перед використанням інструментів.",
|
||||
instructions: "Говоріть коротко і питайте перед використанням інструментів.",
|
||||
providers: {
|
||||
google: {
|
||||
apiKey: "${GEMINI_API_KEY}",
|
||||
@ -222,7 +222,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
}
|
||||
```
|
||||
|
||||
Використовуйте OpenAI натомість:
|
||||
Натомість використайте OpenAI:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -246,35 +246,35 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
}
|
||||
```
|
||||
|
||||
Див. [провайдер Google](/uk/providers/google) і [провайдер OpenAI](/uk/providers/openai)
|
||||
для параметрів голосу в реальному часі, специфічних для провайдера.
|
||||
Див. [Google provider](/uk/providers/google) і [OpenAI provider](/uk/providers/openai)
|
||||
для специфічних для провайдерів параметрів голосу в реальному часі.
|
||||
|
||||
## Streaming транскрипції
|
||||
## Транскрипція потокового аудіо
|
||||
|
||||
`streaming` вибирає провайдера транскрипції в реальному часі для аудіо живого дзвінка.
|
||||
`streaming` вибирає провайдера транскрипції в реальному часі для аудіо дзвінка вживу.
|
||||
|
||||
Поточна поведінка під час виконання:
|
||||
|
||||
- `streaming.provider` є необов’язковим. Якщо не вказано, Voice Call використовує першого
|
||||
- `streaming.provider` — необов’язковий. Якщо не задано, Voice Call використовує першого
|
||||
зареєстрованого провайдера транскрипції в реальному часі.
|
||||
- Вбудовані провайдери транскрипції в реальному часі включають Deepgram (`deepgram`),
|
||||
ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) і xAI
|
||||
(`xai`), зареєстровані їхніми плагінами провайдерів.
|
||||
- Сирий конфіг, що належить провайдеру, розташовано в `streaming.providers.<providerId>`.
|
||||
- Якщо `streaming.provider` вказує на незареєстрованого провайдера або якщо жодного провайдера
|
||||
транскрипції в реальному часі взагалі не зареєстровано, Voice Call записує попередження в лог і
|
||||
пропускає streaming медіа замість того, щоб ламати весь плагін.
|
||||
(`xai`), зареєстровані їхніми Plugin провайдерів.
|
||||
- Власна сира конфігурація провайдера розміщується в `streaming.providers.<providerId>`.
|
||||
- Якщо `streaming.provider` вказує на незареєстрованого провайдера або якщо взагалі не зареєстровано
|
||||
жодного провайдера транскрипції в реальному часі, Voice Call записує попередження в журнал і
|
||||
пропускає потокову передачу медіа замість того, щоб зламати весь Plugin.
|
||||
|
||||
Типові значення транскрипції streaming OpenAI:
|
||||
Типові значення для потокової транскрипції OpenAI:
|
||||
|
||||
- API key: `streaming.providers.openai.apiKey` або `OPENAI_API_KEY`
|
||||
- API-ключ: `streaming.providers.openai.apiKey` або `OPENAI_API_KEY`
|
||||
- model: `gpt-4o-transcribe`
|
||||
- `silenceDurationMs`: `800`
|
||||
- `vadThreshold`: `0.5`
|
||||
|
||||
Типові значення транскрипції streaming xAI:
|
||||
Типові значення для потокової транскрипції xAI:
|
||||
|
||||
- API key: `streaming.providers.xai.apiKey` або `XAI_API_KEY`
|
||||
- API-ключ: `streaming.providers.xai.apiKey` або `XAI_API_KEY`
|
||||
- endpoint: `wss://api.x.ai/v1/stt`
|
||||
- `encoding`: `mulaw`
|
||||
- `sampleRate`: `8000`
|
||||
@ -309,7 +309,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
}
|
||||
```
|
||||
|
||||
Використовуйте xAI натомість:
|
||||
Натомість використайте xAI:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -344,17 +344,17 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
- `streaming.silenceDurationMs` → `streaming.providers.openai.silenceDurationMs`
|
||||
- `streaming.vadThreshold` → `streaming.providers.openai.vadThreshold`
|
||||
|
||||
## Очищувач застарілих викликів
|
||||
## Очищення застарілих дзвінків
|
||||
|
||||
Використовуйте `staleCallReaperSeconds`, щоб завершувати виклики, які ніколи не отримують фінального Webhook
|
||||
(наприклад, виклики в режимі notify, які ніколи не завершуються). Типове значення — `0`
|
||||
Використовуйте `staleCallReaperSeconds`, щоб завершувати дзвінки, які ніколи не отримують фінальний webhook
|
||||
(наприклад, дзвінки в режимі notify, які так і не завершуються). Типове значення — `0`
|
||||
(вимкнено).
|
||||
|
||||
Рекомендовані діапазони:
|
||||
|
||||
- **Production:** `120`–`300` секунд для потоків у стилі notify.
|
||||
- Тримайте це значення **вищим за `maxDurationSeconds`**, щоб звичайні виклики могли
|
||||
завершитися. Гарна стартова точка — `maxDurationSeconds + 30–60` секунд.
|
||||
- **Продакшн:** `120`–`300` секунд для сценаріїв у стилі notify.
|
||||
- Тримайте це значення **вищим за `maxDurationSeconds`**, щоб звичайні дзвінки могли
|
||||
завершитися. Хороша стартова точка — `maxDurationSeconds + 30–60` секунд.
|
||||
|
||||
Приклад:
|
||||
|
||||
@ -375,28 +375,28 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
## Безпека Webhook
|
||||
|
||||
Коли перед Gateway стоїть проксі або тунель, плагін реконструює
|
||||
публічний URL для перевірки підпису. Ці параметри керують тим, яким forwarded
|
||||
Коли перед Gateway знаходиться проксі або тунель, Plugin відновлює
|
||||
публічний URL для перевірки підпису. Ці параметри визначають, яким переспрямованим
|
||||
заголовкам довіряти.
|
||||
|
||||
`webhookSecurity.allowedHosts` задає allowlist хостів із forwarding-заголовків.
|
||||
`webhookSecurity.allowedHosts` задає список дозволених хостів із переспрямованих заголовків.
|
||||
|
||||
`webhookSecurity.trustForwardingHeaders` довіряє forwarded-заголовкам без allowlist.
|
||||
`webhookSecurity.trustForwardingHeaders` довіряє переспрямованим заголовкам без списку дозволених.
|
||||
|
||||
`webhookSecurity.trustedProxyIPs` довіряє forwarded-заголовкам лише тоді, коли
|
||||
`webhookSecurity.trustedProxyIPs` довіряє переспрямованим заголовкам лише тоді, коли
|
||||
віддалена IP-адреса запиту збігається зі списком.
|
||||
|
||||
Захист від повторного відтворення Webhook увімкнено для Twilio та Plivo. Повторно відтворені валідні запити Webhook
|
||||
підтверджуються, але пропускаються з погляду побічних ефектів.
|
||||
Захист від повторного відтворення webhook увімкнено для Twilio і Plivo. Повторно відтворені коректні webhook-
|
||||
запити підтверджуються, але їхні побічні ефекти пропускаються.
|
||||
|
||||
Ходи розмов Twilio включають токен на кожен хід у callback-ах `<Gather>`, тому
|
||||
застарілі/повторно відтворені callback-и мовлення не можуть задовольнити новіший очікуваний хід транскрипту.
|
||||
Кроки розмови Twilio включають токен для кожного кроку в зворотних викликах `<Gather>`, тому
|
||||
застарілі/повторно відтворені зворотні виклики мовлення не можуть задовольнити новіший очікуваний крок транскрипції.
|
||||
|
||||
Неавтентифіковані запити Webhook відхиляються до читання тіла, якщо відсутні
|
||||
Неавтентифіковані webhook-запити відхиляються ще до читання тіла, якщо відсутні
|
||||
обов’язкові заголовки підпису провайдера.
|
||||
|
||||
Webhook voice-call використовує спільний профіль тіла до автентифікації (64 KB / 5 секунд)
|
||||
плюс обмеження кількості одночасних запитів на IP до перевірки підпису.
|
||||
Webhook voice-call використовує спільний профіль тіла до автентифікації (64 КБ / 5 секунд)
|
||||
плюс обмеження кількості одночасних запитів на IP перед перевіркою підпису.
|
||||
|
||||
Приклад зі стабільним публічним хостом:
|
||||
|
||||
@ -419,9 +419,9 @@ Webhook voice-call використовує спільний профіль ті
|
||||
|
||||
## TTS для дзвінків
|
||||
|
||||
Voice Call використовує базову конфігурацію `messages.tts` для
|
||||
потокового мовлення під час дзвінків. Ви можете перевизначити її в конфігурації плагіна з
|
||||
**тією самою структурою** — вона deep-merge-иться з `messages.tts`.
|
||||
Voice Call використовує основну конфігурацію `messages.tts` для
|
||||
потокового мовлення в дзвінках. Ви можете перевизначити її в конфігурації Plugin з
|
||||
**тією самою структурою** — вона глибоко об’єднується з `messages.tts`.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -439,15 +439,15 @@ Voice Call використовує базову конфігурацію `messa
|
||||
|
||||
Примітки:
|
||||
|
||||
- Застарілі ключі `tts.<provider>` усередині конфігурації плагіна (`openai`, `elevenlabs`, `microsoft`, `edge`) автоматично мігруються до `tts.providers.<provider>` під час завантаження. У збереженій конфігурації віддавайте перевагу формі `providers`.
|
||||
- **Microsoft speech ігнорується для голосових дзвінків** (телефонному аудіо потрібен PCM; поточний транспорт Microsoft не надає вихід PCM для телефонії).
|
||||
- Базовий TTS використовується, коли ввімкнено потокове медіа Twilio; інакше дзвінки переходять до вбудованих голосів провайдера.
|
||||
- Якщо медіапотік Twilio вже активний, Voice Call не переходить на TwiML `<Say>`. Якщо TTS для телефонії в такому стані недоступний, запит на відтворення завершується помилкою замість змішування двох шляхів відтворення.
|
||||
- Коли TTS для телефонії переходить на вторинного провайдера, Voice Call записує попередження в лог із ланцюжком провайдерів (`from`, `to`, `attempts`) для налагодження.
|
||||
- Застарілі ключі `tts.<provider>` у конфігурації Plugin (`openai`, `elevenlabs`, `microsoft`, `edge`) автоматично мігруються до `tts.providers.<provider>` під час завантаження. У збереженій конфігурації надавайте перевагу структурі `providers`.
|
||||
- **Microsoft speech ігнорується для голосових дзвінків** (телефонне аудіо потребує PCM; поточний транспорт Microsoft не надає телефонний вихід PCM).
|
||||
- Основний TTS використовується, коли увімкнено потокову передачу медіа Twilio; інакше дзвінки повертаються до нативних голосів провайдера.
|
||||
- Якщо медіапотік Twilio уже активний, Voice Call не повертається до TwiML `<Say>`. Якщо телефонний TTS недоступний у цьому стані, запит на відтворення завершується помилкою замість змішування двох шляхів відтворення.
|
||||
- Коли телефонний TTS повертається до вторинного провайдера, Voice Call записує попередження в журнал із ланцюгом провайдерів (`from`, `to`, `attempts`) для налагодження.
|
||||
|
||||
### Більше прикладів
|
||||
|
||||
Використовувати лише базовий TTS (без перевизначення):
|
||||
Використовувати лише основний TTS (без перевизначення):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -462,7 +462,7 @@ Voice Call використовує базову конфігурацію `messa
|
||||
}
|
||||
```
|
||||
|
||||
Перевизначити на ElevenLabs лише для дзвінків (залишити базове значення в інших місцях):
|
||||
Перевизначити на ElevenLabs лише для дзвінків (зберегти основне значення за замовчуванням в інших місцях):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -487,7 +487,7 @@ Voice Call використовує базову конфігурацію `messa
|
||||
}
|
||||
```
|
||||
|
||||
Перевизначити лише модель OpenAI для дзвінків (приклад deep-merge):
|
||||
Перевизначити лише модель OpenAI для дзвінків (приклад глибокого об’єднання):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -512,7 +512,7 @@ Voice Call використовує базову конфігурацію `messa
|
||||
|
||||
## Вхідні дзвінки
|
||||
|
||||
Типове значення політики вхідних дзвінків — `disabled`. Щоб увімкнути вхідні дзвінки, задайте:
|
||||
Політика вхідних дзвінків за замовчуванням має значення `disabled`. Щоб увімкнути вхідні дзвінки, задайте:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -522,21 +522,21 @@ Voice Call використовує базову конфігурацію `messa
|
||||
}
|
||||
```
|
||||
|
||||
`inboundPolicy: "allowlist"` — це низькорівневий фільтр caller ID. Плагін
|
||||
нормалізує значення `From`, яке надає провайдер, і порівнює його з `allowFrom`.
|
||||
Перевірка Webhook автентифікує доставку від провайдера та цілісність payload, але
|
||||
`inboundPolicy: "allowlist"` — це низькорівнева перевірка caller ID. Plugin
|
||||
нормалізує надане провайдером значення `From` і порівнює його з `allowFrom`.
|
||||
Перевірка Webhook автентифікує доставку провайдером і цілісність payload, але
|
||||
не доводить право власності на номер абонента PSTN/VoIP. Сприймайте `allowFrom` як
|
||||
фільтрацію caller ID, а не як сильне підтвердження особи абонента.
|
||||
фільтрацію caller ID, а не як сильну ідентифікацію абонента.
|
||||
|
||||
Автовідповіді використовують систему агентів. Налаштовуйте через:
|
||||
Автовідповіді використовують систему агентів. Налаштовуйте за допомогою:
|
||||
|
||||
- `responseModel`
|
||||
- `responseSystemPrompt`
|
||||
- `responseTimeoutMs`
|
||||
|
||||
### Контракт озвученого виводу
|
||||
### Контракт голосового виводу
|
||||
|
||||
Для автовідповідей Voice Call додає до системного prompt суворий контракт озвученого виводу:
|
||||
Для автовідповідей Voice Call додає строгий контракт голосового виводу до системного промпту:
|
||||
|
||||
- `{"spoken":"..."}`
|
||||
|
||||
@ -544,24 +544,25 @@ Voice Call використовує базову конфігурацію `messa
|
||||
|
||||
- Ігнорує payload, позначені як reasoning/error content.
|
||||
- Розбирає прямий JSON, JSON у fenced-блоках або вбудовані ключі `"spoken"`.
|
||||
- Переходить до plain text і видаляє ймовірні вступні абзаци з плануванням/метаданими.
|
||||
- Повертається до звичайного тексту й прибирає ймовірні вступні абзаци з плануванням/метаданими.
|
||||
|
||||
Це дозволяє зосередити озвучення на тексті для абонента й уникнути потрапляння в аудіо тексту планування.
|
||||
Це допомагає зосередити голосове відтворення на тексті для абонента й уникнути потрапляння тексту планування в аудіо.
|
||||
|
||||
### Поведінка під час запуску розмови
|
||||
### Поведінка запуску розмови
|
||||
|
||||
Для вихідних дзвінків у режимі `conversation` обробка першого повідомлення пов’язана зі станом живого відтворення:
|
||||
Для вихідних дзвінків у режимі `conversation` обробка першого повідомлення прив’язана до стану відтворення в реальному часі:
|
||||
|
||||
- Очищення черги barge-in та автовідповідь пригнічуються лише тоді, коли початкове привітання активно озвучується.
|
||||
- Якщо початкове відтворення не вдається, дзвінок повертається до стану `listening`, а початкове повідомлення залишається в черзі для повторної спроби.
|
||||
- Початкове відтворення для потокового Twilio починається під час підключення потоку без додаткової затримки.
|
||||
- Очищення черги barge-in і автовідповідь пригнічуються лише поки активно відтворюється початкове привітання.
|
||||
- Якщо початкове відтворення не вдається, дзвінок повертається в `listening`, а початкове повідомлення залишається в черзі для повторної спроби.
|
||||
- Початкове відтворення для потокової передачі Twilio починається під час підключення потоку без додаткової затримки.
|
||||
- Голосові розмови в реальному часі використовують власний початковий хід realtime-потоку. Voice Call не надсилає застаріле оновлення TwiML `<Say>` для цього початкового повідомлення, тому вихідні сесії `<Connect><Stream>` залишаються підключеними.
|
||||
|
||||
### Пільговий період після відключення потоку Twilio
|
||||
### Пільговий інтервал при відключенні потоку Twilio
|
||||
|
||||
Коли медіапотік Twilio відключається, Voice Call чекає `2000ms` перед автоматичним завершенням дзвінка:
|
||||
Коли медіапотік Twilio відключається, Voice Call чекає `2000ms`, перш ніж автоматично завершити дзвінок:
|
||||
|
||||
- Якщо потік перепідключається протягом цього вікна, авто-завершення скасовується.
|
||||
- Якщо після завершення пільгового періоду потік не реєструється знову, дзвінок завершується, щоб запобігти завислим активним дзвінкам.
|
||||
- Якщо потік знову підключається протягом цього вікна, авто-завершення скасовується.
|
||||
- Якщо після завершення пільгового інтервалу потік не буде повторно зареєстрований, дзвінок завершується, щоб запобігти зависанню активних дзвінків.
|
||||
|
||||
## CLI
|
||||
|
||||
@ -574,14 +575,14 @@ openclaw voicecall dtmf --call-id <id> --digits "ww123456#"
|
||||
openclaw voicecall end --call-id <id>
|
||||
openclaw voicecall status --call-id <id>
|
||||
openclaw voicecall tail
|
||||
openclaw voicecall latency # підсумувати затримку ходів за логами
|
||||
openclaw voicecall latency # підсумувати затримку ходів із журналів
|
||||
openclaw voicecall expose --mode funnel
|
||||
```
|
||||
|
||||
`latency` читає `calls.jsonl` зі стандартного шляху сховища voice-call. Використовуйте
|
||||
`--file <path>`, щоб вказати інший лог, і `--last <n>`, щоб обмежити аналіз
|
||||
останніми N записами (типово 200). Вивід містить p50/p90/p99 для затримки ходу
|
||||
та часу очікування прослуховування.
|
||||
`latency` читає `calls.jsonl` зі стандартного шляху зберігання voice-call. Використовуйте
|
||||
`--file <path>`, щоб вказати інший журнал, і `--last <n>`, щоб обмежити аналіз
|
||||
останніми N записами (типово 200). Вивід включає p50/p90/p99 для
|
||||
затримки ходів і часу очікування прослуховування.
|
||||
|
||||
## Інструмент агента
|
||||
|
||||
@ -596,7 +597,7 @@ openclaw voicecall expose --mode funnel
|
||||
- `end_call` (callId)
|
||||
- `get_status` (callId)
|
||||
|
||||
Цей репозиторій містить відповідний документ Skills у `skills/voice-call/SKILL.md`.
|
||||
Цей репозиторій постачає відповідний документ Skills у `skills/voice-call/SKILL.md`.
|
||||
|
||||
## Gateway RPC
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user