# 心镜 Agent - WebSocket后端实现

> 实现2.1异常状态触发对话和2.3双向音频流对话的WebSocket接口

## 快速启动

### 1. 安装依赖
```bash
uv add websockets  # 已安装
```

### 2. 启动WebSocket服务器
```bash
python src/MainServices.py
```

服务器将在 `ws://0.0.0.0:8765` 启动

### 3. 测试接口
```bash
python test_ws.py
```

### 4. 查看完整API文档
参考 [WEBSOCKET_API.md](./WEBSOCKET_API.md)

---

## 2. Agent对话接口（WebSocket）

**WebSocket连接**: `ws://0.0.0.0:8765`

### 2.1 用户状态异常状态触发对话

**接口描述**: K230检测到皮肤状态差或悲伤情绪时，触发Agent主动关怀对话（然后agent端拼接提示词给出合适的语音回答！ ）

**K230 → Agent后端**:

```json
{
  "type": "abnormal_trigger",    // 类型：异常状态触发对话
  "trigger_reason": "string",    // 触发原因，可选值：["poor_skin", "sad_emotion"] 
  "enable_streaming": true,      // 是否启用流式响应，布尔值
  "context_data": {              // 可选，上下文数据
    "emotion": "sad",
    "skin_status": {
      "acne": true,
      "dark_circles": true
    },
    "timestamp": "2024-01-01 12:30:45"
  }
}
```

**字段说明**:

- `type`: 固定值 "abnormal_trigger"，表示异常状态触发
- `trigger_reason`: 触发原因 

- "poor_skin": 皮肤状态差
- "sad_emotion": 悲伤情绪

- `enable_streaming`: 是否使用流式对话（推荐为true）
- `context_data`: 提供给Agent的上下文信息

**Agent后端 → K230（响应）**: （然后开始音频录制以及音频播放流式接口，主逻辑交给agent端！ ）

```json
{
  "type": "abnormal_trigger_response",
  "success": true,
}
```

------

### 2.2 用户主动发起对话 （现在先不管，不管不管）

**接口描述**: 用户通过唤醒词（如"你好啊"、"心镜"）主动发起对话

**K230 → Agent后端**:

```json
{
  "type": "user_initiated",      // 类型：用户主动发起对话
  "wake_word": "你好啊",          // 触发的唤醒词
  "enable_streaming": true,      // 是否启用流式响应
  "user_input": "string",        // 可选，用户的初始输入内容
  "timestamp": "2024-01-01 12:30:45"
}
```

**字段说明**:

- `type`: 固定值 "user_initiated"
- `wake_word`: 检测到的唤醒词（"你好啊"、"心镜"等）
- `enable_streaming`: 是否启用流式对话
- `user_input`: 用户的初始问题或陈述（可选）
- `timestamp`: 唤醒时间

**Agent后端 → K230（响应）**:（然后开始音频录制以及音频播放流式接口，主逻辑交给agent端！ ）

```json
{
  "type": "user_initiated_response",
  "success": true,
}
```

------

### 2.3 双向音频流对话

**接口描述**: K230和Agent后端通过同一WebSocket连接实现实时音频双向传输

**连接建立后握手参数**: 

```json
{
  "type": "audio_stream_init",   // 类型：音频流初始化
  "session_id": "string",        // 对话会话ID（来自2.1或2.2）
  "audio_config": {
    "sample_rate": 16000,        // 采样率，单位Hz（如16000、48000）
    "bit_depth": 16,             // 位宽，单位bit（如16、24）
    "channels": 1,               // 声道数（1=单声道，2=立体声）
    "encoding": "pcm"            // 音频编码格式（pcm、opus等）
  },
  "timestamp": "2024-01-01 12:30:45"
}
```

**Agent后端 → K230（握手响应）**:

```json
{
  "type": "audio_stream_init_response",
  "success": true,
  "message": "音频流连接已建立",
  "timestamp": "2024-01-01 12:30:45"
}
```

**K230 → Agent后端（上行音频流）**:

```json
{
  "type": "audio_stream_upload",  // 消息类型：上传音频流数据
  "session_id": "string",         // 会话ID
  "data": "base64-encoded-audio", // base64编码的音频数据
  "timestamp": "2024-01-01 12:30:45",
  "sequence": 1                   // 序列号，用于排序
}
```

**Agent后端 → K230（下行音频流）**:

```json
{
  "type": "audio_stream_download", // 消息类型：Agent语音响应
  "session_id": "string",          // 会话ID
  "data": "base64-encoded-audio",  // base64编码的音频数据
  "timestamp": "2024-01-01 12:30:46",
  "is_final": false,               // 是否为最后一个音频片段
  "text": "string"                 // 可选，对应的文字内容
}
```

**连接控制消息**:

```json
{
  "type": "audio_stream_control",  // 类型：音频流控制
  "session_id": "string",
  "action": "string",              // 控制动作：["pause", "resume", "end"]
  "reason": "string",              // 可选，操作原因
  "timestamp": "2024-01-01 12:30:47"
}
```

**字段说明**:

- `sample_rate`: 音频采样率，建议16000Hz
- `bit_depth`: 音频位深度，建议16bit
- `channels`: 声道数，建议单声道（1）
- `encoding`: 音频编码，建议PCM或opus
- `sequence`: 音频包序列号，确保顺序
- `is_final`: 标识Agent是否说完
- `action`: 控制动作 

- "pause": 暂停音频流
- "resume": 恢复音频流
- "end": 结束音频流

------

## 