1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| class AIViewModel : ViewModel() {
private val _messages = MutableLiveData<List<Msg>>() val messages: LiveData<List<Msg>> = _messages
private val _isLoading = MutableLiveData<Boolean>() val isLoading: LiveData<Boolean> = _isLoading
private val _error = MutableLiveData<String?>() val error: LiveData<String?> = _error
private val messageList = mutableListOf<Msg>()
init { _messages.value = messageList _isLoading.value = false _error.value = null }
fun sendMessage(content: String) { if (content.isBlank()) return
addMessage(Msg(content, Msg.TYPE_SENT))
requestAIResponse(content) }
private fun requestAIResponse(question: String) { viewModelScope.launch { try { _isLoading.value = true _error.value = null
addMessage(Msg("正在思考中...", Msg.TYPE_RESERVED))
val result = withContext(Dispatchers.IO) { val requestBody = GeminiRequestBody( contents = listOf(Content(parts = listOf(Part(text = question)))) ) AInetwork.generateContent(requestBody) }
removeLastMessage()
result.onSuccess { response -> val aiResponse = response.candidates.firstOrNull()?.content?.parts?.firstOrNull()?.text
if (aiResponse.isNullOrEmpty()) { addMessage(Msg("抱歉,我暂时无法回答您的问题。", Msg.TYPE_RESERVED)) } else { addMessage(Msg(aiResponse, Msg.TYPE_RESERVED)) } }.onFailure { exception -> val errorMsg = "网络请求失败: ${exception.message}" addMessage(Msg(errorMsg, Msg.TYPE_RESERVED)) _error.value = errorMsg }
} catch (e: Exception) { removeLastMessage() val errorMsg = "发生未知错误,请稍后重试。" addMessage(Msg(errorMsg, Msg.TYPE_RESERVED)) _error.value = errorMsg } finally { _isLoading.value = false } } }
private fun addMessage(message: Msg) { messageList.add(message) _messages.value = messageList.toList() }
private fun removeLastMessage() { if (messageList.isNotEmpty()) { messageList.removeAt(messageList.size - 1) _messages.value = messageList.toList() } } }
|