diff --git a/app/src/main/java/com/nova/brain/glass/model/ChatItem.kt b/app/src/main/java/com/nova/brain/glass/model/ChatItem.kt index 211b401..609bc1b 100644 --- a/app/src/main/java/com/nova/brain/glass/model/ChatItem.kt +++ b/app/src/main/java/com/nova/brain/glass/model/ChatItem.kt @@ -2,5 +2,8 @@ package com.nova.brain.glass.model import com.xuqm.base.adapter.BaseItem -data class ChatItem(val title: String, val content: String): BaseItem() { -} +data class ChatItem(val id: Int, val title: String, var content: String) : BaseItem() { + init { + setS_id(id) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nova/brain/glass/model/ChatModel.kt b/app/src/main/java/com/nova/brain/glass/model/ChatModel.kt index e9a6686..e190871 100644 --- a/app/src/main/java/com/nova/brain/glass/model/ChatModel.kt +++ b/app/src/main/java/com/nova/brain/glass/model/ChatModel.kt @@ -1,44 +1,17 @@ package com.nova.brain.glass.model -//{ -// "id": 74216, -// "role": "assistant", -// "createTime": "2026-04-16T06:13:32.678Z", -// "type": "reason", -// "data": { -// "content": "数据。", -// "duration": 0.0 -// }, -// "metadata": {} -//} -//{ -// "id": 74216, -// "role": "assistant", -// "createTime": "2026-04-16T06:13:32.678Z", -// "type": "string", -// "data": "最", -// "metadata": {} -//} //{"date":"2026-04-16T06:49:19.790Z","msg":"当前话题存在进行中的请求,请稍后重试","code":409,"success":false,"uri":"/docqa/chat/qa03","status":409} data class ChatModel( + val role: String?, val type: String?, val msg: String?, ) +// {"id":74316,"role":"assistant","createTime":"2026-04-16T08:28:06.428Z","type":"string","data":"建议使用","metadata":{}} data class ChatModel1( val id: Int, val role: String, val createTime: String, val type: String, val data: String, -) -data class ChatModel2Data( - val content: String, -) -data class ChatModel2( - val id: Int, - val role: String, - val createTime: String, - val type: String, - val data: ChatModel2Data, -) +) \ No newline at end of file diff --git a/app/src/main/java/com/nova/brain/glass/model/RecognizeModel.kt b/app/src/main/java/com/nova/brain/glass/model/RecognizeModel.kt new file mode 100644 index 0000000..e40a5f2 --- /dev/null +++ b/app/src/main/java/com/nova/brain/glass/model/RecognizeModel.kt @@ -0,0 +1,47 @@ +package com.nova.brain.glass.model + + +//{ +// "code": "0", +// "data": { +// "action": { +// "name": "goToDecisionCenter", +// "params": { +// "question": "C919第45架机的零部件采购情况" +// } +// } +// }, +// "message": "home" +//} +data class RecognizeModel( + val code: String, + val data: RecognizeModelData, + val message: String +) + +//{ +// "action": { +// "name": "goToDecisionCenter", +// "params": { +// "question": "C919第45架机的零部件采购情况" +// } +// } +// } +data class RecognizeModelData( + val action: RecognizeAction, +) + +//{ +// "name": "goToDecisionCenter", +// "params": { +// "question": "C919第45架机的零部件采购情况" +// } +// } +data class RecognizeAction( + val name: String, + val params: RecognizeParams, +) + +data class RecognizeParams( + val question: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/nova/brain/glass/model/data/RecognizeData.kt b/app/src/main/java/com/nova/brain/glass/model/data/RecognizeData.kt new file mode 100644 index 0000000..4c198a8 --- /dev/null +++ b/app/src/main/java/com/nova/brain/glass/model/data/RecognizeData.kt @@ -0,0 +1,16 @@ +package com.nova.brain.glass.model.data + +//{ +// "text": "查看下C919第45架机的零部件采购情况", +// "scence": "home", +// "extra": [], +// "actions": [ +// "goToTaskCenter","goToDecisionCenter" +// ] +//} +data class RecognizeData( + val text: String, + val scence: String = "home", + val extra: List = emptyList(), + val actions: List = emptyList() +) diff --git a/app/src/main/java/com/nova/brain/glass/repository/Service.kt b/app/src/main/java/com/nova/brain/glass/repository/Service.kt index 278ca0c..dc62e59 100644 --- a/app/src/main/java/com/nova/brain/glass/repository/Service.kt +++ b/app/src/main/java/com/nova/brain/glass/repository/Service.kt @@ -1,7 +1,9 @@ package com.nova.brain.glass.repository import com.nova.brain.glass.model.ChatModel +import com.nova.brain.glass.model.RecognizeModel import com.nova.brain.glass.model.data.ChatData +import com.nova.brain.glass.model.data.RecognizeData import io.reactivex.Observable import okhttp3.RequestBody import okhttp3.ResponseBody @@ -19,6 +21,9 @@ interface Service { @POST("/cbrain-gateway/cbrain-task-server/cbrain-task/task/glassesSearch") fun demoPost(@Body body: RequestBody): Observable + @POST("/api/intent/recognize") + fun recognize(@Body body: RecognizeData): Observable + @Streaming @POST("/cbrain-gateway/cbraindep/docqa/chat/qa03") fun chat(@Body body: ChatData): Observable diff --git a/app/src/main/java/com/nova/brain/glass/ui/ChatActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/ChatActivity.kt index 2c37d98..bbed42f 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/ChatActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/ChatActivity.kt @@ -1,5 +1,6 @@ package com.nova.brain.glass.ui +import android.view.View import android.widget.TextView import com.nova.brain.glass.R import com.nova.brain.glass.databinding.ActivityChatBinding @@ -37,11 +38,17 @@ class ChatActivity : BaseListFormLayoutNormalActivity= 0) recyclerView.scrollToPosition(lastIndex) } + viewModel.loading.observe(this) { loading -> + binding.pb.visibility = if (loading) View.VISIBLE else View.GONE + } + viewModel.demoPostSse() + } override fun adapter() = object : CommonPagedAdapter(R.layout.item_chat) { override fun convert(holder: ViewHolder, item: ChatItem, position: Int) { + holder.setVisibility(R.id.line, position!=0) val chatItems = viewModel.chatItems val liveItem = if (position < chatItems.size) chatItems[position] else item holder.setText(R.id.title, liveItem.title) diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt index aecfcdf..7ef8913 100644 --- a/app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt @@ -4,7 +4,6 @@ import androidx.lifecycle.MutableLiveData import com.nova.brain.glass.model.ChatItem import com.nova.brain.glass.model.ChatModel import com.nova.brain.glass.model.ChatModel1 -import com.nova.brain.glass.model.ChatModel2 import com.nova.brain.glass.model.data.ChatData import com.nova.brain.glass.repository.Service import com.xuqm.base.common.GsonImplHelp @@ -18,6 +17,7 @@ import io.reactivex.schedulers.Schedulers class ChatVM : BaseListViewModel() { val result = MutableLiveData() + val loading = MutableLiveData() val chatItems: MutableList = mutableListOf() private var currentTask: Disposable? = null @@ -52,16 +52,17 @@ class ChatVM : BaseListViewModel() { currentTask = null val question = questions[questionIndex % questions.size] + val itemId = questionIndex questionIndex++ - chatItems.add(ChatItem(question, "")) + chatItems.add(ChatItem(itemId, question, "")) if (dataSourceReady) invalidate() + loading.postValue(true) currentTask = HttpManager.getApi(Service::class.java).chat(ChatData(question)) .subscribeOn(Schedulers.io()) .subscribe({ body -> var content = "" - var type = "" body.charStream().buffered().use { reader -> try { var line: String? @@ -75,38 +76,47 @@ class ChatVM : BaseListViewModel() { if (chatItems.isNotEmpty()) chatItems.removeAt(chatItems.size - 1) demoPostSse() } + loading.postValue(false) return@use } val json = if (l.startsWith("data:")) l.removePrefix("data:").trim() else l val model = GsonImplHelp.get().toObject(json, ChatModel::class.java) if (model.type == null) { - result.postValue(model.msg ?: json) + loading.postValue(false) + val msg = model.msg ?: json + val lastIndex = chatItems.size - 1 + if (lastIndex >= 0) { + chatItems[lastIndex].content = msg + notifyItem(lastIndex) + } + result.postValue(msg) return@use } - if (type != model.type) { - content = "" - } - type = model.type - if (model.type == "string") { - val model1 = GsonImplHelp.get().toObject(json, ChatModel1::class.java) - content += model1.data - } else { - val model2 = GsonImplHelp.get().toObject(json, ChatModel2::class.java) - content += model2.data.content - } + if (model.role != "assistant" || model.type != "string") continue + val model1 = GsonImplHelp.get().toObject(json, ChatModel1::class.java) + content += model1.data val lastIndex = chatItems.size - 1 if (lastIndex >= 0) { - chatItems[lastIndex] = chatItems[lastIndex].copy(content = content) + chatItems[lastIndex].content = content notifyItem(lastIndex) } result.postValue(content) } } } catch (e: Exception) { - result.postValue("AI反馈异常: ${e.message}") + loading.postValue(false) + val errMsg = "AI反馈异常: ${e.message}" + val lastIndex = chatItems.size - 1 + if (lastIndex >= 0) { + chatItems[lastIndex].content = errMsg + notifyItem(lastIndex) + } + result.postValue(errMsg) } } + loading.postValue(false) }, { e -> + loading.postValue(false) result.postValue("AI反馈异常: ${e.message}") }) currentTask?.also { add(it) } diff --git a/app/src/main/res/drawable/bg_chat.xml b/app/src/main/res/drawable/bg_chat.xml new file mode 100644 index 0000000..92af70f --- /dev/null +++ b/app/src/main/res/drawable/bg_chat.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml index 6f76d3f..a77df26 100644 --- a/app/src/main/res/layout/activity_chat.xml +++ b/app/src/main/res/layout/activity_chat.xml @@ -1,15 +1,52 @@ - - + + - + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_chat.xml b/app/src/main/res/layout/item_chat.xml index f4bbf3f..aaafd76 100644 --- a/app/src/main/res/layout/item_chat.xml +++ b/app/src/main/res/layout/item_chat.xml @@ -2,19 +2,25 @@ + + android:textSize="14sp" />