模块 XVI —— 语音与实时 agent
模块 XVI 治理对话式与实时 agent。它是一个观察与治理平面:它不重新实现语音 SDK (Realtime API、WebRTC、ASR 或 TTS),也从不自己开启媒体流。它决定谁可以开启一个语音会话、 使用哪个模型和提供方、在哪条策略下,并跟踪该会话的元数据——绝不跟踪其内容。
开启一个语音接口被视为一个特权操作,而非一项自由操作。策略是默认 DENY:
一个没有任何允许策略的会话会被拒绝。一次开启是两阶段的,并通过
审批门进行 human-in-the-loop 门控;它绑定到一个 plan_hash,
因此一次审批不能被静默升级为一个更强的模型(anti-TOCTOU),归属于真实主体审计
(绝非 system),并以仅追加方式留存证据。模块本身从不调用提供方——
执行经由一个单独的分发接缝离开。
另一半是观察:本模块只跟踪会话元数据——派生状态(live/idle/ended,在读取时由活动新近度计算, 不存储生命周期列)、轮次计数、时长、延迟(来自真实样本的诚实平均值与最大值),以及 BCP-47 语言。 据此它提出治理 finding:当遥测命名了一个没有任何策略允许的 agent/模型/提供方时提出一条策略违规, 当延迟越过某条策略 SLA 时提出一条延迟降级 finding,以及当尝试开启而没有配置任何门时提出一条 未治理开启 finding——该缺口被暴露,且该开启仍被拒绝。
本模块在共享数据模型中声明了三个实体:
| 实体 | 可变性 | 用途 |
|---|---|---|
| session | 可变(upsert) | 会话元数据;零内容 |
| policy | 可变 | 治理声明——谁可以用哪个模型/提供方开启(默认 DENY) |
| decision | 仅追加 | 开启/关闭决策的不可变 ledger |
一条策略按 agent、允许的模型和允许的提供方匹配(各项可为具体值或通配符),并带有可选的
会话分钟数与延迟 SLA 边界。没有匹配策略即表示 DENY。 decision ledger 记录每个 open_request、
open 和 close,连同其策略裁决、门状态和结果状态。读取访问需要 viewer 角色及以上;
声明一条策略和开启一个会话是管理性的、租户级的、受审计的操作。这些模块路由发布在
独立的 beta 模块路由参考中,而非稳定核心契约中——
它们的字段级形状存在于产品的类型化接口中。
此处没有金额;FinOps(模块 XI)拥有成本。
它消费什么、产出什么
Section titled “它消费什么、产出什么”本模块拥有一个 deny-closed 的摄取接缝——它自己的 voice.telemetry.observed 事件——
一个进程内探针将通过它馈送会话元数据。该传输层在构造上即为最小数据:遥测解析器携带一份
允许列表,并在看到一个被禁止的键时拒绝整个事件,因此任何音频、文字记录文本、ASR/TTS 文本、
prompt/响应内容或说话者 PII 都绝不会被持久化。唯一保留的文字记录信号是一个外部文字记录定位符的
单向哈希——证明文字记录存在,而绝非文字记录本身。治理 finding 以
finding.reported 的形式在提交之后带着哈希化的细节发出。
一次受治理的开启实时分发:一旦运营方置备了语音分发器,一次获批的开启就铸造一个 服务端临时凭据,并只返回该凭据加上连接坐标——模型、语音、工具和轮次检测从策略固定, 绝不来自客户端,而提供方的主密钥绝不离开服务器。没有该置备,分发接缝就处于 deny-closed: 一次获批的开启会被诚实地记录为“已声明,未开启”,而非被伪造。
- 模块目录 —— 模块 XVI 所处的位置及其执行状态。
- 事件总线参考 ——
finding.reported携带语音 finding。 - 模块 IV —— 编排 —— 同类分发接缝(实弹)。
- 模块 X —— 模型与提供方路由 —— 一条策略可能允许哪些模型。
- 治理与审批 —— 实践中的两阶段开启门。
- 诚实与限制 —— 观察/治理/执行的划分。