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 {
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);
}
}
}