GPTAPI改为流式之后消息的加载
来源:1-1 课程导学

L_sS
2024-10-18
我将接受消息改为流式的,我想做到的效果为和ChatGPT一样一条消息中一块一块的加载,现在是有一个接受到消息块的回调方法,一个结束的回调方法,我需要在addMessage方法怎么改变呢,麻烦老师说一下有什么思路好一点
void _onSendStream(final String inputMessage) async {
chatController.addMessage(
_getMessageModel(ownerType: OwnerType.sender, message: inputMessage));
setState(() {
_sendBtnEnable = false;
});
String response = "";
try {
await completionDao.createStreamCompletions(
prompt: _inputMessage,
onStreamData: (String content) {
content.replaceFirst("\n\n", "");
response = response + content;
debugPrint(response);
chatController.addMessage(_getMessageModel(
ownerType: OwnerType.receiver, message: content));
setState(() {
_sendBtnEnable = true;
});
},
onStreamDone: () {});
} catch (e) {
response = e.toString();
debugPrint(e.toString());
}
}
效果如图:
1回答
-
L_sS
提问者
2024-10-18
已经解决了:
```
@override
void updateMessage(MessageModel message) {
if (messageStreamController.isClosed) return;
inflateMessage(message);
initialMessageList[0] = message;
messageStreamController.sink.add(initialMessageList);
scrollConLastMessage();
}
```
增加了一块修改消息,因为发出消息后没结束状态被锁定所以直接拿第一条最新的消息就行了
```
chatController.addMessage(
_getMessageModel(ownerType: OwnerType.sender, message: inputMessage));
setState(() {
_sendBtnEnable = false;
});
String response = "";
try {
await completionDao.createStreamCompletions(
prompt: _inputMessage,
onStreamData: (String content) {
content.replaceFirst("\n\n", "");
if (response == "") {
response = response + content;
chatController.addMessage(_getMessageModel(
ownerType: OwnerType.receiver, message: content));
} else {
response = response + content;
chatController.updateMessage(_getMessageModel(
ownerType: OwnerType.receiver, message: response));
}
AILogger.log(response);
},
onStreamDone: () {
setState(() {
_sendBtnEnable = true;
});
AILogger.log('结束切换状态');
});
} catch (e) {
response = e.toString();
debugPrint(e.toString());
}
```
然后每次修改替换最新消息的内容,在结束后切换状态
012024-10-20
相似问题