getResponse method

  1. @override
dynamic getResponse(
  1. List<Message> messages,
  2. ValueChanged<Message> onResponse,
  3. ValueChanged<Message> errorCallback,
  4. 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,
    ));
  }
}