浏览代码

feat(chat): 添加多类型聊天消息支持

- 新增 ChatModel2 和 ChatModel2Data 数据类处理 reason 类型消息
- 修改 ChatVM 中的消息解析逻辑支持 reason 和 string 两种类型
- 添加 currentType 变量追踪当前消息类型状态
- 实现 reason 阶段内容累积和 string 阶段内容重置机制
- 更新导入语句添加 ChatModel2 引用
- 简化注释中的时间戳显示格式
徐勤民 21 小时之前
父节点
当前提交
e2cae52dbc

+ 11 - 1
app/src/main/java/com/nova/brain/glass/model/ChatModel.kt

@@ -7,11 +7,21 @@ data class ChatModel(
     val msg: String?,
     val msg: String?,
 )
 )
 
 
-// {"id":74316,"role":"assistant","createTime":"2026-04-16T08:28:06.428Z","type":"string","data":"建议使用","metadata":{}}
+// {"id":74316,"role":"assistant","createTime":"...","type":"string","data":"建议使用","metadata":{}}
 data class ChatModel1(
 data class ChatModel1(
     val id: Int,
     val id: Int,
     val role: String,
     val role: String,
     val createTime: String,
     val createTime: String,
     val type: String,
     val type: String,
     val data: String,
     val data: String,
+)
+
+// {"id":74418,"role":"assistant","createTime":"...","type":"reason","data":{"content":"-v2","duration":0.0},"metadata":{}}
+data class ChatModel2Data(val content: String)
+data class ChatModel2(
+    val id: Int,
+    val role: String,
+    val createTime: String,
+    val type: String,
+    val data: ChatModel2Data,
 )
 )

+ 20 - 3
app/src/main/java/com/nova/brain/glass/viewmodel/ChatVM.kt

@@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData
 import com.nova.brain.glass.model.ChatItem
 import com.nova.brain.glass.model.ChatItem
 import com.nova.brain.glass.model.ChatModel
 import com.nova.brain.glass.model.ChatModel
 import com.nova.brain.glass.model.ChatModel1
 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.model.data.ChatData
 import com.nova.brain.glass.repository.Service
 import com.nova.brain.glass.repository.Service
 import com.xuqm.base.common.GsonImplHelp
 import com.xuqm.base.common.GsonImplHelp
@@ -50,6 +51,7 @@ class ChatVM : BaseListViewModel<ChatItem>() {
             .subscribeOn(Schedulers.io())
             .subscribeOn(Schedulers.io())
             .subscribe({ body ->
             .subscribe({ body ->
                 var content = ""
                 var content = ""
+                var currentType = ""  // 追踪当前阶段:reason / string
                 body.charStream().buffered().use { reader ->
                 body.charStream().buffered().use { reader ->
                     try {
                     try {
                         var line: String?
                         var line: String?
@@ -80,9 +82,24 @@ class ChatVM : BaseListViewModel<ChatItem>() {
                                     result.postValue(msg)
                                     result.postValue(msg)
                                     return@use
                                     return@use
                                 }
                                 }
-                                if (model.role != "assistant" || model.type != "string") continue
-                                val model1 = GsonImplHelp.get().toObject(json, ChatModel1::class.java)
-                                content += model1.data
+                                if (model.role != "assistant") continue
+                                when (model.type) {
+                                    "reason" -> {
+                                        val m = GsonImplHelp.get().toObject(json, ChatModel2::class.java)
+                                        content += m.data.content
+                                        currentType = "reason"
+                                    }
+                                    "string" -> {
+                                        if (currentType != "string") {
+                                            // 第一条 string:清除 reason 阶段的内容,重新开始
+                                            content = ""
+                                            currentType = "string"
+                                        }
+                                        val m = GsonImplHelp.get().toObject(json, ChatModel1::class.java)
+                                        content += m.data
+                                    }
+                                    else -> continue
+                                }
                                 val lastIndex = chatItems.size - 1
                                 val lastIndex = chatItems.size - 1
                                 if (lastIndex >= 0) {
                                 if (lastIndex >= 0) {
                                     chatItems[lastIndex].content = content
                                     chatItems[lastIndex].content = content