From dce11bc78d023171c2cd0c3c8cdb3c4e9a72c06c Mon Sep 17 00:00:00 2001 From: pwh-pwh Date: Fri, 8 Dec 2023 17:06:09 +0800 Subject: [PATCH] Add message type filter and system messages handling Added a new attribute 'type' to the Message class and an enumeration MessageType to accommodate different types of messages. Updated the filters in toTextList() method and adjusted the code in several areas to handle system messages accordingly. The message type is now considered when populating and presenting chat messages to the user. --- .../dev/coderpwh/sparkapidesk/pojo/Message.kt | 12 ++++- .../sparkapidesk/screen/ChatScreen.kt | 51 ++++++++++++++----- .../sparkapidesk/service/CommandService.kt | 3 +- 3 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/dev/coderpwh/sparkapidesk/pojo/Message.kt b/src/main/kotlin/dev/coderpwh/sparkapidesk/pojo/Message.kt index 44c8a4d..cad0cb6 100644 --- a/src/main/kotlin/dev/coderpwh/sparkapidesk/pojo/Message.kt +++ b/src/main/kotlin/dev/coderpwh/sparkapidesk/pojo/Message.kt @@ -13,11 +13,19 @@ data class Message( val id: String, var content: String, var createTime: Date, - var sender: String + var sender: String, + var type: MessageType = MessageType.AssistantMessage ) +enum class MessageType { + SysMessage, + AssistantMessage +} + fun SnapshotStateList.toTextList():List { - return map { + return filter { + it.type != MessageType.SysMessage + }.map { Text( role = it.sender, content = it.content diff --git a/src/main/kotlin/dev/coderpwh/sparkapidesk/screen/ChatScreen.kt b/src/main/kotlin/dev/coderpwh/sparkapidesk/screen/ChatScreen.kt index 5f5f1b8..aa5322c 100644 --- a/src/main/kotlin/dev/coderpwh/sparkapidesk/screen/ChatScreen.kt +++ b/src/main/kotlin/dev/coderpwh/sparkapidesk/screen/ChatScreen.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import dev.coderpwh.sparkapidesk.client.SparkApiClient import dev.coderpwh.sparkapidesk.pojo.Message +import dev.coderpwh.sparkapidesk.pojo.MessageType import dev.coderpwh.sparkapidesk.service.CommandService import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -55,10 +56,14 @@ fun ChatScreen() { var cmdService = CommandService() var scope = rememberCoroutineScope() var rememberLazyListState = rememberLazyListState() - ShowMessage(msgList, modifier = Modifier.align(Alignment.TopCenter) - .fillMaxHeight(0.85f),state = rememberLazyListState) - Row(modifier = Modifier.padding(8.dp) - .align(Alignment.BottomCenter).fillMaxWidth()) { + ShowMessage( + msgList, modifier = Modifier.align(Alignment.TopCenter) + .fillMaxHeight(0.85f), state = rememberLazyListState + ) + Row( + modifier = Modifier.padding(8.dp) + .align(Alignment.BottomCenter).fillMaxWidth() + ) { // 输入框 OutlinedTextField( @@ -75,11 +80,20 @@ fun ChatScreen() { SparkApiClient(cmdService).simpleChat(msgList) rememberLazyListState.animateScrollToItem(rememberLazyListState.firstVisibleItemIndex + 2) } catch (e: Exception) { - msgList.add(Message(UUID.randomUUID().toString(), e.toString(), Date(), "assistant")) + msgList.add( + Message( + UUID.randomUUID().toString(), + e.toString(), + Date(), + "assistant", + MessageType.SysMessage + ) + ) } } true } + else -> false } }, @@ -99,7 +113,15 @@ fun ChatScreen() { SparkApiClient(cmdService).simpleChat(msgList) rememberLazyListState.animateScrollToItem(rememberLazyListState.firstVisibleItemIndex + 2) } catch (e: Exception) { - msgList.add(Message(UUID.randomUUID().toString(), e.toString(), Date(), "assistant")) + msgList.add( + Message( + UUID.randomUUID().toString(), + e.toString(), + Date(), + "assistant", + MessageType.SysMessage + ) + ) } } }, modifier = Modifier.height(60.dp).padding(top = 9.dp)) { @@ -112,12 +134,11 @@ fun ChatScreen() { } @Composable -fun ShowMessage(msgList:List,modifier: Modifier,state:LazyListState) { +fun ShowMessage(msgList: List, modifier: Modifier, state: LazyListState) { LazyColumn( modifier = modifier, state = state ) { - items(items = msgList) { - msg -> + items(items = msgList) { msg -> if (msg.sender == "assistant") { MessageLeft(msg) } else { @@ -128,12 +149,12 @@ fun ShowMessage(msgList:List,modifier: Modifier,state:LazyListState) { } @Composable -fun MessageLeft(msg:Message) { +fun MessageLeft(msg: Message) { Row( modifier = Modifier.padding(all = 10.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Start - ){ + ) { Image( painter = painterResource("gpt.png"), contentDescription = "gpt头像", @@ -147,9 +168,11 @@ fun MessageLeft(msg:Message) { mutableStateOf(true) } Column { - Text(text = msg.sender, + Text( + text = msg.sender, color = MaterialTheme.colors.secondary, - style = MaterialTheme.typography.body2) + style = MaterialTheme.typography.body2 + ) Spacer(modifier = Modifier.height(10.dp)) Surface( shape = RectangleShape, @@ -177,7 +200,7 @@ fun MessageLeft(msg:Message) { } @Composable -fun MessageRight(msg:Message) { +fun MessageRight(msg: Message) { Row( modifier = Modifier .padding(10.dp) diff --git a/src/main/kotlin/dev/coderpwh/sparkapidesk/service/CommandService.kt b/src/main/kotlin/dev/coderpwh/sparkapidesk/service/CommandService.kt index 8911aef..e714f17 100644 --- a/src/main/kotlin/dev/coderpwh/sparkapidesk/service/CommandService.kt +++ b/src/main/kotlin/dev/coderpwh/sparkapidesk/service/CommandService.kt @@ -2,6 +2,7 @@ package dev.coderpwh.sparkapidesk.service import androidx.compose.runtime.snapshots.SnapshotStateList import dev.coderpwh.sparkapidesk.pojo.Message +import dev.coderpwh.sparkapidesk.pojo.MessageType import java.util.* /** @@ -18,7 +19,7 @@ class CommandService { true } "/help" -> { - msgList.add(Message(UUID.randomUUID().toString(),"/clear: 清空聊天记录\n/help: 帮助", Date(),"assistant")) + msgList.add(Message(UUID.randomUUID().toString(),"/clear: 清空聊天记录\n/help: 帮助", Date(),"assistant",MessageType.SysMessage)) true } else -> {