sendStreamMessage static method
Implementation
static Stream<StreamEvent> sendStreamMessage({
required String message,
String chatId = 'my_chatId',
String responseChatItemId = 'my_responseChatItemId',
Map<String, String>? variables,
String? imageUrl,
String? fileName,
bool detail = true,
}) async* {
try {
// 构建消息内容
dynamic messageContent;
if (imageUrl != null) {
// 图片消息
messageContent = [
{
'type': 'text',
'text': message.isNotEmpty ? message : '发送了一张图片',
},
{
'type': 'image_url',
'image_url': {
'url': imageUrl,
}
}
];
} else if (fileName != null) {
// 文件消息
messageContent = [
{
'type': 'text',
'text': message.isNotEmpty ? message : '发送了一个文件',
},
{
'type': 'file_url',
'name': fileName,
'url': imageUrl ?? '', // 文件URL
}
];
} else {
// 纯文本消息
messageContent = message;
}
final request = http.Request('POST', Uri.parse(baseUrl));
request.headers.addAll({
'Authorization': 'Bearer $apiKey',
'Content-Type': 'application/json',
'Accept': 'text/event-stream',
});
request.body = jsonEncode({
'chatId': chatId,
'stream': true,
'detail': detail,
'responseChatItemId': responseChatItemId,
'variables': variables ?? {
'uid': 'asdfadsfasfd2323',
'name': '张三',
},
'messages': [
{
'role': 'user',
'content': messageContent,
}
],
});
final response = await request.send();
if (response.statusCode == 200) {
String currentEventType = 'unknown';
await for (final chunk in response.stream.transform(utf8.decoder)) {
final lines = chunk.split('\n');
for (final line in lines) {
if (line.trim().isEmpty) continue;
if (line.startsWith('event: ')) {
currentEventType = line.substring(7).trim();
continue;
}
if (line.startsWith('data: ')) {
final data = line.substring(6).trim();
if (data == '[DONE]') {
yield StreamEvent(type: 'done', data: {});
break;
}
try {
final jsonData = jsonDecode(data);
yield StreamEvent(type: currentEventType, data: jsonData);
} catch (e) {
// 忽略解析错误的数据
continue;
}
}
}
}
} else {
throw Exception('请求失败: ${response.statusCode}');
}
} catch (e) {
yield StreamEvent(type: 'error', data: {'message': '网络请求错误: $e'});
}
}