Live Voice 工作会话接入
翻译说明: 本页与英文源规格对应。代码、协议字段和标识符保留原文;如翻译与英文事实存在差异,以英文版本为准。
状态:实施中;只有完成交付计划中的自动化和手工验证后,才能视为验收完成。Live Voice Provider 绑定与工作会话绑定是两个独立作用域。
目的
Live Voice 可以通过现有后端向 PI-Desktop 会话提交有界工作请求。若 Composer 当前有会话,通话开始时默认以该会话为工作目标;用户可在通话中通过语音切换目标。Live Provider 负责语音交流;现有 Agent Runtime 继续在目标会话当前模型和权限策略下执行文件、Shell、MCP、插件、Skill 和子代理工作。
作用域与授权
- Composer 当前有会话时,启动请求会将其作为默认
workTarget;没有当前会话时,通话以未绑定状态开始,用户可在通话中列出并语音选择目标。Main 会用最新的 Desktop/Native Pi/Remote 会话目录重新校验目标;缺失或重名时失败关闭。 - 不需要逐通开启“允许工作请求”,也不要求开始前先语音列出并选择会话。语音工作请求仍只是候选请求;目标后端继续执行原有身份、准入、权限和审批规则。Provider 工具请求不能指定原始会话 ID、项目路径、模型、模式或权限。
- 语音切换目标只影响后续请求;既有操作仍关联原会话。打开另一个会话供界面查看,不会暗中改变工作目标。
- 上下文共享仍是独立、默认关闭的通话同意。启用后,分类器只可读取当前工作目标中有界的纯文本历史;切换目标后,可读取的会话随之改变。关闭后不读取历史消息。该同意不授予执行权限,也不会持久化。
- 工作请求可以触达
Computer工具,但只能作为目标会话自己的 Agent 轮次,且只能在用户已于桌面 UI 签发的作用域授权内进行。口述请求可以请求授权而永不签发授权,不能选择或扩大目标,并在 Plan 与 Goal 中被直接拒绝(见电脑操作)。
候选请求与路由
每个 Provider 只暴露 delegate_to_work_session({ instruction })。Main 校验工具名和参数,冻结通话作用域,登记有界操作身份,并在意图分类或 Agent 受理前返回简短的 received / not_started 回执。同一 Provider 请求 ID 不会重复派发;同 ID 的不同内容会被拒绝。WebSocket 回执和工作反馈只有在 socket 写入回调成功后才报告为本地已发送;连接关闭、取消、发送错误或超过一秒写入时限均报告未送达。初始回执未送达时,不进行分类或 Host 准入。这不代表远端服务已经处理消息,也不代表用户实际听到内容。
只读的一次性分类器使用所选工作会话的配置模型,且不提供工具。严格校验后的输出进入确定性路由。普通对话和状态查询不会创建回合。只有对观察到的活动回合提出明确约束时才可 steer 该回合。明确独立的任务进入 Host 自有队列。路由含糊、目标回合过期或会话不可用时会失败关闭;steer 失败不会降级为 prompt 或 queue。结果查询读取本次通话最近一个已终态操作,或明确引用的操作,并在不启动新回合的情况下显示其有界摘要。当绑定会话恰好有一个待回答的 AskTool 提问时,分类器同时收到该提问及其自带选项,Provider 也会以 interaction-required 反馈收到同一有界问题以便朗读。用户的回答按 respond-input 控制请求路由,而不是当作工作:它通过 Host 自有输入路径解决该问题,绝不创建、steer 或排队任何回合。开着的提问中每个问题都必须恰好回答一次,且每个所选标签必须是该问题自己提供的标签之一;自由文本回答、未知标签、只回答一部分、以及会话没有或同时有多个待答提问都会被拒绝并给出真实原因且不重试;派发结果未知时保持 unknown,绝不重发。
可靠性与准入身份
Main 在登记 Provider 候选请求时同步捕获活动回合。显式 null 表示“没有观察到活动回合”;stop 和 steer 不会改指向之后启动的回合。重复 Provider 请求 ID 会复用原操作和原观察目标。通过校验的 stop 使用预留控制分类通道并推进屏障:尚未跨过 Host 准入边界的较早写操作会被撤回;已经开始派发的写操作保持未知状态,直到只读 Host 证据完成核对。
普通新任务采用忙时拒绝准入。只有明确的 queue 意图或分类器确认独立的任务才进入 Host 队列。AgentHost 会在最终回合/队列准入边界重新检查 Main 保存的私有工作区身份与最新会话元数据。身份不匹配时会在创建 prompt 或队列条目前返回 WORKSPACE_CHANGED。空闲时的显式 enqueue 会要求 AgentHost 排空现有队列;恢复后仍被挂起的队列条目继续保持挂起。
分类器调用有 8 秒截止时间并接收取消信号;快照读取和单次 Host 派发等待均有时限。Host 写操作已发出但结果未知时,操作会标记为 unknown,只通过精确的只读身份查询核对,绝不重新提交。通话关闭会撤回尚未派发的候选请求;正在准入的操作保持未知状态,已接受工作继续由 Host 持有。UI 分别显示分类无效、分类超时、调用方撤回、回执未送达、作用域变化、Host 拒绝和派发未知。
准入摘要与终态结果彼此分开。匹配的终态事件可以解决未知准入,且不会被迟到的 ACK 降级。任务结果只关联到精确回合上的写操作;stop 操作保留自己的控制确认,并将停止目标回合单独保存在 targetTurnId 中,因此 stop 行不会变成任务执行/结果行。通过该控制操作发起的显式结果查询,在可能时解析到关联的写操作。Main 结果读取器会对精确终态回合进行有界历史重读,并排除子代理和工具消息。若无法读取符合条件的根 Agent 助手结果,则标记为不可用。
项目/会话查询使用 Host 元数据,最多返回 20 个带标签的选项,并附带仅在当前 call 与 binding revision 内有效的 opaque selectionRef。引用 60 秒后过期,不暴露项目路径或会话 ID。唯一标签的会话通过现有 Renderer 导航打开;重复标签必须在面板中明确选择。只能从已列出的注册项目创建会话,并且必须由用户点击面板操作确认。打开或创建会话都不会更改当前工作绑定。
现有 Host 与 Agent 的所有权
工作提交复用现有 AgentHost 和已注册的 Agent handler。Host 队列仍是唯一队列,并继续执行已有容量、顺序、投递和取消语义。语音用户消息带有可选 voiceOrigin,其中包含 call 和 operation ID。没有该元数据的旧消息继续有效。
停止和 abort 请求带有观察到的 turn ID,并在实际运行时所有者处校验。结束 Live 通话会关闭候选作用域和媒体,但不会取消已经被 Agent 或 Host 队列接受的工作。权限、Plan 和 Goal 审批继续走原有桌面 UI 和策略路径;口头“同意”永远不构成审批。AskTool 提问也可以由语音回答,但必须遵守下面的“只选既有选项”规则。
只有 Host 权威 turn-terminal 事件才能结算 Live 操作。消息完成、工具输出或 Provider 回复结束都不能证明工作已完成。缺少证据时保持未知;仅凭 completed 不能推断测试通过。
UI 与当前能力边界
Live 面板显示当前工作目标、有限上下文共享状态、操作 admission/execution 状态、反馈投递状态、有界路由或拒绝原因、精确终态摘要和短期项目/会话选项。Composer 当前会话默认作为初始目标;没有当前会话时,用户可在通话中语音选择。用户也可查看目标会话、打开已列出的会话、在已列出的项目中新建会话、停止观察到的运行回合或取消精确队列项。创建会话沿用现有默认值,不改变当前 Live 绑定。
当绑定的工作会话在等待用户决策时,两个 Live 界面都会显示该请求,因为作出决定的卡片位于该会话自己的 Composer 中,而不在通话里。紧凑条持续显示“等待你的决定”提示;详情面板显示请求本身——asktool 的问题文本(有界纯文本)、等待授权的工具,或等待审批的计划——并提供一个会打开该精确绑定会话并关闭详情的操作。其他会话的待决请求绝不会被当作绑定会话的请求显示;未绑定通话不显示任何内容。当后端状态显示会话正在等待、但该 Renderer 已不再持有请求(Renderer 重载,或请求在订阅之前到达)时,详情仍会以通用文案提供同一操作。面板和紧凑条绝不代替用户回答或授权:它们不提供批准或回答控件,请求内容只作为展示数据,任何面板操作都不能解决权限、Plan 或 AskTool 请求。用语音回答 AskTool 提问是另一条只允许选择既有选项的路径(见上面的路由章节)。
工作反馈与播报策略
Host 反馈与工作执行分开排队,最多 8 项、按身份去重并在溢出时合并。收到回执只作为 context,不自动朗读。自动状态与结果播报需同时等待 Provider 生成完成、用户停止讲话、本地播放空闲,再经过 700 ms 静默窗口和至少 3 秒播报间隔。超过 15 秒的反馈仍留在面板并降级为 context-only。静默模式只抑制主动语音播报,不停止工作;用户明确查询状态或结果时仍可播报。反馈投递失败单独显示,不能重发工作请求。
Gemini Live 与 Realtime 用 PCM 输出 credit 归还来判断本地播放队列排空。Codex 工作通话把远端音频元素接入本地 Web Audio analyser,并观察其输出采样;若监视器无法建立或 AudioContext 没有运行,自动反馈会保持等待。该信号只能证明 Renderer 在输出设备之前存在音频活动,不能证明用户实际听见;各 Provider 和设备仍需按交付计划进行实机验收。
隐私与资源上限
- Provider 传入的路径、会话身份、原始 IPC 操作、权限标记和任意工具 schema 都不能越过工作边界。
- 上下文投影只包含经过过滤的有界普通用户/助手文本;工具输出、附件和此前的语音来源消息都会排除。
- Live 字幕只保存在临时内存,不会作为工作会话消息插入。
- 通话取消只控制未受理候选和 Live 反馈,不作为 Agent 取消信号。
- 每通话候选身份和操作视图均有上限,并在通话结束时丢弃。已接受的队列条目和用户消息来源元数据由现有 Host 持久化机制负责。
验证参考
实现和测试证据见live-work-evidence.md。代表性用户路径与自动化覆盖状态见端到端测试计划。