sendStreamMessage static method

Stream<StreamEvent> sendStreamMessage({
  1. required String message,
  2. String chatId = 'my_chatId',
  3. String responseChatItemId = 'my_responseChatItemId',
  4. Map<String, String>? variables,
  5. String? imageUrl,
  6. String? fileName,
  7. bool detail = true,
})

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'});
  }
}