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 {
  List<OpenAIChatCompletionChoiceMessageModel> openAIMessages = [];
  //将messages反转
  messages = messages.reversed.toList();
  // 将messages里面的每条消息的内容取出来拼接在一起
  String content = "";
  String currentModel = SettingsController.to.gptModel.value;
  int maxTokenLength = 1800;
  switch (currentModel) {
    case "gpt-3.5-turbo":
      maxTokenLength = 1800;
      break;
    case "gpt-3.5-turbo-16k":
      maxTokenLength = 10000;
      break;
    default:
      maxTokenLength = 1800;
      break;
  }
  bool useWebSearch = SettingsController.to.useWebSearch.value;
  if (useWebSearch) {
    messages.first.text = await fetchAndParse(messages.first.text);
  }
  for (Message message in messages) {
    content = content + message.text;
    if (content.length < maxTokenLength || openAIMessages.isEmpty) {
      // 插入到 openAIMessages 第一个位置
      openAIMessages.insert(
        0,
        OpenAIChatCompletionChoiceMessageModel(
          content: [
            OpenAIChatCompletionChoiceMessageContentItemModel(
              text: message.text,
              type: 'text',
            )
          ],
          role: message.role.asOpenAIChatMessageRole,
        ),
      );
    }
  }
  var message = Message(
      conversationId: messages.first.conversationId,
      text: "",
      role: Role.assistant); //仅仅第一个返回了角色
  if (SettingsController.to.useStream.value) {
    Stream<OpenAIStreamChatCompletionModel> chatStream = OpenAI.instance.chat
        .createStream(model: currentModel, messages: openAIMessages);
    chatStream.listen(
      (chatStreamEvent) async {
        if (chatStreamEvent.choices.first.delta.content != null) {
          // message.text = message.text + chatStreamEvent.choices.first.delta.content!;
          var contentList = chatStreamEvent.choices.first.delta.content!;
          message.text = message.text + extractContentText(contentList);
          try {
            var hasVibration = await Vibration.hasVibrator();
            if (hasVibration != null && hasVibration) {
              Vibration.vibrate(duration: 50, amplitude: 128);
            }
          } catch (e) {
            // ignore
          }

          onResponse(message);
        }
      },
      onError: (error) {
        message.text = error.message;
        errorCallback(message);
      },
      onDone: () {
        onSuccess(message);
      },
    );
  } else {
    try {
      var response = await OpenAI.instance.chat.create(
        model: currentModel,
        messages: openAIMessages,
      );
      // message.text = response.choices.first.message.content;
      var contentList = response.choices.first.message.content!;
      message.text = message.text + extractContentText(contentList);
      onSuccess(message);
    } catch (e) {
      message.text = e.toString();
      errorCallback(message);
    }
  }
}