# 陪练功能基础信息

## 一、功能概述

### 业务场景
考培练系统为轻医美连锁品牌提供AI陪练功能，通过模拟真实客户场景，让学员进行实战对话练习。

### 两种陪练入口

#### 1. 陪练中心（直接模式）
- **URL**: http://localhost:3001/trainee/ai-practice-center
- **流程**: 选择预设场景 → 直接调用Coze开始陪练
- **场景来源**: 数据库中的预设场景（practice_scenes表）

#### 2. 课程中心（课程模式）
- **URL**: http://localhost:3001/trainee/course-center
- **流程**: 点击课程陪练 → Dify提取场景 → Coze开始陪练
- **场景来源**: Dify根据课程内容动态生成

## 二、Coze配置信息

### 认证方式（更新于 2025-11-16）
系统使用 **OAuth认证（JWT + 私钥签名）**，不再使用Personal Access Token (PAT)。

### OAuth配置（后端环境变量）
```bash
# OAuth认证配置
COZE_OAUTH_CLIENT_ID=1114009328887
COZE_OAUTH_PUBLIC_KEY_ID=GGs9pw0BDHx2k9vGGehUyRgKV-PyUWLBncDs-YNNN_I
COZE_OAUTH_PRIVATE_KEY_PATH=/app/secrets/coze_private_key.pem
COZE_PRACTICE_BOT_ID=7560643598174683145

# API配置（关键：必须使用中国区）
COZE_API_BASE=https://api.coze.cn
```

### 私钥文件位置
- **宿主机**: `/root/aiedu/kaopeilian-backend/secrets/coze_private_key.pem`
- **容器内**: `/app/secrets/coze_private_key.pem`
- **权限**: 600（仅所有者可读写）
- **Docker挂载**: `./kaopeilian-backend/secrets:/app/secrets:ro`（只读）

### 重要提示
⚠️ **JWTAuth必须指定 `base_url='https://api.coze.cn'`，否则会使用国际版导致认证失败**

### 官方资源
- **API文档**: https://www.coze.cn/open/docs/developer_guides/chat_v3
- **OAuth文档**: https://www.coze.cn/open/docs/developer_guides/oauth
- **Python SDK**: https://github.com/coze-dev/coze-py
- **SDK版本**: cozepy>=0.19.0

### Bot信息
- **Bot ID**: 7560643598174683145
- **应用ID**: 1114009328887
- **功能**: AI模拟客户陪练，支持多轮对话
- **特性**: 实时流式响应，可自定义场景角色

## 三、Dify配置信息

### API配置
```python
DIFY_API_BASE = "http://dify.ireborn.com.cn/v1"
DIFY_PRACTICE_API_KEY = "app-rYP6LNM4iPmNjIHns12zFeJp"
DIFY_PRACTICE_WORKFLOW_ID = "待确认"  # 需要从Dify创建工作流后获取
```

### 调用示例
```bash
curl -X POST 'http://dify.ireborn.com.cn/v1/workflows/run' \
--header 'Authorization: Bearer app-rYP6LNM4iPmNjIHns12zFeJp' \
--header 'Content-Type: application/json' \
--data-raw '{
  "inputs": {
    "course_id": "5"
  },
  "response_mode": "streaming",
  "user": "kaopeilian"
}'
```

### 工作流说明
- **输入参数**: course_id（课程ID）
- **响应模式**: streaming（流式返回）
- **输出格式**: JSON场景数据（包含name、description、background、ai_role、objectives等）

## 四、技术架构

### 核心技术栈
- **前端**: Vue3 + Element Plus
- **后端**: Python + FastAPI
- **数据库**: MySQL 8.0（存储场景数据）
- **AI对话**: Coze Bot（字节跳动）
- **场景提取**: Dify工作流
- **通信协议**: SSE (Server-Sent Events)

### 数据存储策略
- **场景数据**: 存储在MySQL的practice_scenes表
- **对话历史**: 由Coze平台管理，不存储在本地数据库

## 五、规划文档

### 已完成文档
1. ✅ **Coze-API文档.md** - Coze API核心使用方法
2. ✅ **陪练功能技术方案.md** - 完整技术架构和实现方案
3. ✅ **陪练功能API接口规范.md** - 前后端API接口详细规范
4. ✅ **陪练功能数据流程图.md** - 数据流程和时序图
5. ✅ **规范与约定-团队基线.md** - 更新了陪练功能相关规范

### 文档位置
所有规划文档位于：`考培练系统规划/全链路联调/Ai工作流/coze/`

## 六、参考代码

### 可用参考代码位置
- **Coze Python SDK**: `参考代码/coze-py-main/`
  - 示例代码：`examples/chat_stream.py`（流式对话）
  - 示例代码：`examples/chat_simple_audio.py`（音频对话）
  
- **Coze后端参考**: `参考代码/coze-chat-backend/`
  - `main.py` - FastAPI集成示例
  - `auth.py` - Coze认证方式
  - `config.py` - 配置管理
  
- **Coze前端参考**: `参考代码/coze-chat-frontend/`
  - React + TypeScript实现
  - SSE流式对话处理示例

### 已有页面
- **陪练中心页面**: `kaopeilian-frontend/src/views/trainee/ai-practice-center.vue`（前端已实现）
- **场景管理页面**: `kaopeilian-frontend/src/views/manager/practice-scene-management.vue`（前端已实现）
- **对话页面**: 待开发（可参考Training模块）

### 核心参考代码（新发现）
- **Training模块**: `参考代码/coze-chat-frontend/src/pages/Training/`
  - `index.tsx` - 主入口（20行）
  - `TextChat.tsx` - 文本对话实现（68行）
  - `VoiceChat.tsx` - 语音对话实现（225行）
  - **`TrainingStore.ts` - 核心状态管理（525行）** ⭐ 重点参考
  
**TrainingStore.ts核心功能**：
- ✅ SSE流式对话处理（使用@ant-design/x的XStream）
- ✅ WebSocket语音对话（使用@coze/api/ws-tools）
- ✅ 消息列表管理（增量更新、删除、重新生成）
- ✅ 对话状态管理（6种状态：未连接、连接中、已连接、聆听、回复中、错误）
- ✅ 文件上传支持
- ✅ 错误处理和重试
- ✅ AbortController中断控制

## 七、开发路线图

### 第一阶段：数据库与基础API（2天）
- [ ] 创建practice_scenes表
- [ ] 插入初始场景数据
- [ ] 实现场景管理API（CRUD）

### 第二阶段：前端管理页面（2天）
- [ ] 场景管理页面开发
- [ ] 表单验证与提交
- [ ] 列表筛选与分页

### 第三阶段：Coze集成（3天）
- [ ] Coze SDK集成
- [ ] 流式对话API实现
- [ ] 陪练对话页面开发

### 第四阶段：Dify集成（2天）
- [ ] Dify场景提取API
- [ ] 课程中心集成

### 第五阶段：联调与优化（2天）
- [ ] 端到端测试
- [ ] 错误处理完善
- [ ] 性能优化

**预计总工期**: 11个工作日

## 八、关键技术点

### ⚠️ 场景提示词构建（核心差异）

**与参考代码的关键不同**：
- **参考代码**：用户直接与Bot对话，无场景概念
- **考培练系统**：首次消息必须包含完整场景设定

**实现方式**：
```python
# 后端：首次消息时构建场景提示词
if is_first:
    scene_prompt = f"""
# 陪练场景设定

## 场景名称
{scene_name}

## 场景背景
{scene_background}

## AI角色要求
{scene_ai_role}

## 练习目标
{chr(10).join(f"{i+1}. {obj}" for i, obj in enumerate(scene_objectives))}

---

现在开始陪练对话。请严格按照上述设定扮演角色。

学员的第一句话：{user_message}
"""
    # 发送完整提示词给Coze
    Message.build_user_question_text(scene_prompt)
else:
    # 后续消息仅发送用户输入
    Message.build_user_question_text(user_message)
```

**为什么这样设计**：
1. 让AI明确理解要扮演的角色
2. 保持对话上下文（使用conversation_id）
3. 后续消息无需重复场景信息
4. 用户界面不显示场景设定文本

### SSE流式通信
```javascript
// 前端处理SSE事件
const response = await fetch('/api/v1/practice/start', {
  method: 'POST',
  body: JSON.stringify({
    scene_name: scene.name,
    scene_background: scene.background,
    scene_ai_role: scene.ai_role,
    scene_objectives: scene.objectives,
    user_message: userInput,
    is_first: true  // 标记首次消息
  })
})

const reader = response.body.getReader()
const decoder = new TextDecoder()

while (true) {
  const { value, done } = await reader.read()
  if (done) break
  
  const chunk = decoder.decode(value)
  // 解析 event: xxx\ndata: {...}\n\n 格式
}
```

### Coze流式对话
```python
# 后端调用Coze
from cozepy import Coze, TokenAuth, Message, ChatEventType

stream = coze.chat.stream(
    bot_id=COZE_PRACTICE_BOT_ID,
    user_id=user_id,
    additional_messages=[Message.build_user_question_text(message)],
    conversation_id=conversation_id  # 保持对话上下文
)

for event in stream:
    if event.event == ChatEventType.CONVERSATION_MESSAGE_DELTA:
        # 发送SSE增量事件
        yield f"event: message.delta\ndata: {json.dumps({'content': event.message.content})}\n\n"
```

## 九、注意事项

### 安全性
- Token不要提交到版本控制
- 使用环境变量管理敏感配置
- API调用添加速率限制

### 性能
- SSE连接超时设置为180秒
- 数据库查询使用索引
- 前端消息列表使用虚拟滚动

### 用户体验
- 实现打字效果（message.delta）

如有技术问题，请参考：
1. Coze API文档：`Coze-API文档.md`
2. 技术方案文档：`陪练功能技术方案.md`
3. API接口规范：`陪练功能API接口规范.md`
4. 数据流程图：`陪练功能数据流程图.md`
5. OAuth认证规范：`../../规范与约定-团队基线.md`
6. 完整迁移报告：`/root/aiedu/OAUTH_MIGRATION_SUCCESS.md`

---

**文档版本**: v2.0  
**最后更新**: 2025-11-16  
**维护人**: 考培练系统开发团队  
**重大更新**: OAuth认证迁移完成
