chore(i18n): refresh zh-CN translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-25 03:18:09 +00:00
parent c9ac3e979a
commit af3ae33147
2 changed files with 209 additions and 234 deletions

View File

@ -1,36 +1,36 @@
---
read_when:
- 你想让一个 OpenClaw 智能体加入一个 Google Meet 通话
- 你想让一个 OpenClaw 智能体创建一个新的 Google Meet 通话
- 你希望一个 OpenClaw 智能体加入 Google Meet 通话
- 你希望一个 OpenClaw 智能体创建一个新的 Google Meet 通话
- 你正在将 Chrome、Chrome 节点或 Twilio 配置为 Google Meet 传输方式
summary: Google Meet 插件:通过 Chrome 或 Twilio 加入明确指定的 Meet URL并使用实时语音默认设置
title: Google Meet 插件
x-i18n:
generated_at: "2026-04-25T02:35:36Z"
generated_at: "2026-04-25T03:16:17Z"
model: gpt-5.4
provider: openai
source_hash: 5e8655573953d39792f705dffa692345b88edaa38275468601b304e042e17cdd
source_hash: 44f185428fb096ef42aa0ccb0058784d02f0f097fcd253abdbf9897f5f9b527d
source_path: plugins/google-meet.md
workflow: 15
---
OpenClaw 的 Google Meet 参与支持——该插件在设计上是显式的:
OpenClaw 的 Google Meet 参会支持——该插件在设计上就是显式的:
- 它只会加入一个明确指定的 `https://meet.google.com/...` URL。
- 它只会加入明确指定的 `https://meet.google.com/...` URL。
- 它可以通过 Google Meet API 创建一个新的 Meet 空间,然后加入返回的 URL。
- `realtime` 语音是默认模式。
- 当需要更深入的推理或工具时,实时语音可以回调完整的 OpenClaw 智能体。
- 智能体通过 `mode` 选择加入行为:使用 `realtime` 进行实时收听/回话,或使用 `transcribe` 在不启用实时语音桥接的情况下加入/控制浏览器。
- 认证从个人 Google OAuth 或已登录的 Chrome 配置文件开始
- 不会自动播报同意声明
- 当需要更深入的推理或工具时,实时语音可以回调完整的 OpenClaw 智能体。
- 智能体通过 `mode` 选择加入行为:实时收听/回话使用 `realtime`,或使用 `transcribe` 在不启用实时语音桥接的情况下加入/控制浏览器。
- 认证起点可以是个人 Google OAuth或一个已经登录的 Chrome 配置文件
- 没有自动的同意告知播报
- 默认的 Chrome 音频后端是 `BlackHole 2ch`
- Chrome 可以在本地运行,也可以在已配对的节点主机上运行。
- Twilio 接受拨入号码,以及可选的 PIN 或 DTMF 序列。
- CLI 命令是 `googlemeet``meet` 保留用于更广义的智能体电话会议工作流。
- CLI 命令是 `googlemeet``meet` 保留更广义的智能体电话会议工作流。
## 快速开始
安装本地音频依赖并配置一个后端实时语音提供商。OpenAI 是默认选项Google Gemini Live 也可用,配合
安装本地音频依赖并配置一个后端实时语音提供商。OpenAI 是默认选项Google Gemini Live 也可用,配合
`realtime.provider: "google"`
```bash
@ -46,7 +46,7 @@ export GEMINI_API_KEY=...
sudo reboot
```
重启后,验证这两部分都已就绪:
重启后,验证这两部分是否就绪:
```bash
system_profiler SPAudioDataType | grep -i BlackHole
@ -74,9 +74,9 @@ command -v rec play
openclaw googlemeet setup
```
设置输出旨在让智能体可读。它会报告 Chrome 配置文件、音频桥接、节点固定、延迟的实时介绍,以及在配置了 Twilio 委托时,`voice-call` 插件和 Twilio 凭证是否就绪。
在要求智能体加入之前,将任何 `ok: false` 检查都视为阻塞项。
对于脚本或机器可读输出请使用 `openclaw googlemeet setup --json`
设置输出旨在让智能体可读。它会报告 Chrome 配置文件、音频桥接、节点固定、延迟的实时介绍,以及在配置了 Twilio 委派时,`voice-call` 插件和 Twilio 凭证是否已就绪。
在要求智能体加入之前,将任何 `ok: false` 检查都视为阻塞项。
脚本或机器可读输出请使用 `openclaw googlemeet setup --json`
加入会议:
@ -95,13 +95,13 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij
}
```
创建一个新会议并加入:
创建新会议并加入:
```bash
openclaw googlemeet create --transport chrome-node --mode realtime
```
创建 URL 而不加入:
创建 URL 而不加入:
```bash
openclaw googlemeet create --no-join
@ -109,17 +109,17 @@ openclaw googlemeet create --no-join
`googlemeet create` 有两条路径:
- API 创建:当配置 Google Meet OAuth 凭证时使用。这是最确定的路径,不依赖浏览器 UI 状态。
- API 创建:当配置 Google Meet OAuth 凭证时使用。这是最确定的路径,不依赖浏览器 UI 状态。
- 浏览器回退:当缺少 OAuth 凭证时使用。OpenClaw 会使用固定的 Chrome 节点,打开 `https://meet.google.com/new`,等待 Google 重定向到真实的会议代码 URL然后返回该 URL。此路径要求节点上的 OpenClaw Chrome 配置文件已经登录 Google。
浏览器自动化会处理 Meet 自的首次运行麦克风提示;该提示不会被视为 Google 登录失败。
加入和创建流程也会在打开新标签页之前尝试复用现有的 Meet 标签页。匹配会忽略像 `authuser` 这样的无害 URL 查询字符串,因此智能体重试时应聚焦已经打开的会议,而不是创建第二个 Chrome 标签页。
浏览器自动化会处理 Meet 自的首次运行麦克风提示;该提示不会被视为 Google 登录失败。
加入和创建流程也会优先复用已有的 Meet 标签页,而不是打开新标签页。匹配时会忽略无害的 URL 查询字符串,例如 `authuser`,因此智能体重试时应聚焦到已打开的会议,而不是创建第二个 Chrome 标签页。
命令/工具输出包含一个 `source` 字段(`api` 或 `browser`),这样智能体就可以说明使用了哪条路径。
`create` 默认会加入新会议,并返回 `joined: true` 以及加入会话。若想生成 URL请在 CLI 中使用
命令/工具输出包含一个 `source` 字段(`api` 或 `browser`),这样智能体就能解释使用的是哪条路径。
`create` 默认会加入新会议,并返回 `joined: true` 以及加入会话。若想生成 URL请在 CLI 中使用
`create --no-join`,或向工具传递 `"join": false`
或者告诉智能体:“创建一个 Google Meet用实时语音加入,然后把链接发给我。”
智能体应使用 `action: "create"` 调用 `google_meet`,然后分享返回的 `meetingUri`
或者告诉智能体:“创建一个 Google Meet用实时语音加入它,并把链接发给我。”
智能体应调用 `google_meet`,并使用 `action: "create"`,然后分享返回的 `meetingUri`
```json
{
@ -129,22 +129,21 @@ openclaw googlemeet create --no-join
}
```
对于仅观察/浏览器控制的加入,将 `"mode": "transcribe"`
这不会启动双工实时模型桥接,因此它不会在会议中进行回话。
若要进行仅观察/仅浏览器控制的加入,请设置 `"mode": "transcribe"`。这样不会启动双工实时模型桥接,因此它不会在会议中回话。
在实时会话期间,`google_meet` 状态包含浏览器和音频桥接健康信息,例如 `inCall`、`manualActionRequired`、`providerConnected`、
`realtimeReady`、`audioInputActive`、`audioOutputActive`、最近输入/输出时间戳、字节计数以及桥接关闭状态。
如果出现安全的 Meet 页面提示,浏览器自动化会在可能时处理它。登录、主持人准入以及浏览器/操作系统权限提示会作为手动操作报告,并附带原因和消息,供智能体转达。
在实时会话期间,`google_meet` 状态包含浏览器和音频桥接健康信息,例如 `inCall`、`manualActionRequired`、`providerConnected`、
`realtimeReady`、`audioInputActive`、`audioOutputActive`、最近输入/输出时间戳、字节计数以及桥接关闭状态。
如果出现安全的 Meet 页面提示,浏览器自动化会在可能时处理它。登录、主持人准入,以及浏览器/操作系统权限提示会被报告为需要手动操作,并附带原因和消息,供智能体转达。
Chrome 会以已登录的 Chrome 配置文件身份加入。在 Meet 中,选择 `BlackHole 2ch`为 OpenClaw 使用的麦克风/扬声器路径。
为了获得干净的双工音频,请使用独立的虚拟设备或类似 Loopback 的音频图;单个 BlackHole 设备足以完成第一次冒烟测试,但可能会产生回声。
Chrome 会以已登录的 Chrome 配置文件身份加入。在 Meet 中,为 OpenClaw 使用的麦克风/扬声器路径选择 `BlackHole 2ch`
若要获得干净的双工音频,请使用独立的虚拟设备或类似 Loopback 的音频图;单个 BlackHole 设备足以进行首次冒烟测试,但可能会产生回声。
### 本地 Gateway 网关 + Parallels Chrome
你**不**需要在 macOS VM 中运行完整的 OpenClaw Gateway 网关或配置模型 API 密钥,只是为了让 VM 承载 Chrome。
在本地运行 Gateway 网关和智能体,然后在 VM 中运行一个节点主机。在 VM 中启用一次内置插件,这样节点就会通告 Chrome 命令:
你**不需要**在 macOS VM 内部运行完整的 OpenClaw Gateway 网关或模型 API 密钥,只是为了让 VM 托管 Chrome。
在本地运行 Gateway 网关和智能体,然后在 VM 中运行一个节点主机。只需在 VM 中启用一次内置插件,这样节点就会广播 Chrome 命令:
部分的运行位置:
组件运行位置:
- Gateway 网关主机OpenClaw Gateway 网关、智能体工作区、模型/API 密钥、实时提供商,以及 Google Meet 插件配置。
- Parallels macOS VMOpenClaw CLI/节点主机、Google Chrome、SoX、BlackHole 2ch以及一个已登录 Google 的 Chrome 配置文件。
@ -169,7 +168,7 @@ system_profiler SPAudioDataType | grep -i BlackHole
command -v rec play
```
在 VM 中安装或更新 OpenClaw然后在那里启用内置插件:
在 VM 中安装或更新 OpenClaw然后在其中启用内置插件:
```bash
openclaw plugins enable google-meet
@ -181,14 +180,14 @@ openclaw plugins enable google-meet
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
```
如果 `<gateway-host>` LAN IP 且你未使用 TLS除非你为该受信任私有网络显式启用否则节点会拒绝该明文 WebSocket
如果 `<gateway-host>`局域网 IP 且你没有使用 TLS则节点会拒绝该明文 WebSocket除非你为这个受信任的私有网络显式启用
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
```
将节点安装为 LaunchAgent 时,也要使用同一个环境变量:
将节点安装为 LaunchAgent 时,也要使用相同的环境变量:
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
@ -197,7 +196,7 @@ openclaw node restart
```
`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` 是进程环境,不是
`openclaw.json` 设置项。`openclaw node install` 会在安装命令中检测到它时,将其存储到 LaunchAgent 环境中。
`openclaw.json` 设置。`openclaw node install` 会在安装命令存在该环境变量时,将其存储到 LaunchAgent 环境中。
从 Gateway 网关主机批准该节点:
@ -206,14 +205,14 @@ openclaw devices list
openclaw devices approve <requestId>
```
确认 Gateway 网关看到了该节点,并且它同时通告`googlemeet.chrome`
确认 Gateway 网关能看到该节点,并且它同时广播`googlemeet.chrome`
和浏览器能力/`browser.proxy`
```bash
openclaw nodes status
```
在 Gateway 网关主机上通过该节点路由 Meet
在 Gateway 网关主机上将 Meet 路由到该节点
```json5
{
@ -243,80 +242,78 @@ openclaw nodes status
}
```
现在从 Gateway 网关主机正常加入:
现在从 Gateway 网关主机正常加入:
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij
```
或者智能体使用 `google_meet` 工具,并设置 `transport: "chrome-node"`
或者要求智能体使用 `google_meet` 工具,并设置 `transport: "chrome-node"`
如果你想执行一个单命令冒烟测试,用于创建或复用一个会话、说出一段已知短语并打印会话健康状态:
若要执行一个单命令冒烟测试,用来创建或复用会话、说出一段已知短语,并打印会话健康状态:
```bash
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij
```
在加入过程中OpenClaw 浏览器自动化会填写访客名称,点击“加入/请求加入”,并在出现该提示时接受 Meet 首次运行的“使用麦克风”选
在仅通过浏览器创建会议时,如果 Meet 没有提供使用麦克风按钮,它也可以在不使用麦克风的情况下继续通过同一提示。
在加入期间OpenClaw 浏览器自动化会填写访客名称、点击“加入/请求加入”,并在出现该提示时接受 Meet 首次运行的“使用麦克风”选
在仅浏览器的会议创建过程中,如果 Meet 没有暴露使用麦克风按钮,它也可以在没有麦克风的情况下继续越过相同提示。
如果浏览器配置文件未登录、Meet 正在等待主持人准入、Chrome 需要麦克风/摄像头权限,或者 Meet 卡在自动化无法解决的提示上,加入/`test-speech` 结果会报告
`manualActionRequired: true`,并附带 `manualActionReason`
`manualActionMessage`。智能体应停止重试加入,报告该确切消息以及当前的
`browserUrl`/`browserTitle`,并且只在手动浏览器操作完成后重试。
`manualActionRequired: true`,并带有 `manualActionReason`
`manualActionMessage`。智能体应停止重试加入,报告这条准确消息以及当前的 `browserUrl`/`browserTitle`,并且只在手动浏览器操作完成后再重试。
如果省略`chromeNode.node`,只有在恰好有一个已连接节点同时通告 `googlemeet.chrome` 和浏览器控制能力OpenClaw 才会自动选择。
如果连接了多个具备能力的节点,请将 `chromeNode.node` 设置为节点 id、显示名称或远程 IP。
如果省略 `chromeNode.node`,只有当恰好有一个已连接节点同时广播 `googlemeet.chrome` 和浏览器控制OpenClaw 才会自动选择。
如果连接了多个可用节点,请将 `chromeNode.node` 设置为节点 id、显示名称或远程 IP。
常见故障检查:
- `No connected Google Meet-capable node`:在 VM 中启动 `openclaw node run`
批准配对,并确保在 VM 中运行 `openclaw plugins enable google-meet`
`openclaw plugins enable browser`还要确认
批准配对,并确保在 VM 中运行 `openclaw plugins enable google-meet`
`openclaw plugins enable browser`同时确认
Gateway 网关主机通过
`gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]` 允许这两个节点命令。
- `BlackHole 2ch audio device not found on the node`:在 VM 中安装 `blackhole-2ch`
并重启 VM。
- Chrome 打开了但无法加入:在 VM 内的浏览器配置文件中登录,或者保持设置 `chrome.guestName` 以进行访客加入。访客自动加入使用的是 OpenClaw
通过节点浏览器代理执行的浏览器自动化;请确保节点浏览器配置指向你想使用的配置文件,例如
`browser.defaultProfile: "user"` 或一个命名的现有会话配置文件。
- Chrome 打开了但无法加入:在 VM 中登录浏览器配置文件,或者保持设置 `chrome.guestName` 用于访客加入。访客自动加入通过节点浏览器代理使用 OpenClaw 浏览器自动化;请确保节点浏览器配置指向你想使用的配置文件,例如
`browser.defaultProfile: "user"` 或某个已命名的现有会话配置文件。
- 重复的 Meet 标签页:保持启用 `chrome.reuseExistingTab: true`。OpenClaw
会在打开新标签页前激活同 Meet URL 的现有标签页,而浏览器会议创建会在打开另一个标签页之前复用一个进行中的 `https://meet.google.com/new`
或 Google 账号提示标签页
- 音频:在 Meet 中,将麦克风/扬声器路由到 OpenClaw 使用的虚拟音频设备路径;使用独立的虚拟设备或类似 Loopback 的路由方式,以获得干净的双工音频
会在打开新标签页前激活同 Meet URL 的现有标签页,而浏览器会议创建会复用一个进行中的 `https://meet.google.com/new`
或 Google 账户提示标签页,而不是再打开一个
- 没有音频:在 Meet 中,将麦克风/扬声器路由到 OpenClaw 使用的虚拟音频设备路径;为了获得干净的双工音频,请使用独立的虚拟设备或类似 Loopback 的路由方式。
## 安装说明
Chrome 实时默认置使用两个外部工具:
Chrome 实时默认置使用两个外部工具:
- `sox`:命令行音频工具。插件使用它的 `rec``play`
命令作为默认 8 kHz G.711 mu-law 音频桥接。
- `sox`:命令行音频工具。插件使用它的 `rec``play`
命令来提供默认的 8 kHz G.711 mu-law 音频桥接。
- `blackhole-2ch`macOS 虚拟音频驱动。它会创建 `BlackHole 2ch`
音频设备,供 Chrome/Meet 路由使用
音频设备,供 Chrome/Meet 进行音频路由。
OpenClaw 不捆绑也不重新分发这两个软件包。文档要求用户通过 Homebrew
将它们作为主机依赖进行安装。SoX 的许可为
`LGPL-2.0-only AND GPL-2.0-only`BlackHole 为 GPL-3.0。如果你构建了一个将 BlackHole 与 OpenClaw 一起捆绑的安装程序或设备,请查 BlackHole 上游许可条款,或从 Existential Audio 获取单独许可。
OpenClaw 不会捆绑或重新分发这两个软件包。文档要求用户通过 Homebrew
将它们作为主机依赖安装。SoX 的许可
`LGPL-2.0-only AND GPL-2.0-only`BlackHole 为 GPL-3.0。如果你构建了一个将 BlackHole 与 OpenClaw 一起捆绑的安装程序或设备,请查 BlackHole 上游许可条款,或从 Existential Audio 获取单独许可。
## 传输方式
### Chrome
Chrome 传输会在 Google Chrome 中打开 Meet URL并以已登录的 Chrome 配置文件身份加入。在 macOS 上,插件会在启动前检查是否存在 `BlackHole 2ch`
如果已配置,它还会在打开 Chrome 之前运行一个音频桥健康检查命令和启动命令。当 Chrome/音频运行在 Gateway 网关主机上时使用 `chrome`
当 Chrome/音频 运行在已配对节点上(例如 Parallels macOS VM时使用 `chrome-node`
Chrome 传输会在 Google Chrome 中打开 Meet URL并以已登录的
Chrome 配置文件身份加入。在 macOS 上,插件会在启动前检查 `BlackHole 2ch`
如果已配置,它还会在打开 Chrome 之前运行音频桥接健康检查命令和启动命令。当 Chrome/音频运行在 Gateway 网关主机上时,请使用 `chrome`;当 Chrome/音频运行在已配对节点上(例如 Parallels macOS VM,请使用 `chrome-node`
```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 传输是一种严格的拨号计划,并委派给 Voice Call 插件。它不会解析 Meet 页面来提取电话号码。
当无法使用 Chrome 参与,或者你想要电话拨入作为回退方案时请使用此方式。Google Meet 必须为会议提供电话拨入号码和 PINOpenClaw 不会从 Meet 页面发现这些信息。
当无法使用 Chrome 参会,或者你想要一个电话拨入回退方案时请使用此方式。Google Meet 必须为会议提供电话拨入号码和 PINOpenClaw 不会从 Meet 页面发现这些信息。
在 Gateway 网关主机上启用 Voice Call 插件,而不是在 Chrome 节点上:
@ -343,7 +340,7 @@ Twilio 传输是一种严格的拨号计划,并委托给 Voice Call 插件执
}
```
通过环境变量或配置提供 Twilio 凭证。环境变量可以让密钥不出现在 `openclaw.json` 中:
通过环境变量或配置提供 Twilio 凭证。使用环境变量可以让密钥不出现在 `openclaw.json` 中:
```bash
export TWILIO_ACCOUNT_SID=AC...
@ -351,7 +348,7 @@ export TWILIO_AUTH_TOKEN=...
export TWILIO_FROM_NUMBER=+15550001234
```
启用 `voice-call` 后,重启或重新加载 Gateway 网关;插件配置变更在 Gateway 网关进程重新加载之前,不会出现在已运行的进程中。
启用 `voice-call` 后,重启或重新加载 Gateway 网关;在 Gateway 网关进程重新加载之前,插件配置更改不会出现在已运行的 Gateway 网关进程中。
然后进行验证:
@ -361,8 +358,8 @@ 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 \
@ -382,7 +379,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
## OAuth 和预检
对于创建 Meet 链接OAuth 是可选的,因为 `googlemeet create` 可以回退到浏览器自动化。当你需要官方 API 创建、空间解析或 Meet Media API 预检时,请配置 OAuth。
创建 Meet 链接OAuth 是可选的,因为 `googlemeet create` 可以回退到浏览器自动化。当你想使用官方 API 创建、空间解析或 Meet Media API 预检时,请配置 OAuth。
Google Meet API 访问优先使用个人 OAuth 客户端。配置
`oauth.clientId`,并可选配置 `oauth.clientSecret`,然后运行:
@ -391,14 +388,14 @@ Google Meet API 访问优先使用个人 OAuth 客户端。配置
openclaw googlemeet auth login --json
```
该命令会打印一个包含刷新令牌的 `oauth` 配置块。它使用 PKCE、
位于 `http://localhost:8085/oauth2callback` 的 localhost 回调,以及通过 `--manual` 进行的手动复制/粘贴流程。
该命令会打印一个带有刷新令牌的 `oauth` 配置块。它使用 PKCE、
`http://localhost:8085/oauth2callback` 上的 localhost 回调,以及配合 `--manual` 的手动复制/粘贴流程。
OAuth 同意范围包括 Meet 空间创建、Meet 空间读取权限,以及 Meet 会议媒体读取权限。如果你支持会议创建之前完成认证,请重新运行 `openclaw googlemeet auth login --json`这样刷新令牌才会具有 `meetings.space.created` scope
OAuth 同意范围包括 Meet 空间创建、Meet 空间读取权限,以及 Meet 会议媒体读取权限。如果你在会议创建支持出现之前就已完成认证,请重新运行 `openclaw googlemeet auth login --json`以便刷新令牌包含 `meetings.space.created` 作用域
浏览器回退不需要 OAuth 凭证。在该模式下Google 认证来自所选节点上已登录的 Chrome 配置文件,而不是来自 OpenClaw 配置。
浏览器回退不需要 OAuth 凭证。在该模式下Google 认证来自所选节点上已登录的 Chrome 配置文件,而不是 OpenClaw 配置。
以下环境变量作为回退值使用
接受以下环境变量作为回退值:
- `OPENCLAW_GOOGLE_MEET_CLIENT_ID``GOOGLE_MEET_CLIENT_ID`
- `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET``GOOGLE_MEET_CLIENT_SECRET`
@ -415,7 +412,7 @@ OAuth 同意范围包括 Meet 空间创建、Meet 空间读取权限,以及 Me
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
```
在进行媒体工作前运行预检:
在进行媒体相关工作前运行预检:
```bash
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
@ -427,9 +424,9 @@ openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet create
```
该命令会打印新的 `meeting uri`、来源以及加入会话。配置了 OAuth 凭证时,它会使用官方 Google Meet API。没有 OAuth 凭证时,它会使用固定 Chrome 节点上已登录的浏览器配置文件作为回退。智能体可以使用带有 `action: "create"``google_meet` 工具一步完成创建和加入。若仅创建 URL请传入 `"join": false`
该命令会打印新的 `meeting uri`、来源以及加入会话。了 OAuth 凭证时,它会使用官方 Google Meet API。没有 OAuth 凭证时,它会回退为使用固定 Chrome 节点上已登录的浏览器配置文件。智能体可以使用 `google_meet` 工具并传入 `action: "create"`,一步完成创建和加入。若只创建 URL请传入 `"join": false`
浏览器回退的 JSON 输出示例:
来自浏览器回退的 JSON 输出示例:
```json
{
@ -449,7 +446,7 @@ openclaw googlemeet create
}
```
API 创建的 JSON 输出示例:
来自 API 创建的 JSON 输出示例:
```json
{
@ -470,14 +467,14 @@ API 创建的 JSON 输出示例:
}
```
创建 Meet 默认会加入会议。Chrome 或 Chrome-node 传输仍然需要一个已登录 Google 的 Chrome 配置文件,才能通过浏览器加入。如果该配置文件已登出OpenClaw 会报告 `manualActionRequired: true` 或浏览器回退错误,并要求操作员先完成 Google 登录再重试
创建 Meet 默认会加入会议。Chrome 或 chrome-node 传输仍然需要一个已登录 Google 的 Chrome 配置文件,才能通过浏览器加入。如果配置文件已退出登录OpenClaw 会报告 `manualActionRequired: true` 或浏览器回退错误,并要求操作员在重试前完成 Google 登录
仅在确认你的 Cloud 项目、OAuth 主体以及会议参与者都已加入适用于 Meet 媒体 API 的 Google Workspace Developer Preview Program 后,才设置 `preview.enrollmentAcknowledged: true`
只有在确认你的 Cloud 项目、OAuth 主体和会议参与者都已加入 Google Workspace Developer Preview Program for Meet media APIs 之后,才设置 `preview.enrollmentAcknowledged: true`
## 配置
常见的 Chrome 实时路径只需要启用插件、BlackHole、SoX以及一个后端实时语音提供商密钥。OpenAI 是默认选项;设置
`realtime.provider: "google"` 使用 Google Gemini Live
常见的 Chrome 实时路径只需要启用插件、安装 BlackHole、SoX以及一个后端实时语音提供商密钥。OpenAI 是默认选项;设置
`realtime.provider: "google"` 使用 Google Gemini Live
```bash
brew install blackhole-2ch sox
@ -505,21 +502,18 @@ export GEMINI_API_KEY=...
- `defaultTransport: "chrome"`
- `defaultMode: "realtime"`
- `chromeNode.node``chrome-node` 的可选节点 id/名称/IP
- `chromeNode.node`用于 `chrome-node` 的可选节点 id/名称/IP
- `chrome.audioBackend: "blackhole-2ch"`
- `chrome.guestName: "OpenClaw Agent"`:在已登出的 Meet 访客界面中使用的名称
- `chrome.autoJoin: true`:通过 OpenClaw 浏览器自动化在 `chrome-node` 上尽力填写访客名并点击立即加入
- `chrome.guestName: "OpenClaw Agent"`:在已退出登录的 Meet 访客界面上使用的名称
- `chrome.autoJoin: true`:通过 OpenClaw 浏览器自动化`chrome-node` 上尽力填写访客名并点击立即加入
- `chrome.reuseExistingTab: true`:激活现有 Meet 标签页,而不是打开重复标签页
- `chrome.waitForInCallMs: 20000`:在触发实时介绍前,等待 Meet 标签页报告已在通话中
- `chrome.audioInputCommand`SoX `rec` 命令,将 8 kHz G.711 mu-law
音频写入 stdout
- `chrome.audioOutputCommand`SoX `play` 命令,从 stdin 读取 8 kHz G.711 mu-law
音频
- `chrome.waitForInCallMs: 20000`:等待 Meet 标签页报告已在通话中,然后再触发实时介绍
- `chrome.audioInputCommand`:将 8 kHz G.711 mu-law 音频写入 stdout 的 SoX `rec` 命令
- `chrome.audioOutputCommand`:从 stdin 读取 8 kHz G.711 mu-law 音频的 SoX `play` 命令
- `realtime.provider: "openai"`
- `realtime.toolPolicy: "safe-read-only"`
- `realtime.instructions`:简短的口头回复,必要时使用
`openclaw_agent_consult` 获取更深入答案
- `realtime.introMessage`:当实时桥接连接时的简短口头就绪检查;将其设置为 `""` 可静默加入
- `realtime.instructions`:简短口头回复,较深层的回答使用 `openclaw_agent_consult`
- `realtime.introMessage`:实时桥接连接时的简短口头就绪检查;将其设为 `""` 可静默加入
可选覆盖项:
@ -550,7 +544,7 @@ export GEMINI_API_KEY=...
}
```
仅 Twilio 配置:
Twilio 配置:
```json5
{
@ -565,7 +559,7 @@ export GEMINI_API_KEY=...
}
```
`voiceCall.enabled` 默认为 `true`;使用 Twilio 传输时,它会将实际 PSTN 呼叫和 DTMF 委托给 Voice Call 插件。如果未启用 `voice-call`Google Meet 仍可验证并记录拨号计划,但无法发起 Twilio 呼叫。
`voiceCall.enabled` 默认为 `true`;使用 Twilio 传输时,它会将实际的 PSTN 呼叫和 DTMF 委派给 Voice Call 插件。如果未启用 `voice-call`Google Meet 仍验证并记录拨号计划,但无法发起 Twilio 呼叫。
## 工具
@ -580,18 +574,19 @@ export GEMINI_API_KEY=...
}
```
当 Chrome 运行在 Gateway 网关主机上时,使用 `transport: "chrome"`。当 Chrome 运行在已配对节点上,例如 Parallels VM 时,使用
`transport: "chrome-node"`。在这两种情况下,实时模型和 `openclaw_agent_consult` 都运行在 Gateway 网关主机上,因此模型凭证保留在那里。
当 Chrome 运行在 Gateway 网关主机上时,使用 `transport: "chrome"`。当 Chrome 运行在已配对节点上(例如 Parallels VM时,使用
`transport: "chrome-node"`。在这两种情况下,实时模型和 `openclaw_agent_consult` 都运行在 Gateway 网关主机上,因此模型凭证保留在那里。
使用 `action: "status"` 列出活动会话或检查某个会话 ID。使用带有 `sessionId``message``action: "speak"` 让实时智能体立即发言。使用 `action: "test_speech"` 创建或复用会话、触发一个已知短语,并在 Chrome 主机可报告时返回 `inCall` 健康状态。使用 `action: "leave"` 将会话标记为结束。
使用 `action: "status"` 列出活动会话或检查某个会话 ID。使用
`action: "speak"` 并传入 `sessionId``message`,可让实时智能体立即发言。使用 `action: "test_speech"` 可创建或复用会话、触发一段已知短语,并在 Chrome 主机能够报告时返回 `inCall` 健康状态。使用 `action: "leave"` 将会话标记为结束。
可用时,`status` 包含 Chrome 健康状态
可用时,`status` 包含 Chrome 健康信息
- `inCall`Chrome 看起来已进入 Meet 通话
- `micMuted`:尽力判断的 Meet 麦克风状态
- `manualActionRequired` / `manualActionReason` / `manualActionMessage`浏览器配置文件需要手动登录、Meet 主持人准入、权限授予,或浏览器控制修复,语音功能才能工作
- `inCall`Chrome 看起来已在 Meet 通话中
- `micMuted`:尽力检测的 Meet 麦克风状态
- `manualActionRequired` / `manualActionReason` / `manualActionMessage`浏览器配置文件需要手动登录、Meet 主持人准入、权限授予,或浏览器控制修复,语音才能正常工作
- `providerConnected` / `realtimeReady`:实时语音桥接状态
- `lastInputAt` / `lastOutputAt`最近一次从桥接收到或发送到桥接的音频时间
- `lastInputAt` / `lastOutputAt`桥接最近一次接收/发送音频的时间
```json
{
@ -601,11 +596,11 @@ export GEMINI_API_KEY=...
}
```
## Realtime 智能体咨询
## 实时智能体咨询
Chrome 实时模式针对实时语音循环进行了优化。实时语音提供商会听取会议音频,并通过配置的音频桥接进行发言。当实时模型需要更深入的推理、当前信息或常规 OpenClaw 工具时,它可以调用 `openclaw_agent_consult`
Chrome 实时模式针对实时语音循环进行了优化。实时语音提供商会听取会议音频,并通过配置的音频桥接进行发言。当实时模型需要更深入的推理、最新信息或普通 OpenClaw 工具时,它可以调用 `openclaw_agent_consult`
咨询工具会在后台运行常规的 OpenClaw 智能体,并结合最近的会议转录上下文,向实时语音会话返回简洁的口头答案。随后语音模型可以将该答案说回会议中。它与 Voice Call 共用同一个实时咨询工具。
咨询工具会在后台运行常规 OpenClaw 智能体,带入最近的会议转录上下文,并向实时语音会话返回一个简洁的口头回答。随后,语音模型即可将该回答说回会议中。它使用与 Voice Call 相同的共享实时咨询工具。
`realtime.toolPolicy` 控制咨询运行方式:
@ -615,7 +610,7 @@ Chrome 实时模式针对实时语音循环进行了优化。实时语音提供
- `owner`:暴露咨询工具,并允许常规智能体使用普通智能体工具策略。
- `none`:不向实时语音模型暴露咨询工具。
咨询会话键按每个 Meet 会话划分范围,因此在同一会议期间,后续咨询调用可以复用先前的咨询上下文。
咨询会话键按每个 Meet 会话进行作用域隔离,因此在同一场会议期间,后续咨询调用可以复用之前的咨询上下文。
若要在 Chrome 完全加入通话后强制执行一次口头就绪检查:
@ -623,7 +618,7 @@ Chrome 实时模式针对实时语音循环进行了优化。实时语音提供
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."
```
完整的加入并发言冒烟测试:
执行完整的加入并发言冒烟测试:
```bash
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
@ -633,7 +628,7 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
## 实时测试检查清单
在将会议交给无人值守智能体之前,请使用以下顺序:
在将会议交给无人值守智能体之前,请使用以下顺序:
```bash
openclaw googlemeet setup
@ -643,15 +638,15 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
--message "Say exactly: Google Meet speech test complete."
```
预期的 Chrome-node 状态:
预期的 chrome-node 状态:
- `googlemeet setup` 全部为绿色。
- 当 Chrome-node 是默认传输方式或某个节点已被固定时,`googlemeet setup` 会包含 `chrome-node-connected`
- 当 chrome-node 是默认传输方式或已固定某个节点时,`googlemeet setup` 包含 `chrome-node-connected`
- `nodes status` 显示所选节点已连接。
- 所选节点同时通告 `googlemeet.chrome``browser.proxy`
- Meet 标签页加入通话,`test-speech` 返回包含 `inCall: true` 的 Chrome 健康状态。
- 所选节点同时广播 `googlemeet.chrome``browser.proxy`
- Meet 标签页加入通话,并且 `test-speech` 返回带有 `inCall: true` 的 Chrome 健康状态。
对于远程 Chrome 主机,例如 Parallels macOS VM在更新 Gateway 网关或 VM 之后,这是最短且安全的检查方式:
对于远程 Chrome 主机,例如 Parallels macOS VM在更新 Gateway 网关或 VM 之后,这是最短且安全的检查方式:
```bash
openclaw googlemeet setup
@ -662,7 +657,7 @@ openclaw nodes invoke \
--params '{"action":"setup"}'
```
这可以证明 Gateway 网关插件已加载、VM 节点已使用当前令牌连接,并且 Meet 音频桥接在智能体打开真实会议标签页之前可用
这可以证明 Gateway 网关插件已加载、VM 节点使用当前令牌完成连接,并且 Meet 音频桥接可用,然后智能体才会打开真实的会议标签页
对于 Twilio 冒烟测试,请使用一个会暴露电话拨入详情的会议:
@ -677,24 +672,23 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
预期的 Twilio 状态:
- `googlemeet setup` 包含绿色的 `twilio-voice-call-plugin`
`twilio-voice-call-credentials` 检查。
`twilio-voice-call-credentials` 检查
- Gateway 网关重新加载后CLI 中可用 `voicecall`
- 返回的会话包含 `transport: "twilio"` `twilio.voiceCallId`
- `googlemeet leave <sessionId>` 会挂断委托的语音通话
- 返回的会话带有 `transport: "twilio"` 和一个 `twilio.voiceCallId`
- `googlemeet leave <sessionId>` 会挂断已委派的语音呼叫
## 故障排除
### 智能体看不到 Google Meet 工具
确认插件已在 Gateway 网关配置中启用,并重新加载 Gateway 网关:
确认插件已在 Gateway 网关配置中启用,并重新加载 Gateway 网关:
```bash
openclaw plugins list | grep google-meet
openclaw googlemeet setup
```
如果你刚刚编辑了 `plugins.entries.google-meet`,请重启或重新加载 Gateway 网关。
运行中的智能体只能看到由当前 Gateway 网关进程注册的插件工具。
如果你刚编辑了 `plugins.entries.google-meet`,请重启或重新加载 Gateway 网关。正在运行的智能体只能看到由当前 Gateway 网关进程注册的插件工具。
### 没有已连接的 Google Meet 可用节点
@ -707,7 +701,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
```
在 Gateway 网关主机上,批准节点并验证命令:
在 Gateway 网关主机上,批准节点并验证命令:
```bash
openclaw devices list
@ -715,7 +709,7 @@ openclaw devices approve <requestId>
openclaw nodes status
```
节点必须已连接,并列出 `googlemeet.chrome` 以及 `browser.proxy`
节点必须已连接,并列出 `googlemeet.chrome` 以及 `browser.proxy`
Gateway 网关配置必须允许这些节点命令:
```json5
@ -729,7 +723,7 @@ Gateway 网关配置必须允许这些节点命令:
```
如果 `googlemeet setup``chrome-node-connected` 检查失败,或者 Gateway 网关日志报告
`gateway token mismatch`,请使用当前 Gateway 网关令牌重新安装或重启节点。对于 LAN Gateway 网关,这通常意味着:
`gateway token mismatch`,请使用当前 Gateway 网关令牌重新安装或重启该节点。对于局域网 Gateway 网关,通常意味着:
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
@ -740,7 +734,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
--force
```
然后重新加载节点服务,并重新运行:
然后重新加载节点服务,并再次运行:
```bash
openclaw googlemeet setup
@ -749,38 +743,34 @@ openclaw nodes status --connected
### 浏览器打开了,但智能体无法加入
运行 `googlemeet test-speech` 并检查返回的 Chrome 健康状态。如果它报告
`manualActionRequired: true`,请将 `manualActionMessage` 展示给操作员,并在浏览器操作完成之前停止重试。
运行 `googlemeet test-speech` 并检查返回的 Chrome 健康信息。如果它报告 `manualActionRequired: true`,请将 `manualActionMessage` 展示给操作员,并在浏览器操作完成前停止重试。
常见的手动操作:
- 登录 Chrome 配置文件。
- 从 Meet 主持人账号允许访客加入。
- 当 Chrome 原生权限提示出现时,授予 Chrome 麦克风/摄像头权限。
- 从 Meet 主持人账户批准访客进入。
- 当出现 Chrome 原生权限提示时,授予 Chrome 麦克风/摄像头权限。
- 关闭或修复卡住的 Meet 权限对话框。
不要仅因为 Meet 显示“Do you want people to hear you in the meeting?” 就报告“未登录”。
那是 Meet 的音频选择过场页OpenClaw 会在可用时通过浏览器自动化点击 **Use microphone**,并继续等待真实的会议状态。
对于仅创建的浏览器回退OpenClaw 可能会点击 **Continue without microphone**,因为创建 URL 不需要实时音频路径。
不要仅因为 Meet 显示“你希望别人听到你在会议中的声音吗?”就报告“未登录”。这是 Meet 的音频选择过渡页在可用时OpenClaw 会通过浏览器自动化点击**使用麦克风**并继续等待真正的会议状态。对于仅创建的浏览器回退OpenClaw 可能会点击**不使用麦克风继续**,因为创建 URL 不需要实时音频路径。
### 会议创建失败
当配置了 OAuth 凭证时,`googlemeet create` 会首先使用 Google Meet API 的 `spaces.create` 端点。
如果没有 OAuth 凭证,它会回退到固定的 Chrome 节点浏览器。请确认:
`googlemeet create` 会在配置了 OAuth 凭证时优先使用 Google Meet API 的 `spaces.create` 端点。没有 OAuth 凭证时,它会回退到固定的 Chrome 节点浏览器。请确认:
- 对于 API 创建:已配置 `oauth.clientId``oauth.refreshToken`
或存在匹配`OPENCLAW_GOOGLE_MEET_*` 环境变量。
- 对于 API 创建:刷新令牌是在添加创建支持之后签发的。较旧的令牌可能缺少 `meetings.space.created` scope;请重新运行
或存在对应`OPENCLAW_GOOGLE_MEET_*` 环境变量。
- 对于 API 创建:刷新令牌是在添加创建支持之后生成的。较旧的令牌可能缺少 `meetings.space.created` 作用域;请重新运行
`openclaw googlemeet auth login --json` 并更新插件配置。
- 对于浏览器回退:`defaultTransport: "chrome-node"` 和
`chromeNode.node` 指向一个已连接具有 `browser.proxy`
`chromeNode.node` 指向一个已连接具有 `browser.proxy`
`googlemeet.chrome` 的节点。
- 对于浏览器回退:该节点上的 OpenClaw Chrome 配置文件已登录 Google并且可以打开 `https://meet.google.com/new`
- 对于浏览器回退:重试会复用现有的 `https://meet.google.com/new`
或 Google 账提示标签页,而不是打开新标签页。如果智能体超时,请重试工具调用,而不是手动再打开一个 Meet 标签页。
- 对于浏览器回退:如果 Meet 显示“Do you want people to hear you in the meeting?”请保持该标签页打开。OpenClaw 应通过浏览器自动化点击 **Use microphone**,或者在仅创建回退时点击 **Continue without microphone**,并继续等待生成的 Meet URL。如果无法做到错误应提及 `meet-audio-choice-required`,而不是 `google-login-required`
- 对于浏览器回退:重试会优先复用一个已有的 `https://meet.google.com/new`
或 Google 账提示标签页,而不是打开新标签页。如果智能体超时,请重试工具调用,而不是手动再打开一个 Meet 标签页。
- 对于浏览器回退:如果 Meet 显示“你希望别人听到你在会议中的声音吗请保持标签页打开。OpenClaw 应通过浏览器自动化点击**使用麦克风**,或者在仅创建回退时点击**不使用麦克风继续**,然后继续等待生成的 Meet URL。如果做不到错误应提到 `meet-audio-choice-required`,而不是 `google-login-required`
### 智能体已加入但不说话
### 智能体加入了,但没有说话
检查实时路径:
@ -789,37 +779,34 @@ openclaw googlemeet setup
openclaw googlemeet doctor
```
使用 `mode: "realtime"` 进行收听/回话。`mode: "transcribe"` 按设计不会启动双工实时语音桥接。
使用 `mode: "realtime"` 进行收听/回话。`mode: "transcribe"` 会有意不启动双工实时语音桥接。
还要验证:
另外还要验证:
- Gateway 网关主机上有可用的实时提供商密钥,例如
`OPENAI_API_KEY``GEMINI_API_KEY`
- 在 Chrome 主机上可以看到 `BlackHole 2ch`
- 在 Chrome 主机上存在 `rec``play`
- Meet 的麦克风和扬声器已路由到 OpenClaw 使用的虚拟音频路径
- `BlackHole 2ch` 在 Chrome 主机上可见
- `rec``play` 在 Chrome 主机上存在
- Meet 麦克风和扬声器通过 OpenClaw 使用的虚拟音频路径进行路由
`googlemeet doctor [session-id]` 会打印会话、节点、in-call 状态、
`googlemeet doctor [session-id]` 会打印会话、节点、在通话状态、
手动操作原因、实时提供商连接、`realtimeReady`、音频输入/输出活动、最近音频时间戳、字节计数以及浏览器 URL。
当你需要原始 JSON 时,请使用 `googlemeet status [session-id]`
如果智能体超时,而你能看到一个已打开的 Meet 标签页,请检查该标签页,而不要再打开另一个:
如果智能体超时,而你能看到已有一个 Meet 标签页处于打开状态,请检查该标签页,而不要再打开另一个:
```bash
openclaw googlemeet recover-tab
openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij
```
对应的工具操作是 `recover_current_tab`。它会在已配置的 Chrome 节点上聚焦并检查现有 Meet 标签页。
它不会打开新标签页,也不会创建新会话;它会报告当前阻塞项,例如登录、准入、权限或音频选择状态。
对应的工具动作是 `recover_current_tab`。它会聚焦并检查已配置 Chrome 节点上的现有 Meet 标签页。它不会打开新标签页也不会创建新会话它会报告当前阻塞项例如登录、准入、权限或音频选择状态。CLI 命令会与已配置的 Gateway 网关通信,因此 Gateway 网关必须正在运行,且 Chrome 节点必须已连接。
### Twilio 设置检查失败
`voice-call` 未被允许或未启用时,`twilio-voice-call-plugin` 会失败。
请将其添加到 `plugins.allow`,启用 `plugins.entries.voice-call`,并重新加载 Gateway 网关。
`voice-call` 未被允许或未启用时,`twilio-voice-call-plugin` 会失败。请将它添加到 `plugins.allow`,启用 `plugins.entries.voice-call`,然后重新加载 Gateway 网关。
当 Twilio 后端缺少 account SID、auth token 或主叫号码时,`twilio-voice-call-credentials` 会失败。
请在 Gateway 网关主机上设置这些值:
当 Twilio 后端缺少 account SID、auth token 或主叫号码时,`twilio-voice-call-credentials` 会失败。请在 Gateway 网关主机上设置这些值:
```bash
export TWILIO_ACCOUNT_SID=AC...
@ -835,19 +822,19 @@ openclaw voicecall setup
openclaw voicecall smoke
```
默认情况下,`voicecall smoke` 仅进行就绪性检查。若要对特定号码进行 dry-run
默认情况下,`voicecall smoke` 仅做就绪性检查。若要对特定号码执行干运行
```bash
openclaw voicecall smoke --to "+15555550123"
```
只有在你明确想发起真实外呼通知电话时,才添加 `--yes`
只有当你明确想发起一次真实的外呼通知电话时,才添加 `--yes`
```bash
openclaw voicecall smoke --to "+15555550123" --yes
```
### Twilio 通话开始了,但始终未进入会议
### Twilio 呼叫开始了,但始终没有进入会议
确认 Meet 事件暴露了电话拨入详情。传入精确的拨入号码和 PIN或自定义 DTMF 序列:
@ -858,23 +845,21 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--dtmf-sequence ww123456#
```
如果提供商需要在输入 PIN 前暂停,请在 `--dtmf-sequence` 中使用前导 `w` 或逗号。
如果提供商在输入 PIN 前需要暂停,请在 `--dtmf-sequence` 中使用前导 `w` 或逗号。
## 说明
Google Meet 官方媒体 API 偏向接收,因此要在 Meet 通话中发言,仍然需要一条参与者路径。该插件将这一边界明确化
Chrome 负责浏览器参与和本地音频路由Twilio 负责电话拨入参与
Google Meet 的官方媒体 API 偏向接收,因此向 Meet 通话中发言仍然需要一个参会者路径。这个插件让该边界保持可见
Chrome 处理浏览器参会和本地音频路由Twilio 处理电话拨入参会
Chrome 实时模式需要以下两者之一:
- `chrome.audioInputCommand` `chrome.audioOutputCommand`OpenClaw 负责实时模型桥接,并在这些命令与所选实时语音提供商之间传输 8 kHz G.711 mu-law 音频。
- `chrome.audioBridgeCommand`外部桥接命令负责整个本地音频路径,并且必须在启动或验证其守护进程后退出。
- `chrome.audioInputCommand``chrome.audioOutputCommand`OpenClaw 拥有实时模型桥接,并在这些命令与所选实时语音提供商之间传输 8 kHz G.711 mu-law 音频。
- `chrome.audioBridgeCommand`一个外部桥接命令拥有整个本地音频路径,并且必须在启动或验证其守护进程后退出。
为了获得干净的双工音频,请将 Meet 输出和 Meet 麦克风路由到独立的虚拟设备,或使用类似 Loopback 的虚拟设备图。
单个共享的 BlackHole 设备可能会把其他参与者的声音回送到通话中。
若要获得干净的双工音频,请将 Meet 输出和 Meet 麦克风通过独立的虚拟设备,或类似 Loopback 的虚拟设备图进行路由。单个共享的 BlackHole 设备可能会把其他参会者的声音回送进通话中。
`googlemeet speak` 会触发 Chrome 会话的活动实时音频桥接。
`googlemeet leave` 会停止该桥接。对于通过 Voice Call 插件委托的 Twilio 会话,`leave` 还会挂断底层语音通话。
`googlemeet speak` 会触发某个 Chrome 会话的活动实时音频桥接。`googlemeet leave` 会停止该桥接。对于通过 Voice Call 插件委派的 Twilio 会话,`leave` 也会挂断底层语音呼叫。
## 相关内容

View File

@ -1,26 +1,24 @@
---
read_when:
- 你需要从插件调用核心辅助方法TTS、STT、图像生成、网络搜索、子智能体、节点)
- 你需要从插件调用核心辅助工具TTS、STT、图像生成、网页搜索、子智能体、节点)
- 你想了解 `api.runtime` 暴露了什么
- 你正在从插件代码中访问配置、智能体或媒体辅助方法
- 你正在从插件代码中访问配置、智能体或媒体辅助工具
sidebarTitle: Runtime Helpers
summary: '`api.runtime`——提供给插件的注入式运行时辅助方法'
title: 插件运行时辅助方法
summary: '`api.runtime` —— 可供插件使用的注入式运行时辅助工具'
title: 插件运行时辅助工具
x-i18n:
generated_at: "2026-04-24T04:34:53Z"
generated_at: "2026-04-25T03:16:17Z"
model: gpt-5.4
provider: openai
source_hash: 2327bdabc0dc1e05000ff83e507007fadff2698cceaae0d4a3e7bc4885440c55
source_hash: f8c3e5d4db970299c4c6f9f703a63bc42f244627989f1b3489adf43aa87c8952
source_path: plugins/sdk-runtime.md
workflow: 15
---
注册期间注入到每个插件中的 `api.runtime` 对象参考。请使用这些辅助方法,而不要直接导入宿主内部实现。
每个插件在注册期间都会注入 `api.runtime` 对象,本文档是它的参考说明。请使用这些辅助工具,而不是直接导入宿主内部实现。
<Tip>
**想看操作演练?** 请参阅 [渠道插件](/zh-CN/plugins/sdk-channel-plugins)
或 [提供商插件](/zh-CN/plugins/sdk-provider-plugins) 的分步指南,
这些指南会结合上下文展示这些辅助方法的用法。
**想看操作演练?** 请参阅 [渠道插件](/zh-CN/plugins/sdk-channel-plugins) 或 [提供商插件](/zh-CN/plugins/sdk-provider-plugins) 中的分步指南,这些指南会在实际上下文中展示这些辅助工具的用法。
</Tip>
```typescript
@ -33,7 +31,7 @@ register(api) {
### `api.runtime.agent`
智能体身份、目录会话管理。
智能体身份、目录会话管理。
```typescript
// 解析智能体的工作目录
@ -54,7 +52,7 @@ const timeoutMs = api.runtime.agent.resolveAgentTimeoutMs(cfg);
// 确保工作区存在
await api.runtime.agent.ensureAgentWorkspace(cfg);
// 运行一嵌入式智能体轮次
// 运行一嵌入式智能体轮次
const agentDir = api.runtime.agent.resolveAgentDir(cfg);
const result = await api.runtime.agent.runEmbeddedAgent({
sessionId: "my-plugin:task-1",
@ -66,12 +64,11 @@ const result = await api.runtime.agent.runEmbeddedAgent({
});
```
`runEmbeddedAgent(...)` 是一个中立的辅助方法,用于从插件代码启动一次普通的 OpenClaw
智能体轮次。它使用与渠道触发回复相同的提供商/模型解析逻辑,以及相同的智能体 harness 选择逻辑。
`runEmbeddedAgent(...)` 是一个中立辅助工具,用于从插件代码中启动一次普通的 OpenClaw 智能体轮次。它使用与渠道触发回复相同的 provider / model 解析逻辑,以及相同的 Agent harness 选择方式。
`runEmbeddedPiAgent(...)` 仍然保留,作为兼容性别名。
`runEmbeddedPiAgent(...)` 仍然保留为兼容性别名。
**会话存储辅助方法** 位于 `api.runtime.agent.session` 下:
**会话存储辅助工具** 位于 `api.runtime.agent.session` 下:
```typescript
const storePath = api.runtime.agent.session.resolveStorePath(cfg);
@ -112,22 +109,20 @@ const { messages } = await api.runtime.subagent.getSessionMessages({
limit: 10,
});
// 删除一个会话
// 删除会话
await api.runtime.subagent.deleteSession({
sessionKey: "agent:main:subagent:search-helper",
});
```
<Warning>
模型覆盖(`provider`/`model`)要求操作员在配置中显式启用
`plugins.entries.<id>.subagent.allowModelOverride: true`
不受信任的插件仍然可以运行子智能体,但覆盖请求会被拒绝。
模型覆盖(`provider` / `model`)需要操作员在配置中显式启用 `plugins.entries.<id>.subagent.allowModelOverride: true`
不受信任的插件仍然可以运行子智能体,但其覆盖请求会被拒绝。
</Warning>
### `api.runtime.nodes`
列出已连接的节点,并从 Gateway 网关加载的插件代码中调用节点宿主命令。
当插件在配对设备上拥有本地工作时,请使用此方法,例如在另一台 Mac 上运行的浏览器桥接或音频桥接。
列出已连接节点,并从 Gateway 网关加载的插件代码或插件 CLI 命令中调用节点宿主命令。当某个插件拥有配对设备上的本地工作时,请使用此功能,例如另一台 Mac 上的浏览器桥接或音频桥接。
```typescript
const { nodes } = await api.runtime.nodes.list({ connected: true });
@ -140,11 +135,11 @@ const result = await api.runtime.nodes.invoke({
});
```
此运行时仅在 Gateway 网关内部可用。节点命令仍然会经过正常的 Gateway 网关节点配对、命令允许列表和节点本地命令处理流程。
在 Gateway 网关内部,这个运行时是进程内调用。在插件 CLI 命令中,它会通过 RPC 调用已配置的 Gateway 网关,因此像 `openclaw googlemeet recover-tab` 这样的命令也可以从终端检查已配对的节点。节点命令仍然会经过正常的 Gateway 网关节点配对、命令允许列表以及节点本地命令处理流程。
### `api.runtime.taskFlow`
将 Task Flow 运行时绑定到现有的 OpenClaw 会话键或受信任的工具上下文,然后在每次调用时无需传递 owner即可创建和管理 Task Flow
将 Task Flow 运行时绑定到现有的 OpenClaw 会话键或受信任的工具上下文,然后在不需要每次调用都传入所有者的情况下创建和管理 Task Flows
```typescript
const taskFlow = api.runtime.taskFlow.fromToolContext(ctx);
@ -171,12 +166,11 @@ const waiting = taskFlow.setWaiting({
});
```
如果你已经从自己的绑定层获得了一个受信任的 OpenClaw 会话键,请使用
`bindSession({ sessionKey, requesterOrigin })`。不要从原始用户输入进行绑定。
当你已经从自己的绑定层中获得受信任的 OpenClaw 会话键时,请使用 `bindSession({ sessionKey, requesterOrigin })`。不要从原始用户输入中进行绑定。
### `api.runtime.tts`
文本转语音合成
文本转语音。
```typescript
// 标准 TTS
@ -191,35 +185,35 @@ const telephonyClip = await api.runtime.tts.textToSpeechTelephony({
cfg: api.config,
});
// 列出可用音
// 列出可用
const voices = await api.runtime.tts.listVoices({
provider: "elevenlabs",
cfg: api.config,
});
```
使用核心 `messages.tts` 配置和提供商选择逻辑。返回 PCM 音频缓冲区和采样率。
使用核心 `messages.tts` 配置和 provider 选择逻辑。返回 PCM 音频缓冲区和采样率。
### `api.runtime.mediaUnderstanding`
图像、音频和视频分析。
```typescript
// 描述一张图像
// 描述图像
const image = await api.runtime.mediaUnderstanding.describeImageFile({
filePath: "/tmp/inbound-photo.jpg",
cfg: api.config,
agentDir: "/tmp/agent",
});
// 转音频
// 转音频
const { text } = await api.runtime.mediaUnderstanding.transcribeAudioFile({
filePath: "/tmp/inbound-audio.ogg",
cfg: api.config,
mime: "audio/ogg", // 可选,用于无法推断 MIME 的情况
mime: "audio/ogg", // 可选,用于无法推断 MIME
});
// 描述一段视频
// 描述视频
const video = await api.runtime.mediaUnderstanding.describeVideoFile({
filePath: "/tmp/inbound-video.mp4",
cfg: api.config,
@ -232,11 +226,10 @@ const result = await api.runtime.mediaUnderstanding.runFile({
});
```
当未产生输出时(例如跳过输入),返回 `{ text: undefined }`
如果没有生成输出(例如输入被跳过),则返回 `{ text: undefined }`
<Info>
`api.runtime.stt.transcribeAudioFile(...)` 仍然保留,作为
`api.runtime.mediaUnderstanding.transcribeAudioFile(...)` 的兼容性别名。
`api.runtime.stt.transcribeAudioFile(...)` 仍然保留为 `api.runtime.mediaUnderstanding.transcribeAudioFile(...)` 的兼容性别名。
</Info>
### `api.runtime.imageGeneration`
@ -254,7 +247,7 @@ const providers = api.runtime.imageGeneration.listProviders({ cfg: api.config })
### `api.runtime.webSearch`
搜索。
搜索。
```typescript
const providers = api.runtime.webSearch.listProviders({ config: api.config });
@ -292,7 +285,7 @@ const pngQrFile = await api.runtime.media.writeQrPngTempFile("https://openclaw.a
### `api.runtime.config`
配置加载写入。
配置加载写入。
```typescript
const cfg = await api.runtime.config.loadConfig();
@ -334,7 +327,7 @@ const childLogger = api.runtime.logging.getChildLogger({ plugin: "my-plugin" },
### `api.runtime.modelAuth`
模型和提供商证解析。
模型和提供商证解析。
```typescript
const auth = await api.runtime.modelAuth.getApiKeyForModel({ model, cfg });
@ -364,9 +357,9 @@ api.runtime.tools.registerMemoryCli(/* ... */);
### `api.runtime.channel`
渠道专用运行时辅助方法(在加载渠道插件时可用)。
渠道专用运行时辅助工具(在加载渠道插件时可用)。
`api.runtime.channel.mentions`使用运行时注入的内置渠道插件共享的入站提及策略接口:
`api.runtime.channel.mentions` 是使用运行时注入的内置渠道插件共享的入站提及策略接口:
```typescript
const mentionMatch = api.runtime.channel.mentions.matchesMentionWithExplicit(text, {
@ -393,7 +386,7 @@ const decision = api.runtime.channel.mentions.resolveInboundMentionDecision({
});
```
可用的提及辅助方法
可用的提及辅助工具包括
- `buildMentionRegexes`
- `matchesMentionPatterns`
@ -401,14 +394,11 @@ const decision = api.runtime.channel.mentions.resolveInboundMentionDecision({
- `implicitMentionKindWhen`
- `resolveInboundMentionDecision`
`api.runtime.channel.mentions` 有意不暴露旧版的
`resolveMentionGating*` 兼容性辅助方法。请优先使用标准化的
`{ facts, policy }` 路径。
`api.runtime.channel.mentions` 有意不暴露较旧的 `resolveMentionGating*` 兼容性辅助工具。请优先使用标准化的 `{ facts, policy }` 路径。
## 存储运行时引用
使用 `createPluginRuntimeStore` 存储运行时引用,以便在 `register`
回调之外使用:
使用 `createPluginRuntimeStore` 存储运行时引用,以便在 `register` 回调之外使用:
```typescript
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
@ -430,7 +420,7 @@ export default defineChannelPluginEntry({
// 在其他文件中
export function getRuntime() {
return store.getRuntime(); // 如果未初始化则抛出
return store.getRuntime(); // 如果未初始化则抛出异常
}
export function tryGetRuntime() {
@ -438,24 +428,24 @@ export function tryGetRuntime() {
}
```
对于 runtime-store 标识,优先使用 `pluginId`。更底层的 `key` 形式适用于少见场景,即一个插件有意需要多个运行时槽位的情况
对于 runtime-store 标识,优先使用 `pluginId`。更底层的 `key` 形式适用于不常见的情况:某个插件有意需要多个运行时槽位
## 其他顶层 `api` 字段
除了 `api.runtime` 之外API 对象还提供:
| 字段 | 类型 | 描述 |
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- |
| `api.id` | `string` | 插件 id |
| `api.name` | `string` | 插件显示名称 |
| `api.config` | `OpenClawConfig` | 当前配置快照(如果可用,则为活动的内存中运行时快照) |
| `api.pluginConfig` | `Record<string, unknown>` | 来自 `plugins.entries.<id>.config` 的插件专属配置 |
| `api.logger` | `PluginLogger` | 作用域日志记录器(`debug`、`info`、`warn`、`error` |
| `api.registrationMode` | `PluginRegistrationMode` | 当前加载模式;`"setup-runtime"` 是完整入口启动/设置之前的轻量预启动/设置窗口 |
| `api.resolvePath(input)` | `(string) => string` | 解析相对于插件根目录的路径 |
| 字段 | 类型 | 说明 |
| ------------------------ | ------------------------- | -------------------------------------------------------------------------------------------- |
| `api.id` | `string` | 插件 id |
| `api.name` | `string` | 插件显示名称 |
| `api.config` | `OpenClawConfig` | 当前配置快照(如果可用,则为活动的内存中运行时快照) |
| `api.pluginConfig` | `Record<string, unknown>` | 来自 `plugins.entries.<id>.config` 的插件专用配置 |
| `api.logger` | `PluginLogger` | 作用域日志记录器(`debug`、`info`、`warn`、`error` |
| `api.registrationMode` | `PluginRegistrationMode` | 当前加载模式;`"setup-runtime"` 是完整入口启动 / 设置之前的轻量级启动 / 设置窗口 |
| `api.resolvePath(input)` | `(string) => string` | 解析相对于插件根目录的路径 |
## 相关内容
- [SDK 概览](/zh-CN/plugins/sdk-overview) -- 子路径参考
- [SDK Entry Points](/zh-CN/plugins/sdk-entrypoints) -- `definePluginEntry` 选项
- [插件内部机制](/zh-CN/plugins/architecture) -- 能力模型注册表
- [SDK 入口点](/zh-CN/plugins/sdk-entrypoints) -- `definePluginEntry` 选项
- [插件架构内部机制](/zh-CN/plugins/architecture) -- 能力模型注册表