From 54ca1d3f1c2076c33c4468d7f5f1093da4c0396b Mon Sep 17 00:00:00 2001 From: weber Date: Fri, 8 Aug 2025 18:53:10 +0800 Subject: [PATCH] =?UTF-8?q?Ai=E5=92=8C=E7=94=A8=E6=88=B7=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=88=86=E7=BB=84=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiosman/ravenow/data/api/RiderProAPI.kt | 13 ++++ .../main/java/com/aiosman/ravenow/ui/Navi.kt | 4 +- .../aiosman/ravenow/ui/chat/ChatAiScreen.kt | 26 ++------ .../ravenow/ui/chat/ChatAiViewModel.kt | 14 ++++ .../ui/index/tabs/ai/tabs/mine/MineAgent.kt | 2 +- .../tabs/ai/tabs/mine/MineAgentViewModel.kt | 66 +++++++++++++++++-- 6 files changed, 95 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/aiosman/ravenow/data/api/RiderProAPI.kt b/app/src/main/java/com/aiosman/ravenow/data/api/RiderProAPI.kt index ff58d12..30d4a97 100644 --- a/app/src/main/java/com/aiosman/ravenow/data/api/RiderProAPI.kt +++ b/app/src/main/java/com/aiosman/ravenow/data/api/RiderProAPI.kt @@ -43,6 +43,16 @@ data class SingleChatRequestBody( val generateText: String, ) + +data class SendChatAiRequestBody( + @SerializedName("fromTrtcUserId") + val fromTrtcUserId: String, + @SerializedName("toTrtcUserId") + val toTrtcUserId: String, + @SerializedName("message") + val message: String, +) + data class LoginUserRequestBody( @SerializedName("username") val username: String? = null, @@ -512,6 +522,9 @@ interface RaveNowAPI { @POST("outside/rooms/create-single-chat") suspend fun createSingleChat(@Body body: SingleChatRequestBody): Response> + @POST("outside/rooms/message") + suspend fun sendChatAiMessage(@Body body: SendChatAiRequestBody): Response> + diff --git a/app/src/main/java/com/aiosman/ravenow/ui/Navi.kt b/app/src/main/java/com/aiosman/ravenow/ui/Navi.kt index 8b661ca..9512b90 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/Navi.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/Navi.kt @@ -472,9 +472,9 @@ fun NavHostController.navigateToChat(id: String) { ) } -fun NavHostController.navigateToChatnavigateToChatAi(id: String) { +fun NavHostController.navigateToChatAi(id: String) { navigate( - route = NavigationRoute.Chat.route + route = NavigationRoute.ChatAi.route .replace("{id}", id) ) } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt index abd4d6a..d388991 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt @@ -93,10 +93,10 @@ fun ChatAiScreen(userId: String) { val AppColors = LocalAppTheme.current var goToNewCount by remember { mutableStateOf(0) } val viewModel = viewModel( - key = "ChatViewModel_$userId", + key = "ChatAiViewModel_$userId", factory = object : ViewModelProvider.Factory { override fun create(modelClass: Class): T { - return ChatViewModel(userId) as T + return ChatAiViewModel(userId) as T } } ) @@ -254,7 +254,7 @@ fun ChatAiScreen(userId: String) { AppColors.decentBackground) ) Spacer(modifier = Modifier.height(8.dp)) - ChatInput( + ChatAiInput( onSendImage = { it?.let { viewModel.sendImageMessage(it, context) @@ -298,7 +298,7 @@ fun ChatAiScreen(userId: String) { ) } - ChatItem(item = item, viewModel.myProfile?.trtcUserId!!) + ChatAiItem(item = item, viewModel.myProfile?.trtcUserId!!) } @@ -593,24 +593,6 @@ fun ChatAiInput( ) ) } - Spacer(modifier = Modifier.width(16.dp)) - Icon( - painter = painterResource(id = R.drawable.rider_pro_camera), - contentDescription = "Emoji", - modifier = Modifier - .size(30.dp) - .noRippleClickable { - imagePickUpLauncher.launch( - Intent.createChooser( - Intent(Intent.ACTION_GET_CONTENT).apply { - type = "image/*" - }, - "Select Image" - ) - ) - }, - tint = appColors.chatActionColor - ) Spacer(modifier = Modifier.width(8.dp)) Crossfade( targetState = text.isNotEmpty(), animationSpec = tween(500), diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiViewModel.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiViewModel.kt index 457bdbc..4bde778 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiViewModel.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiViewModel.kt @@ -15,6 +15,9 @@ import com.aiosman.ravenow.data.AccountService import com.aiosman.ravenow.data.AccountServiceImpl import com.aiosman.ravenow.data.UserService import com.aiosman.ravenow.data.UserServiceImpl +import com.aiosman.ravenow.data.api.ApiClient +import com.aiosman.ravenow.data.api.SendChatAiRequestBody +import com.aiosman.ravenow.data.api.SingleChatRequestBody import com.aiosman.ravenow.entity.AccountProfileEntity import com.aiosman.ravenow.entity.ChatItem import com.aiosman.ravenow.entity.ChatNotification @@ -147,6 +150,7 @@ class ChatAiViewModel( override fun onSuccess(p0: V2TIMMessage?) { Log.d("ChatViewModel", "send message success") + sendChatAiMessage(myProfile?.trtcUserId!!,userProfile?.trtcUserId!!, message) val chatItem = ChatItem.convertToChatItem(p0!!, context, avatar = myProfile?.avatar) chatItem?.let { chatData = listOf(it) + chatData @@ -250,6 +254,16 @@ class ChatAiViewModel( } ) } + fun sendChatAiMessage( + fromTrtcUserId: String, + toTrtcUserId: String, + message: String, + ) { + viewModelScope.launch { + val response = ApiClient.api.sendChatAiMessage(SendChatAiRequestBody(fromTrtcUserId = fromTrtcUserId,toTrtcUserId = toTrtcUserId,message = message)) + } + + } fun getDisplayChatList(): List { val list = chatData diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgent.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgent.kt index 441a321..94fba83 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgent.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgent.kt @@ -115,7 +115,7 @@ fun MineAgent() { val agentItem = agentList[idx] AgentCard(agentEntity = agentItem, onClick = { - //model.createSingleChat(agentItem.openId) + model.createSingleChat(agentItem.openId) model.goToChatAi(agentItem.openId,navController) }) } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgentViewModel.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgentViewModel.kt index e934f47..00d86b2 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgentViewModel.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/ai/tabs/mine/MineAgentViewModel.kt @@ -14,6 +14,13 @@ import com.aiosman.ravenow.entity.AgentEntity import com.aiosman.ravenow.ui.index.tabs.message.Conversation import com.aiosman.ravenow.ui.index.tabs.message.MessageListViewModel.userService import com.aiosman.ravenow.ui.navigateToChat +import com.aiosman.ravenow.ui.navigateToChatAi +import com.tencent.imsdk.v2.V2TIMConversation +import com.tencent.imsdk.v2.V2TIMConversationListFilter +import com.tencent.imsdk.v2.V2TIMConversationOperationResult +import com.tencent.imsdk.v2.V2TIMConversationResult +import com.tencent.imsdk.v2.V2TIMManager +import com.tencent.imsdk.v2.V2TIMValueCallback import kotlinx.coroutines.launch import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody.Companion.toRequestBody @@ -96,12 +103,60 @@ object MineAgentViewModel : ViewModel() { } } - suspend fun createSingleChat( + fun createGroup2ChatAi( + trtcUserId: String, + groupName: String + ) { + val conversationIDList = listOf("c2c_${trtcUserId}") + + V2TIMManager.getConversationManager().createConversationGroup( + groupName, + conversationIDList, + object : V2TIMValueCallback> { + override fun onSuccess(v2TIMConversationOperationResults: List) { + // 创建会话分组成功 + } + + override fun onError(code: Int, desc: String) { + // 创建会话分组失败 + } + } + ) + V2TIMManager.getConversationManager().getConversationGroupList(object : V2TIMValueCallback> { + override fun onSuccess(v2TIMConversationOperationResults: List) { + // 获取会话分组列表成功 + } + + override fun onError(code: Int, desc: String?) { + TODO("Not yet implemented") + } + }) + val filter = V2TIMConversationListFilter() + filter.conversationGroup = "ai_group" + + V2TIMManager.getConversationManager().getConversationListByFilter( + filter, + 1000, + 10000, + object : V2TIMValueCallback { + override fun onSuccess(v2TIMConversationResult: V2TIMConversationResult) { + // 获取会话列表成功 + } + + override fun onError(code: Int, desc: String) { + // 获取会话列表失败 + } + } + ) + } + + + fun createSingleChat( openId: String, - ): String { + ) { + viewModelScope.launch { val response = ApiClient.api.createSingleChat(SingleChatRequestBody(generateText = openId)) - val body = response.body()?.data ?: throw ServiceException("Failed to create single chat") - return body.toString() + } } fun goToChatAi( @@ -110,7 +165,8 @@ object MineAgentViewModel : ViewModel() { ) { viewModelScope.launch { val profile = userService.getUserProfileByOpenId(openId) - navController.navigateToChat(profile.id.toString()) + createGroup2ChatAi(profile.trtcUserId,"ai_group") + navController.navigateToChatAi(profile.id.toString()) } } } \ No newline at end of file