5.3 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			5.3 KiB
		
	
	
	
	
	
	
	
流式聊天 API 文档
概述
该 API 提供实时流式聊天功能,支持文本对话和语音合成。API 使用 Server-Sent Events (SSE) 实现流式响应,确保实时性和高效性。
基础信息
- 基础URL: http://your-domain:8080
- 内容类型: application/json
- 响应类型: text/event-stream(流式响应)
API 端点
1. 聊天接口
POST /chat
请求参数
| 参数名 | 类型 | 必填 | 描述 | 
|---|---|---|---|
| query | string | 是 | 用户输入的查询文本 | 
| response_mode | string | 是 | 响应模式,使用 "streaming" 启用流式响应 | 
| user | string | 是 | 用户标识符 | 
| conversation_id | string | 否 | 会话ID,首次对话可不传 | 
请求示例
{
    "query": "你好,请介绍一下自己",
    "response_mode": "streaming",
    "user": "user123",
    "conversation_id": ""
}
响应格式
响应使用 Server-Sent Events (SSE) 格式,每个事件包含以下字段:
| 字段名 | 类型 | 描述 | 
|---|---|---|
| answer | string | 机器人的文本回复 | 
| isEnd | boolean | 是否为最后一条消息 | 
| conversation_id | string | 会话ID | 
| task_id | string | 任务ID | 
| audio_data | string | 语音数据(URL或十六进制编码) | 
响应示例
data: {"answer":"你好!","isEnd":false,"conversation_id":"conv_123","task_id":"task_456","audio_data":"http://example.com/audio.mp3"}
data: {"answer":"我是AI助手","isEnd":false,"conversation_id":"conv_123","task_id":"task_456","audio_data":"http://example.com/audio2.mp3"}
data: {"answer":"","isEnd":true,"conversation_id":"conv_123","task_id":"task_456"}
2. 停止对话
POST /chat-messages/:task_id/stop
路径参数
| 参数名 | 类型 | 描述 | 
|---|---|---|
| task_id | string | 要停止的任务ID | 
响应示例
{
    "status": "success",
    "message": "Conversation stopped"
}
3. 删除对话
DELETE /conversations/:conversation_id
路径参数
| 参数名 | 类型 | 描述 | 
|---|---|---|
| conversation_id | string | 要删除的会话ID | 
查询参数
| 参数名 | 类型 | 必填 | 描述 | 
|---|---|---|---|
| user | string | 是 | 用户标识符 | 
响应示例
{
    "status": "success",
    "message": "Conversation deleted"
}
前端集成示例
1. 基本使用
async function sendMessage(message) {
    const response = await fetch('/chat', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            query: message,
            response_mode: 'streaming',
            user: 'user123',
            conversation_id: currentConversationId
        })
    });
    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);
        const lines = chunk.split('\n');
        for (const line of lines) {
            if (line.startsWith('data: ')) {
                const data = JSON.parse(line.slice(6));
                // 处理响应数据
                handleResponse(data);
            }
        }
    }
}
2. 处理响应数据
function handleResponse(data) {
    // 更新会话ID
    if (data.conversation_id) {
        currentConversationId = data.conversation_id;
    }
    // 处理文本回复
    if (data.answer) {
        updateChatMessage(data.answer);
    }
    // 处理语音数据
    if (data.audio_data) {
        playAudio(data.audio_data);
    }
}
3. 播放音频
function playAudio(audioData) {
    // URL格式的音频
    if (audioData.startsWith('http')) {
        const audio = new Audio(audioData);
        audio.play();
    } 
    // 十六进制编码的音频
    else {
        const audioContext = new (window.AudioContext || window.webkitAudioContext)();
        const audioDataArray = new Uint8Array(
            audioData.match(/.{1,2}/g).map(byte => parseInt(byte, 16))
        );
        
        audioContext.decodeAudioData(audioDataArray.buffer, (buffer) => {
            const source = audioContext.createBufferSource();
            source.buffer = buffer;
            source.connect(audioContext.destination);
            source.start(0);
        });
    }
}
错误处理
常见错误码
| 状态码 | 描述 | 
|---|---|
| 400 | 请求参数错误 | 
| 401 | 未授权 | 
| 500 | 服务器内部错误 | 
错误响应格式
{
    "error": "错误描述信息"
}
最佳实践
- 
会话管理 - 保存 conversation_id以维持对话上下文
- 在对话结束时清理资源
 
- 保存 
- 
错误处理 - 实现重试机制
- 优雅处理网络错误
- 提供用户友好的错误提示
 
- 
性能优化 - 使用缓冲通道处理流式数据
- 及时清理不需要的音频资源
- 实现消息队列避免并发问题
 
- 
安全性 - 验证用户身份
- 使用 HTTPS
- 实现请求频率限制
 
注意事项
- 确保正确处理 SSE 连接的关闭
- 实现适当的错误重试机制
- 注意音频资源的及时释放
- 考虑网络延迟和断线重连
- 实现适当的加载状态提示
