getResponse method
dynamic
getResponse(
- List<
Message> messages, - ValueChanged<
Message> onResponse, - ValueChanged<
Message> errorCallback, - ValueChanged<
Message> onSuccess,
override
Implementation
@override
getResponse(
List<Message> messages,
ValueChanged<Message> onResponse,
ValueChanged<Message> errorCallback,
ValueChanged<Message> onSuccess) async {
var messageToBeSend = messages.removeLast();
var prompt = messageToBeSend.text;
var history = messages.length >= 2 ? collectHistory(messages) : [];
var body = {'query': prompt, 'history': history.isEmpty ? [] : history};
var glmBaseUrl = GetStorage().read("glmBaseUrl") ?? "";
if (glmBaseUrl.isEmpty) {
errorCallback(Message(
text: "glm baseUrl is empty,please set you glmBaseUrl first",
conversationId: messageToBeSend.conversationId,
role: Role.assistant,
));
return;
}
final request = http.Request("POST", Uri.parse(glmBaseUrl));
request.headers.addAll({'Content-Type': 'application/json'});
final requestBody = json.encode(body);
request.body = requestBody;
try {
final response = await request.send();
/** chunk like this
* event: delta
* data: {"delta": "j", "response": "j", "finished": false}
*/
await for (final chunk in response.stream.transform(utf8.decoder)) {
String data = chunk.split('\n').firstWhere(
(element) => element.startsWith("data:"),
orElse: () => 'No matching data');
if (!data.startsWith("data:")) {
continue;
}
final jsonData = jsonDecode(data.split("data:")[1].trim());
if (jsonData["finished"]) {
onSuccess(Message(
conversationId: messageToBeSend.conversationId,
text: jsonData["response"],
role: Role.assistant));
} else {
onResponse(Message(
conversationId: messageToBeSend.conversationId,
text: jsonData["response"],
role: Role.assistant));
}
}
} catch (e) {
errorCallback(Message(
text: e.toString(),
conversationId: messageToBeSend.conversationId,
role: Role.assistant,
));
}
}