Skip to content

WebSocket 消息类型

客户端文本帧使用 action,服务端文本帧使用 type。下列清单由主 handler 和第一方前端反向枚举得到。标为内部的字段属于第一方 UI 流程,不随公共协议版本承诺稳定。

客户端 → 服务端

对话 action

start_session

json
{ "action": "start_session", "input_type": "audio", "new_session": false }

有效 input_typeaudioscreencameratextavatar_drop_imageuser_image

stream_data

文本:

json
{
  "action": "stream_data",
  "input_type": "text",
  "data": "你好",
  "request_id": "client-turn-id",
  "memory_text": "可选:替代脚手架写入记忆的文本",
  "source": "optional-source"
}

图片(screencameraavatar_drop_imageuser_image):

json
{
  "action": "stream_data",
  "input_type": "user_image",
  "data": "data:image/jpeg;base64,...",
  "request_id": "client-turn-id",
  "avatar_position": { "x": 10, "y": 20, "width": 300, "height": 500 }
}

音频使用带符号 16 位 PCM 样本数字数组,不是 base64,也不是客户端二进制帧:

json
{ "action": "stream_data", "input_type": "audio", "data": [0, -12, 48, 103] }

avatar_position 是与新鲜屏幕/图片配对的可选元数据;省略时会清除之前缓存的位置。

end_sessionpause_session

json
{ "action": "end_session", "reason": "user_stop", "goodbye_active": false }
json
{ "action": "pause_session" }

两者都会结束当前 provider session;pause_session 还将 manager 标为空闲。应用 WebSocket 保持连接。

avatar_interaction

短生命周期的模型手势/触摸请求。第一方 payload 包含 interaction_idtool_idaction_idtarget: "avatar"timestampintensity,按需要含 touch_zone/pointer。结果由 avatar_interaction_ack 返回。

UI 与生命周期 action

Action关键字段行为
ping返回 pong
language_updatelanguage通用语言更新后,分发阶段为空操作。
greeting_checkis_switchreasonlanguage仅角色切换或重连间隔超过 15 秒时触发问候,并同步第一方 focus/agent 状态。
cat_greeting_checkcat_duration_secondstierwas_auto请求从猫形态返回的问候;时长限制到 0–7 天。
goodbye_stateactivereason启用/清除静默告别投递 gate。
voice_play_startturnId/turn_idsource报告前端缓冲音频真正开始播放。
voice_play_endturnId/turn_idsource报告前端音频队列真正清空。

播放边界对主动消息仲裁很重要:上游生成结束早于实际播放结束。

截图桥接 action(内部)

Action用途
capture_bridge_status注册/更新前端截图客户端及能力。
capture_bridge_response用关联字段完成截图桥请求。
screenshot_response完成旧版 request_screenshotdata 为 data URL/base64 图片,avatar_position 可选。

telemetry(内部、尽力而为)

json
{ "action": "telemetry", "kind": "counter", "name": "chat_sent", "value": 1, "dims": { "surface": "index_wide" } }

kindcounterhistogramevent(event 使用 fields)。后端限制名称、键、值和字段数量,丢弃不支持类型和非有限数值,且不返回 ack。禁止在 telemetry 中放用户原文或角色名。

任意 action 还可携带 language

服务端 → 客户端

会话生命周期

Type字段含义
session_preparinginput_modeProvider 启动中。
session_startedinput_mode请求的 audiotext 模式已就绪。
session_failedinput_mode启动失败;细节通常在 status
session_ended_by_serverinput_mode后端/上游结束 provider session。
catgirl_switchednew_catgirlold_catgirl应重新连接新角色路由。
pongping 的响应。

文本、音频与恢复

gemini_response

名称是历史遗留,现在用于多个 provider 的流式助手文本:

json
{
  "type": "gemini_response",
  "text": "你好",
  "isNewMessage": true,
  "turn_id": "server-turn-id",
  "request_id": "client-turn-id",
  "metadata": { "source": "optional" }
}

首个可见 chunk 的 isNewMessage 为 true,后续 chunk 追加到相同 turn_id。主动消息或服务端发起轮次的 request_id 可为 null。

audio_chunk

json
{ "type": "audio_chunk", "speech_id": "speech-id" }

头之后严格跟一个二进制音频帧。用 speech_id 关联;参见音频流

恢复与转写事件

Type关键字段用途
response_discardedreasonattemptmax_attemptswill_retrymessagerequest_id回滚/清除被拒绝的部分响应或准备重试;message 自身也可能是结构化 JSON。
user_transcript转写/轮次元数据第一方实时转写显示。
user_activity轮次/打断元数据插话与用户活动协调。
auto_close_micreason_codeapi_typemessage静音超时关闭语音会话。
repetition_warningname重复恢复已重置对话状态。

状态与显示

Type关键字段用途
statusmessagemessage 是含 { code, details? }JSON 字符串,需再次解析。
expression表情 payload驱动 Live2D/VRM/MMD/PNGTuber 表情。
focus_stateactive进入/退出专注认知显示。
focus_chargecharge 及时间/模式字段更新边缘光电量。
focus_thinkingactive切换临时思考指示。
topic_hintauthorturn_id仅前端显示的预告气泡,不进入聊天记忆。
cancel_topic_hintturn_id删除孤立预告。
reload_pagemessage配置变化;message 也是状态式 JSON 字符串。

第一方工作流事件

以下是当前 UI 集成事件,不属于稳定外部契约:

  • Agent:agent_notificationagent_task_updateagent_status_update
  • 截图:request_screenshotcapture_bridge_requestscreen_share_error
  • 小游戏:mini_game_invite_optionsmini_game_invite_resolvedgame_window_state_change
  • 音乐/工具:music_play_urlmusic_allowlist_add
  • 活动/引导:activity_context_prompt
  • 兼容/同步:systemcozy_audio

avatar_interaction_ack 也是第一方事件,但信封较小且明确:

json
{
  "type": "avatar_interaction_ack",
  "interaction_id": "id",
  "accepted": true,
  "reason": "accepted",
  "turn_id": "turn-id"
}

客户端必须安全忽略未知服务端 type,以免新增 UI 事件破坏连接。