使用多角色会话
在一个 Live API 房间中创建多个角色,映射它们的媒体,切换活动角色,并安全更新名册。
创建一个包含多个角色实例的 Live API 房间,并将每个用户轮次路由到一个活动角色。即使两个条目使用相同的角色 ID,角色实例仍可独立寻址。
若要让多个实例同时回答同一条消息,请使用 group_chat: true 创建房间并使用 group-address 进行寻址,而不是切换活动角色。参见 构建群聊.
前提条件
一个可访问 Live API 和多角色会话的 Convai API 密钥
API 密钥可访问的一个或多个角色 ID
一个稳定的、非空的
end_user_id用于每个真人参与者一个可发布音频并接收远程音轨和数据消息的 LiveKit 客户端
设置 LIVE_API_URL 设置为 https://live.convai.com 。
创建并加入房间
发送一个有序的 characters 数组到 POST /connect。第一个条目成为初始活动角色。重复一个 character_id 会创建该角色的另一个可独立寻址实例。
curl --request POST "${LIVE_API_URL}/connect" \
--header "X-API-Key: ${CONVAI_API_KEY}" \
--header "Content-Type: application/json" \
--data '{
"characters": [
{ "character_id": "11111111-1111-4111-8111-111111111111" },
{ "character_id": "22222222-2222-4222-8222-222222222222" },
{ "character_id": "11111111-1111-4111-8111-111111111111" }
],
"connection_type": "audio",
"end_user_id": "learner-42",
"shared_session_key": "safety-training-42",
"max_num_participants": 2
}'每个 characters 响应中的条目代表一个角色实例。这个简化响应显示了两个条目;完整响应包含每个请求实例对应的一个条目,以及标准的 /connect 字段:
使用 room_url, room_name,并且 token加入返回的 LiveKit 房间。另一个人可以通过调用 /connect ,并将 mode: "join"、一个新的 end_user_id以及恰好一个房间定位器来加入同一房间:
您可以使用 shared_session_key 代替 room_session_id。加入现有房间时不要重新发送 characters 。
映射每个角色实例
将这些标识符用于不同任务:
character_id
标识 Convai 角色定义。它可以在一个房间内重复。
membership_id
寻址一个具体的角色实例以便定位或移除。
participant_identity
将该角色实例与其 LiveKit 参与者和媒体轨道对应起来。请将该值视为不透明值。
character_session_id
在后续会话中继续该角色实例的对话。
从 characters[].participant_identity构建媒体映射。不要通过 character_id来匹配 LiveKit 音频轨道,因为克隆的角色实例共享相同的角色 ID。
等待 bot-ready 消息,针对每个可用的角色实例,在启用与其交互之前先等待。其 data.about 对象标识已就绪的实例:
切换活动角色
只有活动角色会处理用户的对话输入。通过 LiveKit 数据通道发送 interaction-target 以切换目标:
成功的 server-response 会返回当前目标和一个新的 route_epoch:
保存返回的 epoch,并在下一次目标更改时将其作为 expected_route_epoch 发送。设置 target_membership_id 设置为 null 以清除活动目标;在您选择另一个角色之前,对话输入不会路由到任何角色。
更新 roster
发送 character-roster-update 以在不创建新房间的情况下添加或移除角色实例:
通过 membership_id来表示移除,而不是 character_id。如果您移除了活动实例,请将 replacement_target_membership_id 设置为仍留在房间中的一个已就绪实例。成员列表不能为空。
成功时, server-response 包含 已添加的, removed_membership_ids, active_membership_id, route_epoch,以及新的 roster_epoch。请保存这两个返回的 epoch。新实例会在启动并准备就绪时发出 character-status 消息,随后发出它们自己的 bot-ready 消息。被移除的实例会发出 character-removed.
验证与排障
在发送对话输入之前,请验证:
每个预期实例都有唯一的
membership_id和participant_identity.partial_dispatch为false,或者您的客户端已经使用其provisioning_status和failure_code.每个可用实例都已经发出
bot-ready.每个远程音频轨道都通过
participant_identity.最新成功的
route_epoch和roster_epoch用于后续命令。
一个角色的两个副本解析为同一个客户端对象
客户端按 character_id.
按 membership_id映射每个实例,并按 participant_identity.
目标或成员列表命令返回了 epoch 错误
另一个已接受的命令先更改了房间状态。
重新加入房间以刷新它,然后使用当前 epoch 和新的命令 ID 重试。
某个角色始终未变为就绪
其配置失败或仍在进行中。
检查 provisioning_status, failure_code,并且 character-status;在其变为就绪之前,不要将输入路由给它。 bot-ready.
加入请求被拒绝
房间定位器、参与者上限或账户访问无效。
只发送一个定位器,验证房间处于活动状态,并确认账户限制。
为每个新命令使用唯一的 id 。如果传递是否成功不确定,请使用相同的 ID 和不变的负载重试同一命令,以便服务器能够安全地识别重复项。
后续步骤
构建群聊多角色会话Connect API客户端到服务器的消息服务器到客户端的消息最后更新于
这有帮助吗?