sendMessageStream method

Stream<Map<String, dynamic>> sendMessageStream(
  1. String text
)

Implementation

Stream<Map<String, dynamic>> sendMessageStream(String text) async* {
  final request = http.Request("POST", url)..headers.addAll(_getHeaders());
  request.body = _getBody(text, true);

  final response = await StreamClient.instance.send(request);
  final statusCode = response.statusCode;
  final byteStream = response.stream;

  if (!(statusCode >= 200 && statusCode < 300)) {
    var error = "";
    await for (final byte in byteStream) {
      final decoded = utf8.decode(byte).trim();
      final map = jsonDecode(decoded) as Map;
      final errorMessage = map["error"]["message"] as String;
      error += errorMessage;
    }
    throw Exception(
        "($statusCode) ${error.isEmpty ? "Bad Response" : error}");
  }

  var responseText = "";
  await for (final byte in byteStream) {
    var decoded = utf8.decode(byte);
    final strings = decoded.split("data: ");
    for (final string in strings) {
      final trimmedString = string.trim();
      if (trimmedString.isNotEmpty && !trimmedString.endsWith("[DONE]")) {
        final map = jsonDecode(trimmedString) as Map;
        final choices = map["choices"] as List;
        final delta = choices[0]["delta"] as Map;
        if (delta["content"] != null) {
          final content = delta["content"] as String;
          responseText += content;
          final message = {
            'content': content,
            'completion_tokens': delta['completion_tokens'],
          };
          yield message;
        }
      }
    }
  }

  if (responseText.isNotEmpty) {
    _appendToHistoryList(text, responseText);
  }
}