sendMessageStream method
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);
}
}