呼叫等待转接与AI转人工:完整报文
约 4054 字大约 14 分钟
2026-10-16
本页是场景流程的完整 JSON 序列,按图中编号查阅。示例中的分支互斥,不能顺序重放全部报文;实际 ID、截止、SDP、地址和密钥须由运行时取得。实施状态及字段定义仍以场景与命令页为准。
编号报文
M01 · sessionCreate
{
"msgToken": "s13-7",
"method": "sessionCreate",
"params": {
"purpose": "humanCall",
"transport": "webrtc",
"tracks": [
{
"trackId": "mic",
"kind": "audio",
"sourceId": "mic",
"sourceType": "microphone",
"direction": "sendonly",
"codec": "opus",
"state": "requested"
},
{
"trackId": "speaker",
"kind": "audio",
"sourceId": "remote-voice",
"direction": "recvonly",
"codec": "opus",
"state": "requested"
}
],
"targetParty": {
"kind": "device",
"id": "p13:original-device-b"
},
"callType": "voice",
"callPolicy": {
"floor": "shared",
"busy": "waiting"
}
}
}M02 · sessionCreated
{
"msgToken": "s13-7",
"method": "sessionCreated",
"sessionId": "s13-session",
"data": {
"state": "negotiating",
"selected": {
"transport": "webrtc"
},
"tracks": [
{
"trackId": "mic",
"kind": "audio",
"sourceId": "mic",
"sourceType": "microphone",
"direction": "sendonly",
"codec": "opus",
"state": "requested"
},
{
"trackId": "speaker",
"kind": "audio",
"sourceId": "remote-voice",
"direction": "recvonly",
"codec": "opus",
"state": "requested"
}
],
"callGroupId": "cg13"
},
"code": 200
}M22 · sessionInvite
{
"msgToken": "s13-s13-remote-invite",
"method": "sessionInvite",
"sessionId": "s13-remote",
"eventSeq": 1,
"params": {
"purpose": "humanCall",
"transport": "webrtc",
"admission": "accept",
"tracks": [
{
"trackId": "voice",
"kind": "audio",
"sourceId": "microphone",
"sourceType": "microphone",
"direction": "sendrecv",
"codec": "opus",
"state": "requested"
}
],
"expiresAt": 1900000000000,
"callType": "voice",
"callGroupId": "cg13"
}
}M03 · callControl
{
"msgToken": "s13-8",
"method": "callControl",
"sessionId": "s13-session",
"params": {
"operation": "cancel",
"expectedRevision": 0
}
}M04 · callState
{
"msgToken": "s13-8",
"method": "callState",
"sessionId": "s13-session",
"data": {
"state": "cancelled",
"revision": 1,
"reason": "callerCancelled"
},
"code": 200
}M05 · sessionEnded
{
"msgToken": "s13-9",
"method": "sessionEnded",
"sessionId": "s13-session",
"data": {
"state": "ended",
"reason": "callerCancelled"
},
"eventSeq": 1
}M23 · sessionAccept
{
"msgToken": "s13-s13-remote-invite",
"method": "sessionAccept",
"sessionId": "s13-remote",
"params": {
"acceptedTracks": [
"voice"
]
}
}M24 · requestAck
{
"msgToken": "s13-s13-remote-invite",
"method": "requestAck",
"sessionId": "s13-remote",
"code": 200,
"data": {
"requestMethod": "sessionAccept",
"result": {
"state": "negotiating"
}
}
}M06 · mediaOffer
{
"msgToken": "s13-10",
"method": "mediaOffer",
"sessionId": "s13-session",
"params": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP offer>"
}
}
}M07 · mediaAnswer
{
"msgToken": "s13-10",
"method": "mediaAnswer",
"sessionId": "s13-session",
"data": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP answer>"
}
},
"code": 200
}M08 · mediaState
{
"msgToken": "s13-11",
"method": "mediaState",
"sessionId": "s13-session",
"params": {
"mediaRevision": 1,
"state": "connected"
}
}M09 · requestAck
{
"msgToken": "s13-11",
"method": "requestAck",
"sessionId": "s13-session",
"data": {
"requestMethod": "mediaState",
"result": {
"mediaRevision": 1,
"state": "connected"
}
},
"code": 200
}M25 · mediaOffer
{
"msgToken": "s13-s13-remote-offer",
"method": "mediaOffer",
"sessionId": "s13-remote",
"params": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP offer>"
}
}
}M26 · mediaAnswer
{
"msgToken": "s13-s13-remote-offer",
"method": "mediaAnswer",
"sessionId": "s13-remote",
"code": 200,
"data": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP answer>"
}
}
}M27 · mediaState
{
"msgToken": "s13-s13-remote-connected",
"method": "mediaState",
"sessionId": "s13-remote",
"params": {
"mediaRevision": 1,
"state": "connected"
}
}M28 · requestAck
{
"msgToken": "s13-s13-remote-connected",
"method": "requestAck",
"sessionId": "s13-remote",
"code": 200,
"data": {
"requestMethod": "mediaState",
"result": {
"mediaRevision": 1,
"state": "connected"
}
}
}M29 · sessionEstablished
{
"msgToken": "s13-s13-remote-established",
"method": "sessionEstablished",
"sessionId": "s13-remote",
"eventSeq": 2,
"data": {
"state": "established",
"mediaRevision": 1
}
}M10 · sessionEstablished
{
"msgToken": "s13-12",
"method": "sessionEstablished",
"sessionId": "s13-session",
"data": {
"state": "established",
"mediaRevision": 1
},
"eventSeq": 2
}M11 · callControl
{
"msgToken": "s13-13",
"method": "callControl",
"sessionId": "s13-session",
"params": {
"operation": "hold",
"expectedRevision": 0
}
}M12 · callState
{
"msgToken": "s13-13",
"method": "callState",
"sessionId": "s13-session",
"data": {
"state": "held",
"revision": 1
},
"code": 200
}M13 · callControl
{
"msgToken": "s13-14",
"method": "callControl",
"sessionId": "s13-session",
"params": {
"operation": "resume",
"expectedRevision": 1
}
}M14 · callState
{
"msgToken": "s13-14",
"method": "callState",
"sessionId": "s13-session",
"data": {
"state": "active",
"revision": 2
},
"code": 200
}M15 · callControl
{
"msgToken": "s13-15",
"method": "callControl",
"sessionId": "s13-session",
"params": {
"operation": "transfer",
"expectedRevision": 2,
"target": {
"kind": "device",
"id": "p13:candidate-device-c"
}
}
}M16 · callState
{
"msgToken": "s13-15",
"method": "callState",
"sessionId": "s13-session",
"data": {
"state": "transferring",
"revision": 3,
"candidateSessionId": "s13-candidate"
},
"code": 200
}M30 · sessionInvite
{
"msgToken": "s13-s13-candidate-invite",
"method": "sessionInvite",
"sessionId": "s13-candidate",
"eventSeq": 1,
"params": {
"purpose": "humanCall",
"transport": "webrtc",
"admission": "accept",
"tracks": [
{
"trackId": "voice",
"kind": "audio",
"sourceId": "microphone",
"sourceType": "microphone",
"direction": "sendrecv",
"codec": "opus",
"state": "requested"
}
],
"expiresAt": 1900000000000,
"callType": "voice",
"callGroupId": "cg13"
}
}M31 · sessionAccept
{
"msgToken": "s13-s13-candidate-invite",
"method": "sessionAccept",
"sessionId": "s13-candidate",
"params": {
"acceptedTracks": [
"voice"
]
}
}M32 · requestAck
{
"msgToken": "s13-s13-candidate-invite",
"method": "requestAck",
"sessionId": "s13-candidate",
"code": 200,
"data": {
"requestMethod": "sessionAccept",
"result": {
"state": "negotiating"
}
}
}M33 · mediaOffer
{
"msgToken": "s13-s13-candidate-offer",
"method": "mediaOffer",
"sessionId": "s13-candidate",
"params": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP offer>"
}
}
}M34 · mediaAnswer
{
"msgToken": "s13-s13-candidate-offer",
"method": "mediaAnswer",
"sessionId": "s13-candidate",
"code": 200,
"data": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP answer>"
}
}
}M35 · mediaState
{
"msgToken": "s13-s13-candidate-connected",
"method": "mediaState",
"sessionId": "s13-candidate",
"params": {
"mediaRevision": 1,
"state": "connected"
}
}M36 · requestAck
{
"msgToken": "s13-s13-candidate-connected",
"method": "requestAck",
"sessionId": "s13-candidate",
"code": 200,
"data": {
"requestMethod": "mediaState",
"result": {
"mediaRevision": 1,
"state": "connected"
}
}
}M37 · sessionEstablished
{
"msgToken": "s13-s13-candidate-established",
"method": "sessionEstablished",
"sessionId": "s13-candidate",
"eventSeq": 2,
"data": {
"state": "established",
"mediaRevision": 1
}
}M17 · callState
{
"msgToken": "s13-16",
"method": "callState",
"sessionId": "s13-session",
"data": {
"state": "transferred",
"revision": 4,
"candidateSessionId": "s13-candidate",
"requestToken": "s13-15"
},
"eventSeq": 3
}M18 · sessionEnded
{
"msgToken": "s13-17",
"method": "sessionEnded",
"sessionId": "s13-session",
"data": {
"state": "ended",
"reason": "transferred"
},
"eventSeq": 4
}M19 · callState
{
"msgToken": "s13-18",
"method": "callState",
"sessionId": "s13-session",
"data": {
"state": "failed",
"revision": 4,
"candidateSessionId": "s13-candidate",
"reason": "transferRejected",
"requestToken": "s13-15"
},
"eventSeq": 5
}本事件的failed是原requestToken关联的转接操作终态,不是原呼叫组或任一原会话腿的终态;不得随后结束D/D2,原实际媒体与忙线保持。候选拒绝、30秒未接听、首次45秒总窗到期、媒体失败、权限撤销或修订变化均只撤该候选代次;已分配时可携带原candidateSessionId,未分配不能编造ID。及时接听仅切换至原总窗剩余预算,原邀请字节及两项截止不因重投续期;旧邀请计时回调不得撤已接听候选。
发起者撤销候选(不改变原M01至M47编号)
在M16之后、候选实际媒体就绪原子切换之前,D可沿本端s13-session发送以下取消;平台必须核原主体/原转接账本/candidate代次及expectedRevision。此分支只结束候选D3,原D↔D2实际媒体继续;不执行M17/M18,不向原腿发送sessionEnded。不带candidateSessionId的已接通cancel仍按409 invalidState拒绝。
{
"msgToken": "s13-candidate-cancel",
"method": "callControl",
"sessionId": "s13-session",
"params": {
"operation": "cancel",
"expectedRevision": 3,
"candidateSessionId": "s13-candidate"
}
}{
"msgToken": "s13-candidate-cancel",
"method": "callState",
"sessionId": "s13-session",
"code": 200,
"data": {
"state": "active",
"revision": 4,
"candidateSessionId": "s13-candidate",
"reason": "candidateCancelled"
}
}独立callState事件采用同一active/revision/candidateSessionId/reason并带requestToken=s13-candidate-cancel,事件自身使用新msgToken/eventSeq。candidateCancelled是操作结果,不是整体CallPhase。
M20 · callControl
{
"msgToken": "s13-19",
"method": "callControl",
"sessionId": "s-ai",
"params": {
"operation": "escalate",
"expectedRevision": 0,
"target": {
"kind": "service",
"id": "human-support"
},
"shareContext": false
}
}M21 · callState
{
"msgToken": "s13-19",
"method": "callState",
"sessionId": "s-ai",
"data": {
"state": "transferring",
"revision": 1,
"candidateSessionId": "s13-human",
"localSessionId": "s13-human-local",
"callGroupId": "s13-ai-human-group"
},
"code": 200
}M38 · sessionInvite
{
"msgToken": "s13-s13-human-invite",
"method": "sessionInvite",
"sessionId": "s13-human",
"eventSeq": 1,
"params": {
"purpose": "humanCall",
"transport": "webrtc",
"admission": "accept",
"tracks": [
{
"trackId": "voice",
"kind": "audio",
"sourceId": "microphone",
"sourceType": "microphone",
"direction": "sendrecv",
"codec": "opus",
"state": "requested"
}
],
"expiresAt": 1900000000000,
"callType": "voice",
"callGroupId": "s13-ai-human-group"
}
}M48 · sessionInvite
{
"msgToken": "s13-human-local-invite",
"method": "sessionInvite",
"sessionId": "s13-human-local",
"eventSeq": 1,
"params": {
"purpose": "humanCall",
"transport": "webrtc",
"admission": "accept",
"tracks": [
{
"trackId": "voice",
"kind": "audio",
"sourceId": "microphone",
"sourceType": "microphone",
"direction": "sendrecv",
"codec": "opus",
"state": "requested"
}
],
"expiresAt": 1900000000000,
"callType": "voice",
"callGroupId": "s13-ai-human-group"
}
}M56 · sessionReject
{
"msgToken": "s13-s13-human-invite",
"method": "sessionReject",
"sessionId": "s13-human",
"params": {
"reason": "userRejected"
}
}M57 · requestAck
{
"msgToken": "s13-s13-human-invite",
"method": "requestAck",
"sessionId": "s13-human",
"code": 200,
"data": {
"requestMethod": "sessionReject",
"result": {
"state": "ended",
"reason": "userRejected"
}
}
}M63 · sessionReject
{
"msgToken": "s13-human-local-invite",
"method": "sessionReject",
"sessionId": "s13-human-local",
"params": {
"reason": "userRejected"
}
}M64 · requestAck
{
"msgToken": "s13-human-local-invite",
"method": "requestAck",
"sessionId": "s13-human-local",
"code": 200,
"data": {
"requestMethod": "sessionReject",
"result": {
"state": "ended",
"reason": "userRejected"
}
}
}M61 · callControl
{
"msgToken": "s13-escalate-cancel",
"method": "callControl",
"sessionId": "s-ai",
"params": {
"operation": "cancel",
"expectedRevision": 1,
"candidateSessionId": "s13-human"
}
}M62 · callState
{
"msgToken": "s13-escalate-cancel",
"method": "callState",
"sessionId": "s-ai",
"code": 200,
"data": {
"state": "active",
"revision": 2,
"candidateSessionId": "s13-human",
"localSessionId": "s13-human-local",
"callGroupId": "s13-ai-human-group",
"reason": "candidateCancelled"
}
}M39 · sessionAccept
{
"msgToken": "s13-s13-human-invite",
"method": "sessionAccept",
"sessionId": "s13-human",
"params": {
"acceptedTracks": [
"voice"
]
}
}M40 · requestAck
{
"msgToken": "s13-s13-human-invite",
"method": "requestAck",
"sessionId": "s13-human",
"code": 200,
"data": {
"requestMethod": "sessionAccept",
"result": {
"state": "negotiating"
}
}
}M49 · sessionAccept
{
"msgToken": "s13-human-local-invite",
"method": "sessionAccept",
"sessionId": "s13-human-local",
"params": {
"acceptedTracks": [
"voice"
]
}
}M50 · requestAck
{
"msgToken": "s13-human-local-invite",
"method": "requestAck",
"sessionId": "s13-human-local",
"code": 200,
"data": {
"requestMethod": "sessionAccept",
"result": {
"state": "negotiating"
}
}
}M41 · mediaOffer
{
"msgToken": "s13-s13-human-offer",
"method": "mediaOffer",
"sessionId": "s13-human",
"params": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP offer>"
}
}
}M42 · mediaAnswer
{
"msgToken": "s13-s13-human-offer",
"method": "mediaAnswer",
"sessionId": "s13-human",
"code": 200,
"data": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP answer>"
}
}
}M43 · mediaState
{
"msgToken": "s13-s13-human-connected",
"method": "mediaState",
"sessionId": "s13-human",
"params": {
"mediaRevision": 1,
"state": "connected"
}
}M44 · requestAck
{
"msgToken": "s13-s13-human-connected",
"method": "requestAck",
"sessionId": "s13-human",
"code": 200,
"data": {
"requestMethod": "mediaState",
"result": {
"mediaRevision": 1,
"state": "connected"
}
}
}M51 · mediaOffer
{
"msgToken": "s13-human-local-offer",
"method": "mediaOffer",
"sessionId": "s13-human-local",
"params": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP offer>"
}
}
}M52 · mediaAnswer
{
"msgToken": "s13-human-local-offer",
"method": "mediaAnswer",
"sessionId": "s13-human-local",
"code": 200,
"data": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP answer>"
}
}
}M53 · mediaState
{
"msgToken": "s13-human-local-connected",
"method": "mediaState",
"sessionId": "s13-human-local",
"params": {
"mediaRevision": 1,
"state": "connected"
}
}M54 · requestAck
{
"msgToken": "s13-human-local-connected",
"method": "requestAck",
"sessionId": "s13-human-local",
"code": 200,
"data": {
"requestMethod": "mediaState",
"result": {
"mediaRevision": 1,
"state": "connected"
}
}
}M65 · focusControl
{
"msgToken": "s13-ai-group-suspend",
"method": "focusControl",
"sessionId": "s-ai",
"eventSeq": 101,
"params": {
"operation": "suspend",
"expectedRevision": 10,
"focusId": "ai-conversation-focus",
"resources": ["microphone", "speaker"],
"priority": "conversation",
"resumePolicy": "explicit"
}
}M66 · focusState
{
"msgToken": "s13-ai-group-suspend",
"method": "focusState",
"sessionId": "s-ai",
"code": 200,
"data": {
"state": "suspended",
"revision": 11,
"focusId": "ai-conversation-focus",
"resources": ["microphone", "speaker"]
}
}M67 · focusControl
{
"msgToken": "s13-human-local-group-acquire",
"method": "focusControl",
"sessionId": "s13-human-local",
"eventSeq": 2,
"params": {
"operation": "acquire",
"expectedRevision": 11,
"focusId": "human-local-focus",
"resources": ["microphone", "speaker"],
"priority": "call",
"resumePolicy": "never",
"expiresAt": 1900000000000
}
}M68 · focusState
{
"msgToken": "s13-human-local-group-acquire",
"method": "focusState",
"sessionId": "s13-human-local",
"code": 200,
"data": {
"state": "acquired",
"revision": 12,
"focusId": "human-local-focus",
"resources": ["microphone", "speaker"]
}
}M45 · sessionEstablished
{
"msgToken": "s13-s13-human-established",
"method": "sessionEstablished",
"sessionId": "s13-human",
"eventSeq": 2,
"data": {
"state": "established",
"mediaRevision": 1
}
}M55 · sessionEstablished
{
"msgToken": "s13-human-local-established",
"method": "sessionEstablished",
"sessionId": "s13-human-local",
"eventSeq": 3,
"data": {
"state": "established",
"mediaRevision": 1
}
}M46 · callState
{
"method": "callState",
"msgToken": "s13-audit-44",
"sessionId": "s-ai",
"eventSeq": 102,
"data": {
"state": "transferred",
"revision": 2,
"candidateSessionId": "s13-human",
"localSessionId": "s13-human-local",
"callGroupId": "s13-ai-human-group",
"requestToken": "s13-19"
}
}M47 · sessionEnded
{
"method": "sessionEnded",
"msgToken": "s13-audit-45",
"sessionId": "s-ai",
"eventSeq": 103,
"data": {
"state": "ended",
"reason": "transferred"
}
}M69 · focusState
{
"msgToken": "s13-human-local-group-acquire",
"method": "focusState",
"sessionId": "s13-human-local",
"code": 503,
"data": {
"state": "denied",
"revision": 11,
"focusId": "human-local-focus",
"resources": ["microphone", "speaker"],
"reason": "driverFailed"
}
}M70 · focusControl
{
"msgToken": "s13-ai-group-restore",
"method": "focusControl",
"sessionId": "s-ai",
"eventSeq": 102,
"params": {
"operation": "restore",
"expectedRevision": 11,
"focusId": "ai-conversation-focus",
"resources": ["microphone", "speaker"],
"priority": "conversation",
"resumePolicy": "explicit",
"expiresAt": 1900000000000
}
}M71 · focusState
{
"msgToken": "s13-ai-group-restore",
"method": "focusState",
"sessionId": "s-ai",
"code": 200,
"data": {
"state": "restored",
"revision": 12,
"focusId": "ai-conversation-focus",
"resources": ["microphone", "speaker"]
}
}M72 · focusState
{
"msgToken": "s13-ai-group-suspend",
"method": "focusState",
"sessionId": "s-ai",
"code": 409,
"data": {
"state": "denied",
"revision": 10,
"focusId": "ai-conversation-focus",
"resources": ["microphone", "speaker"],
"reason": "resourceBusy"
}
}M58 · callState
{
"msgToken": "s13-escalate-failed",
"method": "callState",
"sessionId": "s-ai",
"eventSeq": 101,
"data": {
"state": "failed",
"revision": 2,
"candidateSessionId": "s13-human",
"localSessionId": "s13-human-local",
"callGroupId": "s13-ai-human-group",
"requestToken": "s13-19",
"reason": "transferRejected"
}
}M59 · sessionEnded
{
"msgToken": "s13-human-candidate-ended",
"method": "sessionEnded",
"sessionId": "s13-human",
"eventSeq": 3,
"data": {
"state": "ended",
"reason": "userRejected"
}
}M60 · sessionEnded
{
"msgToken": "s13-human-local-ended",
"method": "sessionEnded",
"sessionId": "s13-human-local",
"eventSeq": 3,
"data": {
"state": "ended",
"reason": "userRejected"
}
}M73 · contextSnapshot
{"msgToken":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","method":"contextSnapshot","sessionId":"s13-human","messageSeq":7,"data":{"deliveryId":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","consentId":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","scope":"completedText","sourceSessionId":"s-ai","serviceId":"support","serviceRevision":"reviewed-r1","snapshotVersion":"immutable-v1","snapshotDigest":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc","firstTurnIndex":1,"lastTurnIndex":1,"expiresAt":1900000000000,"turns":[{"messageId":"user-1","sequence":1,"turnIndex":1,"role":"user","text":"已完成的问题"},{"messageId":"assistant-1","sequence":2,"turnIndex":1,"role":"assistant","text":"已完成的回答"}]}}此分支仅在本人真实授权、原快照导出、最终同事务消费以及实际人工路由持续有效时进入。示例摘要/截止是占位值;原人工remote腿messageSeq按原持久水位分配,不借旧AI事件序号,不固定7。私有队列只固定关联,不保存正文;每次发出前重新校验原授权/ACL/实际路由。完整assistant保留;wire删减了内部身份,不能从turns重算原私有digest。
M74 · contextSnapshotAck
{"msgToken":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","method":"contextSnapshotAck","sessionId":"s13-human","code":200,"data":{"deliveryId":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","consentId":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","snapshotVersion":"immutable-v1","snapshotDigest":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc","status":"received"}}人工设备按原会话/连接完整校验并实际留存后回显,服务端核原鉴权Topic及冻结关联。不携带私有正文或水位,不以broker确认制造received。重复原报文可重放原ACK;同键换正文、过期、撤销、held、换连接或会话结束不再接受新留存。缺授权整个M73/M74分支跳过,不用空快照假成功。严格契约和SQL组件通过不等于正式dispatcher/C++端云纵切已通过。
M75 · sessionEnd
{"msgToken":"s13-human-hangup","method":"sessionEnd","sessionId":"s13-human-local","params":{"reason":"hangup"}}只使用当前原人工腿,不发送给s-ai;输入来自已鉴权Topic,正文不自报主体、Owner或连接代次。D3发起时替换为其原人工腿,不能把同token当跨腿授权。
M76 · sessionEnded
{"msgToken":"s13-human-hangup","method":"sessionEnded","sessionId":"s13-human-local","code":200,"data":{"state":"ended","reason":"hangup"}}原请求应答,不携带eventSeq;表示原终态已持久确认,不替代M79。
M77 · sessionEnded
{"msgToken":"s13-human-hangup","method":"sessionEnded","sessionId":"s13-human","eventSeq":5,"data":{"state":"ended","reason":"hangup"}}对端事件不带code;序号取该腿实际水位下一项。示例不是双方共享事件序列。
M78 · focusControl
{"msgToken":"s13-local-human-release","method":"focusControl","sessionId":"s13-human-local","eventSeq":6,"params":{"operation":"release","expectedRevision":13,"focusId":"human-local-focus","resources":["microphone","speaker"],"priority":"call","resumePolicy":"explicit"}}取原本端完整组及当前资源CAS;原请求ACK不占事件序号,不能要求另一条本端Ended事件补序号。设备停止业务腿后仍需沿Global处理此唯一收尾。
M79 · focusState
{"msgToken":"s13-local-human-release","method":"focusState","sessionId":"s13-human-local","code":200,"data":{"state":"released","revision":14,"focusId":"human-local-focus","resources":["microphone","speaker"]}}只有原双端实际false票据完成才发送成功;失败或未知按焦点命令原契约回报,不能照抄成功示例。
M80 · focusControl
{"msgToken":"s13-remote-human-release","method":"focusControl","sessionId":"s13-human","eventSeq":6,"params":{"operation":"release","expectedRevision":1,"focusId":"human-remote-focus","resources":["microphone","speaker"],"priority":"call","resumePolicy":"explicit"}}对端Ended已占示例eventSeq=5,下一项为6;资源修订独立于eventSeq与呼叫修订。本端示例CAS不能复制给对端。
M81 · focusState
{"msgToken":"s13-remote-human-release","method":"focusState","sessionId":"s13-human","code":200,"data":{"state":"released","revision":2,"focusId":"human-remote-focus","resources":["microphone","speaker"]}}对端独立实际释放证明。两端各自关闭本地媒体对象及共享连接的事实还须另外观察,不从平台ACK推断。
M82 · sessionEnded
{"msgToken":"s13-human-hangup","method":"sessionEnded","sessionId":"s13-human-local","code":200,"data":{"state":"ended","reason":"hangup"}}仅原主体与不可变请求的重复M75触发,逐字返回M76;不新增eventSeq、outbox或focus操作。错误token、换连接代次或过期不适用;是否兼容空实例仅沿原非分享冻结契约,不能让客户端自填实例绕过来源校验。
更新日志
2026/10/17 03:27
查看所有更新日志
d04e1-docs(AI与音视频): 按公共主线与场景分支整合接入手册于
