跳转至

工具和模式

面向代理的工具操作、会话状态字段,以及 agent 和 bidi 回话模式。属于 Google Meet 插件 指南的一部分。

工具

代理使用 google_meet 工具:

{
  "action": "join",
  "url": "https://meet.google.com/abc-defg-hij",
  "transport": "chrome-node",
  "mode": "agent"
}
action 用途
join 加入显式 Meet URL
create 创建 space(默认加入);支持 accessType/entryPointAccess
status 列出活动会话,或按 sessionId 查看其中一个
setup_status 运行与 googlemeet setup 相同的检查
resolve_space 通过 spaces.get 解析 URL/代码/spaces/{id}
preflight 验证 OAuth 和会议解析前置条件
latest 查找该会议的最新会议记录
calendar_events 预览带有 Meet 链接的 Calendar 事件
artifacts 列出会议记录以及参与者/录音/转录/智能笔记元数据
attendance 列出参与者及参与者会话
export 写入 artifacts/attendance/transcript/manifest 捆绑包;设置 "dryRun": true 仅生成 manifest
recover_current_tab 聚焦/检查现有 Meet 标签页,而不打开新标签页
transcript 读取有界的字幕转录;sinceIndex 从上一个 nextIndex 继续
participation_context 读取会话当前可用的原生操作以及新观察到的源引用
participate 使用稳定的 requestId 和 participationAction 执行受支持的原生操作
leave 结束会话(Chrome 点击 Leave;仅关闭其打开的标签页;Twilio 挂断)
end_active_conference 结束 API 管理的 space 的活动 Google Meet 会议
speak 给定 sessionId 和 message,让实时代理立即说话
test_speech 创建/复用会话,触发已知短语,返回 Chrome 健康状态
test_listen 创建/复用仅观察会话,等待字幕/转录变化

test_speech 始终强制 mode: "agent" 或 "bidi",如果要求在 mode: "transcribe" 下运行则会失败,因为仅观察会话不能发出语音。speechOutputVerified 要求在该输出期间同时存在新的实时输出字节,以及原生虚拟麦克风捕获路径上匹配的非静音波形。对于生成的输入命令,参与者输入与浏览器播放分开捕获;显式输入命令保留其配置的捕获路径。复用会话的旧输出或回环信号不计入,仅 sink 字节增长也不会报告已验证语音。这验证了本地麦克风注入;需要第二位参与者来确认远程可听性。

对于 Chrome 传输,leave 在点击 Meet 的 Leave 通话按钮后,会保持复用的用户拥有的标签页打开。OpenClaw 打开的标签页会在离开后关闭。

当 Chrome 运行在 Gateway 主机上时,使用 transport: "chrome";当它运行在配对节点上时,使用 transport: "chrome-node"。在这两种情况下,模型提供商和 openclaw_agent_consult 都运行在 Gateway 主机上,因此模型凭据保留在那里。代理模式日志包括桥接启动时解析的转录提供商/模型,以及每次合成回复后的 TTS 提供商/模型/语音/输出格式/采样率。原始 mode: "realtime" 仍作为 mode: "agent" 的旧版兼容性别名被接受,但不再在工具的 mode 枚举中宣传。

使用 API 支持的房间和显式访问策略的 create:

{
  "action": "create",
  "transport": "chrome-node",
  "mode": "agent",
  "accessType": "OPEN"
}

结束已知房间的活动会议:

{
  "action": "end_active_conference",
  "meeting": "https://meet.google.com/abc-defg-hij"
}

在认领会议之前进行先听验证很有用:

{
  "action": "test_listen",
  "url": "https://meet.google.com/abc-defg-hij",
  "transport": "chrome-node",
  "timeoutMs": 30000
}

按需说话:

{
  "action": "speak",
  "sessionId": "meet_...",
  "message": "Say exactly: I'm here and listening."
}

status 在可用时包括 Chrome 健康状态:

字段 含义
inCall Chrome 似乎位于 Meet 通话内
micMuted 尽力而为的 Meet 麦克风状态
字段 含义
manualAction.reason / manualAction.message 浏览器配置需要手动登录、Meet 主持人准入、权限或浏览器控制修复,语音功能才能生效
speechReady / speechBlockedReason / speechBlockedMessage 受管理的 Chrome 语音当前是否允许;speechReady: false 表示 OpenClaw 未发送开场/测试短语
providerConnected / realtimeReady 实时语音桥接状态
lastInputAt / lastOutputAt 从桥接接收/发送到桥接的最后音频
audioInputRouted / audioInputDeviceLabel Meet 的麦克风是否为已验证的原生虚拟音频输入
audioOutputRouted / audioOutputDeviceLabel 参与者播放是否路由到提供方;受管理的浏览器捕获报告 Isolated browser playback
lastOutputLoopbackAt / outputLoopbackSignalBytes 在虚拟麦克风捕获路径上完成波形指纹关联的新输出
lastOutputLoopbackCorrelation 将捕获信号与当前助手输出代关联的关联分数
outputGeneration / verifiedOutputGeneration 单调递增 ID;相等表示当前输出(而非较早的语句)通过了回环证明
lastOutputLoopbackRms / lastOutputLoopbackPeak 最新已验证回环捕获块的音频能量诊断
lastSuppressedInputAt / suppressedInputBytes 被旧版混合回环回声保护忽略的输入;隔离浏览器输入在播放期间不会被抑制

原生参与请求

在调用 participate 之前,先使用 sessionId 调用 participation_context。它仅列出当前受跟踪浏览器会话中可用的能力;空列表表示没有可用的原生操作。平台必须在运行时通告其能力之前提供原生实现。Twilio 不支持浏览器参与操作。

在 participationAction 中传递已通告的操作对象,并在检查不明确响应时复用相同的 requestId。复用该 ID 绝不会重复执行效果。uncertain 结果表示效果可能已经发生;不要生成新 ID 来重试。存储的结果在离开后仍可读,但不允许对已关闭的会话执行任何新操作。

对于已分发的浏览器操作,取消是尽力而为的。如果会议结束或源权限在传递期间发生变化,效果可能在运行时检测到该变化之前发生。uncertain 结果并不确认操作已被取消;不要使用新的请求 ID 重试。

传入的聊天或字幕请求必须保留其观察者签发的 sourceId。工具调用方不得移除它,从而将会议输入变成无关的操作员命令。源在首次观察后两分钟过期;临时文本、编辑、自身回声和页面更改会使旧引用失效。编辑保留其原始顺序,并且不会成为新的邀请。直接操作员命令可以省略 sourceId。

参与上下文最多保留 1,024 个活动源,并使用其原始观察顺序进行容量决策。达到容量时,重新读取较早的历史不会替换较新的保留源。较新的合格观察仅替换最旧的保留源。未更改的保留源保留其引用和活动保护;重新读取它们不会延长两分钟的生命周期。

保留的字幕行还携带独立的观察来源信息,包括观察到的说话者标签和原生 self/other/unknown 标记。相同文本不会在参与者之间转移这些事实。历史、临时、自身回声以及不符合容量条件的行即使没有可操作的 source,也会保留其来源信息。重复 DOM 行消失不会最终确定另一个活动副本。最新保留的快照不是中间编辑的完整日志。

被拒绝的请求可能返回 correctionOf。它允许一次更正请求,使用新的 requestId、该确切的 correctionOf,以及相同的源和操作类型。它不允许重试不确定的效果或更改授权者。尝试和结果使用现有的 SQLite 插件状态存储。历史是有界的:达到容量时,最旧的已关闭会话行会被回收。活动声明永远不会过期或被驱逐以允许另一个操作;已丢弃的已关闭请求保持非活动状态,并且无法再次运行。已知的插入前容量拒绝允许在有界清理之后进行一次新的原子准入尝试,包括当另一个请求回收了相同行时。未知写入结果永远不会自动重试。

代理与双向模式

模式 谁决定回答 语音输出路径 使用场景
agent 已配置的 OpenClaw 代理 常规 OpenClaw TTS 运行时 当你希望实现“我的代理在会议中”的行为
模式 谁决定回答 语音输出路径 适用场景
bidi 实时语音模型 实时语音提供商音频响应 希望获得最低延迟的对话语音循环

agent 模式:实时转录提供商接收会议音频,最终参与者转录内容会路由到已配置的 OpenClaw 代理,回答通过常规 OpenClaw TTS 朗读。咨询前会合并附近的最终转录片段,因此一次语音轮次不会生成多个过时的部分回答。TTS 期间,隔离的浏览器输入仍然可用;只有具有混合回环输入的旧版传输方式会保留播放和转录回声抑制。

bidi 模式:实时语音模型直接回答,并将更深入的推理、当前信息或常规 OpenClaw 工具委托给已配置的代理。支持函数工具的提供商使用 openclaw_agent_consult;GPT-Live 通过 Discord 和 Talk 相同的 Gateway 语音运行时使用原生委托。两条路径都会保留会议上下文和 realtime.toolPolicy。最终回答由实时语音模型朗读。

对于使用 Cove 的 GPT-Live,请使用 Live 配置。Live 负责响应时序和打断:播放期间,传入的参与者音频保持开放,OpenClaw 不会添加本地打断检测器,也不会等待响应完成事件来播放简短回复。停止会议或替换提供商会话会取消活动委托并忽略迟到结果。

默认情况下,咨询运行在 main 代理上;设置 realtime.agentId 可将 Meet 通道指向专用的代理工作区、模型默认值、工具策略、记忆和会话历史。代理模式下的咨询使用按会议划分的 agent:<id>:subagent:google-meet:<session> 会话键,以便后续问题保留会议上下文,同时继承常规代理策略。当代理在代理模式下调用 google_meet 时,咨询会话会在回答参与者语音之前分叉调用者当前的转录;Meet 会话保持独立,因此会议后续问题不会直接修改调用者的转录。

realtime.toolPolicy 控制咨询运行:

策略 行为
safe-read-only 允许委托;将常规代理限制为 read、web_search、web_fetch、x_search、memory_search、memory_get
owner 允许使用常规代理的常规工具策略进行委托
none 不暴露咨询工具;拒绝原生 Live 委托

咨询会话键按 Meet 会话划分范围,因此同一会议中的后续咨询调用会复用之前的咨询上下文。

在 Chrome 完全加入后,强制进行语音就绪检查:

openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."

完整的加入并语音冒烟测试:

openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
  --transport chrome-node \
  --message "Say exactly: I'm here and listening."

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw