本文档描述了如何使用流式生成问卷总结API调用AI生成问卷反馈的总结报告,并以流式方式实时返回生成的内容。
流式生成问卷总结API提供了调用AI生成问卷反馈总结的功能,并以流式方式实时返回生成的内容,可以用于教练或会员在完成问卷后自动生成反馈总结报告,并提供更好的用户体验。
调用AI生成指定问卷记录的总结内容,并以流式方式实时返回生成的内容。
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| user_input_id | Integer | 是 | 问卷记录ID |
API返回Server-Sent Events (SSE)格式的流式数据,每个事件包含以下JSON数据:
{
"text": "生成的文本块", // 生成的文本块,如果为空字符串且done为true,表示生成完成
"done": true/false // 可选,如果为true,表示生成完成
}
| 错误码 | 描述 |
|---|---|
| 400 | 请求参数错误,如缺少必要参数或问卷没有回答内容 |
| 404 | 未找到指定问卷记录 |
| 500 | 服务器内部错误 |
POST /gym/survey/user_input/stream_summary
Content-Type: application/x-www-form-urlencoded
user_input_id=123
调用此API后,服务器会以流式方式实时返回AI生成的内容,客户端可以逐块显示这些内容,提供更好的用户体验。
注意:要使用此API,问卷记录必须有回答内容,否则将返回错误。
生成完成后,客户端可以调用相应的API将完整的总结内容保存到问卷记录中。
// 使用EventSource接收流式数据
function streamSurveySummary(userInputId, accessToken) {
// 创建结果容器
const resultContainer = document.getElementById('result-container');
resultContainer.innerHTML = '';
// 完整的总结内容
let fullSummary = '';
// 创建EventSource
const url = `/gym/survey/user_input/stream_summary?user_input_id=${userInputId}&access_token=${accessToken}`;
const eventSource = new EventSource(url);
// 处理消息
eventSource.onmessage = function(event) {
try {
const data = JSON.parse(event.data);
// 检查是否完成
if (data.done === true) {
console.log('生成完成');
eventSource.close();
// 可以在这里调用API保存总结
saveSurveySummary(userInputId, fullSummary);
return;
}
// 检查是否有错误
if (data.error) {
console.error('生成错误:', data.error);
resultContainer.innerHTML += `${data.error}
`;
eventSource.close();
return;
}
// 显示文本块
if (data.text) {
fullSummary += data.text;
resultContainer.innerHTML = fullSummary;
// 滚动到底部
resultContainer.scrollTop = resultContainer.scrollHeight;
}
} catch (e) {
console.error('解析事件数据出错:', e);
}
};
// 处理错误
eventSource.onerror = function(error) {
console.error('EventSource错误:', error);
resultContainer.innerHTML += '连接错误,请重试
';
eventSource.close();
};
}
// 保存总结内容
async function saveSurveySummary(userInputId, summary) {
try {
const response = await fetch('/your/api/endpoint/to/save/summary', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + accessToken
},
body: JSON.stringify({
user_input_id: userInputId,
summary: summary
})
});
const data = await response.json();
if (data.error === 0) {
console.log('问卷总结保存成功:', data.message);
} else {
console.error('保存失败:', data.message);
}
} catch (error) {
console.error('保存请求出错:', error);
}
}
// 使用fetch API接收流式数据
async function streamSurveySummaryWithFetch(userInputId, accessToken) {
// 创建结果容器
const resultContainer = document.getElementById('result-container');
resultContainer.innerHTML = '';
// 完整的总结内容
let fullSummary = '';
try {
// 发送请求
const response = await fetch(`/gym/survey/user_input/stream_summary?user_input_id=${userInputId}&access_token=${accessToken}`, {
method: 'POST'
});
// 获取reader
const reader = response.body.getReader();
const decoder = new TextDecoder();
// 读取数据
while (true) {
const { value, done } = await reader.read();
if (done) {
console.log('流读取完成');
break;
}
// 解码数据
const chunk = decoder.decode(value, { stream: true });
// 处理SSE格式的数据
const lines = chunk.split('\n\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
try {
const data = JSON.parse(line.substring(6));
// 检查是否有错误
if (data.error) {
console.error('生成错误:', data.error);
resultContainer.innerHTML += `${data.error}
`;
return;
}
// 检查是否完成
if (data.done === true) {
console.log('生成完成');
// 可以在这里调用API保存总结
saveSurveySummary(userInputId, fullSummary);
return;
}
// 显示文本块
if (data.text) {
fullSummary += data.text;
resultContainer.innerHTML = fullSummary;
// 滚动到底部
resultContainer.scrollTop = resultContainer.scrollHeight;
}
} catch (e) {
console.error('解析事件数据出错:', e);
}
}
}
}
} catch (error) {
console.error('请求出错:', error);
resultContainer.innerHTML += '连接错误,请重试
';
}
}
import requests
import json
import sseclient # 需要安装 sseclient-py 包
def stream_survey_summary(user_input_id, access_token):
"""
流式生成问卷总结
Args:
user_input_id: 问卷记录ID
access_token: 访问令牌
"""
url = f'http://your-domain.com/gym/survey/user_input/stream_summary?user_input_id={user_input_id}'
headers = {
'Accept': 'text/event-stream',
'Authorization': f'Bearer {access_token}'
}
# 发送请求
response = requests.post(url, headers=headers, stream=True)
# 创建SSE客户端
client = sseclient.SSEClient(response)
# 完整的总结内容
full_summary = ''
# 处理事件
try:
for event in client.events():
try:
data = json.loads(event.data)
# 检查是否有错误
if 'error' in data:
print(f"生成错误: {data['error']}")
break
# 检查是否完成
if data.get('done', False):
print("生成完成")
# 可以在这里调用API保存总结
save_survey_summary(user_input_id, full_summary, access_token)
break
# 显示文本块
if 'text' in data and data['text']:
full_summary += data['text']
print(data['text'], end='', flush=True)
except json.JSONDecodeError:
print(f"解析事件数据出错: {event.data}")
except Exception as e:
print(f"流处理错误: {str(e)}")
return full_summary
def save_survey_summary(user_input_id, summary, access_token):
"""
保存问卷总结
Args:
user_input_id: 问卷记录ID
summary: 总结内容
access_token: 访问令牌
"""
url = 'http://your-domain.com/your/api/endpoint/to/save/summary'
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {access_token}'
}
data = {
'user_input_id': user_input_id,
'summary': summary
}
response = requests.post(url, json=data, headers=headers)
if response.status_code == 200:
result = response.json()
if result['error'] == 0:
print(f"问卷总结保存成功: {result['message']}")
return result
else:
print(f"保存失败: {result['message']}")
raise Exception(result['message'])
else:
print(f"请求失败,状态码: {response.status_code}")
raise Exception(f"请求失败,状态码: {response.status_code}")
# 调用示例
try:
summary = stream_survey_summary(
user_input_id=123,
access_token='your-access-token'
)
print(f"\n完整总结:\n{summary}")
except Exception as e:
print(f"流式生成问卷总结失败: {str(e)}")