创建实时会话
POST/v1/realtime/sessions
为发起调用的终端用户开启一个语音会话——或者带上
session_id,重新加入该用户尚未结束的某个会话——并返回会话的 id
和一个短期有效的 client_secret。
在 client_secret.expires_at
之前打开到 websocket_url 的 WebSocket,并把密钥放在
Authorization: Bearer 请求头里。浏览器无法设置这个请求头,所以改为提供两个子协议:neweyes-realtime
和 neweyes-secret. 后接密钥。一个密钥只能打开一条连接。
语音会话和其他会话一样:通过
/v1/sessions
读取它、它的转写内容和纪要。连接关闭并不会结束会话:要继续通话,请带上它的
session_id 创建实时会话以获取新的密钥,然后重新连接——对话会从中断的地方继续。一个会话同一时间只由一条连接持有;较新的连接会接管它。用
POST /v1/realtime/sessions/\{session_id\}/end
结束会话。没有连接的会话会自行结束,但绝不会早于其最后一条连接关闭后的
10 分钟——这个时间可能变长,但不会缩短。在那之后重新加入会被拒绝,返回
session_ended:请开启新的会话。会话结束后会生成它的纪要。
语音助手可能调用两个工具,它们以 tool_call 帧送达,由你的客户端执行,并用
tool_result 答复:
create_task— 把它的task文字作为消息发到一个文字会话(POST /v1/sessions,或在你为这次通话保留的会话上POST /v1/sessions/{session_id}/messages),并用返回的task_id答复。任务的进度和回复会在GET /v1/sessions/{session_id}/events上送达。get_task_status— 用那条事件流上该任务的情况答复:仍在运行,或已经结束(完成并附回复、已停止或失败)。
新的语音会话和文字会话一样,打开你用
capabilities 或
exclude_capabilities
选择的能力,并在整个生命周期里保留它们;重新加入时也沿用这些能力,所以两个字段都不传。语音助手会被告知会话没开哪些能力,因此不会提议、也不会委托这些能力——但任务所在的文字会话由你来创建,通话的选择不会带到它上面:请用同样的
capabilities 或
exclude_capabilities
创建它,否则它会打开全部能力。无法读取能力的通话不会开始:它会以
1011 关闭。
你的客户端发送的帧在以下情况会被丢弃,且没有任何回复:超过 4 MiB;音频或图片的
data 不是 base64;input_text 超过 32,000
个字符或含有 NUL 字符;tool_result 的 output 以 JSON 计超过
32,000 个字符。
套接字没有请求体或响应体,所以连接的结果由 WebSocket 关闭码说明:
1000— 正常关闭,或会话已被结束。1001— 离开:一方正在结束会话(底层会话终止时也可能转发这个关闭码)。1011— 服务端错误,或语音服务暂时不可用;请稍后重试。语音服务发来的关闭码如果不在此列,也会以这个关闭码送达。1012— 服务端正在为计划内的重新部署而重启;请稍后重连。4001— 密钥缺失、无效、过期或已被使用,其会话已被删除或已结束,或者调用方的访问已被撤销;请获取新的密钥(会话尚未结束时,使用同一个session_id)。4009— 较新的连接接管了这个会话;不要从这个连接重连,否则两个连接会轮流抢占会话。4401— 鉴权失败,或账号不是有效状态。4429— 计费账户的积分已用完,或已有太多语音会话处于活动状态;请加上积分或关闭其中一个,然后重试。
请求
响应
- 200
- 401
- 404
- 409
- 413
- 422
- 429
- 500
成功响应
鉴权失败:凭证缺失、格式错误、已过期或已作废。
invalid_token— 访问令牌无效。project_disabled— 此项目未启用。token_expired— 访问令牌已过期。user_disabled— 此用户未启用。
请求的资源不存在,或对调用方不可见。
session_not_found— 找不到会话
请求与资源的当前状态冲突。
session_not_realtime— 这个会话不是语音会话。session_ended— 这个语音会话已结束;请开启新的会话。
请求体超过了允许的上限。
payload_too_large— 请求体太大。
请求中的某个值未通过校验;details 数组会列出每个出错的字段。
validation_failed— 请求内容未通过校验。
要么是请求太多(Retry-After 响应头会说明何时重试),要么是计费账户的积分已用完(不带 Retry-After——加上积分才能继续);用 code 字段区分这两种情况。
insufficient_credits— 计费账户的积分不足。rate_limited— 请求太频繁,请放慢速度。
服务端发生了意外错误。
internal— 发生了意外错误。