基于Telnyx Edge Compute构建实时AI客服督导系统,主管可监控通话流、发送私有提示词干预助手行为、在必要时接入通话;系统内置敏感信息重复检测触发身份核验策略。
大多数语音 AI 质检都是在通话结束后才进行的。转录文本被存储起来,之后有人会抽检一小部分,而任何错误在此之前早已触达了客户。
如果一位督导能够在 AI 客服通话进行的同时观看对话内容、向助手发送私密的指导指令,并在需要人工帮助时加入同一场对话呢?
这正是 Live Support Coach Room 示例所演示的功能。它是一个运行在 Telnyx Edge Compute 上的 TypeScript 应用,具备以下能力:
本教程聚焦于架构本身,以及如何在本地和 Telnyx Edge 上最快地探索它。
该应用使用两个浏览器标签页:
呼叫方模拟器创建对话并提交呼叫方或助手的话轮。
督导仪表板列出活跃房间、流式传输转录文本、展示策略标记,并暴露一个升级按钮。
试着在模拟器中两次输入同一个账号。房间会检测到呼叫方在未经验证身份的情况下重复提供了敏感账户信息,并向助手注入一条指导指令,要求其验证呼叫方的出生日期。
同一房间随后可以拨打督导电话,将该人员加入到活跃的 AI 对话中。
整体流程如下:
AI Assistant event stream
|
v
AssistRelay
|
v
CoachRoom for this conversation
| | |
| | +--> Call Control + WebRTC escalation
| +--------------> coaching policy + injected nudge
+-------------------------> supervisor dashboard WebSocket
助手的 websocket_settings 指向应用的 /agents/assist 端点。Telnyx 为每个对话打开一个 WebSocket 并发送如下事件:
session.created
conversation.item.created
response.text.delta
telnyx.call.answered
telnyx.call.hangup
session.ended
此套接字监听对话并可以注入文本话轮,但不承载通话媒体,也不会替代模型。
这一区分至关重要。如果辅导应用不可用,通话仍会继续。呼叫方不会因为监控层崩溃而丢失音频。
对话事件流文档将其描述为实时旁路通道。它目前处于 beta 阶段,客户端应忽略无法识别的事件类型,因为可能出现新增类型。
该流也不是一个有保障的转录归档。套接字不可用期间发生的事件不会被重放。请将其用于实时监督,事后需要完整系统记录转录时请使用 Conversations API。
使用已部署的 WebSocket URL 配置助手:
curl -X POST "https://api.telnyx.com/v2/ai/assistants/$ASSISTANT_ID" \
-H "Authorization: Bearer $TELNYX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"websocket_settings": {
"enabled": true,
"url": "wss://live-support-coach-room-<id>.telnyxcompute.com/agents/assist",
"auth_ref": "<your-integration-secret-reference>"
}
}'
auth_ref 指向一个集成密钥。Telnyx 解析它并在打开 WebSocket 时将值作为 bearer 令牌发送。
应用在 /agents 下挂载了两个 Agent SDK WebSocket 层面:
const handleAgents = mountAgents<Env>((env) => ({
assist: env.RELAY,
"coach-room": env.COACHROOMS,
}));
/agents/assist 接收助手事件流。在 session.created 时,中继使用对话 ID 来定位该对话的 CoachRoom actor。
每个房间拥有且仅拥有一个对话的状态:
一个持久的沉默计时器
这非常适合有状态 actor:actor 身份即对话身份,相关事件由同一个持久化实例处理。
独立的 CoachRegistry actor 追踪仪表板选择器所需的活跃和已结束的房间。
督导连接到:
wss://<function-host>/agents/coach-room/{conversation_id}
当督导打开一个房间时,仪表板先收到其当前状态,然后持续跟随实时更新。这意味着在半途加入通话的督导可以看到打开仪表板之前发生的事,而不是从空白屏幕开始。
应用还暴露了常规 HTTP 路由。
房间监听对话事件并评估一个刻意精简的策略。当规则触发时,它会通过助手流发送一个 conversation.item.create 帧回来。
从概念上讲,该帧如下所示:
{
"type": "conversation.item.create",
"item": {
"type": "message",
"role": "assistant",
"content": [
{
"type": "input_text",
"text": "Verify the caller's date of birth before sharing account details."
}
]
}
}
该指令成为实时对话上下文的一部分,允许助手改变方向而无需结束或重启通话。
两个设置约束了该策略:
NUDGE_MAX_PER_CALL=3
SILENCE_SECS=90
第一个防止过度积极的策略淹没一个对话。第二个在长时间沉默后安排一次签到。当收到 session.ended 时沉默监听器会被取消。
对于生产部署,可以将这个简单规则替换为合规语言、身份验证、升级风险或异议处理方面的策略。
当督导点击 Escalate to supervisor 时,房间会:
创建到配置的督导设备的 outbound 通话
使用 ai_assistant_join 将该通话分支加入到活跃的 AI 对话中
通过 Telnyx WebRTC SDK 在浏览器中接听来电
软电话在加入成功后才接听并取消静音。这避免了向呼叫方暴露设备设置噪音。
人工作为另一个参与者加入现有对话,而不是收到一个冷转接。Telnyx 的多方通话文档涵盖了向活跃 AI 通话添加人员的更广泛模式。
内置模拟器是理解状态流的最快方式,因为它不需要电话通信。
克隆并安装项目:
git clone https://github.com/team-telnyx/telnyx-code-examples.git
cd telnyx-code-examples/live-support-coach-room
npm install
创建你的环境文件:
cp .env.example .env
认证并准备 Edge 函数:
telnyx-edge auth api-key set <your_telnyx_api_key>
telnyx-edge new-func -l ts -n live-support-coach-room --from-dir .
telnyx-edge types
npx tsx smoke_test.ts
telnyx-edge ship
然后从已部署函数打开这些页面:
https://<function-host>/caller
https://<function-host>/dashboard
在 caller 标签中发起一个模拟通话。两次输入账号,然后观察策略标记和辅导指令出现在仪表板中。
模拟辅导流程不需要通话,但实时升级需要以下 Edge 密钥:
telnyx-edge secrets add TELNYX_API_KEY "<your-key>"
telnyx-edge secrets add COACH_AUTH "<integration-secret-value>"
telnyx-edge secrets add CALL_CONTROL_CONNECTION_ID "<connection-id>"
telnyx-edge secrets add TELNYX_NUMBER "+1555XXXXXXXX"
telnyx-edge secrets add SUPERVISOR_DEVICE "+1555XXXXXXXX"
在源码管理中使用占位符,将真实值存储为密钥。浏览器软电话还需要督导在运行时提供的 WebRTC 登录令牌。
本示例演示了架构,但生产级教练房间还应添加:
核心设计仍然成立:将可观测性保持在媒体路径之外,给每个对话一个持久化所有者,并将人工干预作为一等通话参与者。
同样的结构可以支持远不止客户服务辅导的场景:
你可以保留底层架构,把 CoachRoom 内部的策略替换成对你的应用真正重要的规则。
Live Support Coach Room 源代码
Conversation event stream
Multi-participant Voice AI calls
Join an AI assistant conversation
WebRTC JavaScript SDK