|
|
@ -132,6 +132,7 @@ object AgentService : CoroutineScope { |
|
|
|
|
|
|
|
|
// 自定义系统提示词 |
|
|
// 自定义系统提示词 |
|
|
val customSystemPrompt = config["systemPrompt"] as? String |
|
|
val customSystemPrompt = config["systemPrompt"] as? String |
|
|
|
|
|
FileLogger.i(TAG, "初始化 系统提示词:$config") |
|
|
if (!customSystemPrompt.isNullOrBlank()) { |
|
|
if (!customSystemPrompt.isNullOrBlank()) { |
|
|
systemPrompt = customSystemPrompt |
|
|
systemPrompt = customSystemPrompt |
|
|
} else { |
|
|
} else { |
|
|
@ -559,6 +560,7 @@ object AgentService : CoroutineScope { |
|
|
|
|
|
|
|
|
// 使用历史记录作为上下文发送到OpenAI |
|
|
// 使用历史记录作为上下文发送到OpenAI |
|
|
val responseBuilder = StringBuilder() |
|
|
val responseBuilder = StringBuilder() |
|
|
|
|
|
var metadata:String = "" |
|
|
|
|
|
|
|
|
// 添加系统提示词到历史消息的副本中 |
|
|
// 添加系统提示词到历史消息的副本中 |
|
|
val messagesWithSystemPrompt = JSONArray() |
|
|
val messagesWithSystemPrompt = JSONArray() |
|
|
@ -637,7 +639,7 @@ object AgentService : CoroutineScope { |
|
|
addToHistoryMessages(openAIService.createAssistantMessage(response)) |
|
|
addToHistoryMessages(openAIService.createAssistantMessage(response)) |
|
|
|
|
|
|
|
|
// 保存聊天记录 |
|
|
// 保存聊天记录 |
|
|
saveChatMessage(displayText, response) |
|
|
saveChatMessage(displayText, response,metadata) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 标记AI流式输出已完成 |
|
|
// 标记AI流式输出已完成 |
|
|
@ -675,15 +677,38 @@ object AgentService : CoroutineScope { |
|
|
FileLogger.d(TAG, "mcp调用结果: $functionCallResult") |
|
|
FileLogger.d(TAG, "mcp调用结果: $functionCallResult") |
|
|
val metaStr = functionCallResult.optString("meta") |
|
|
val metaStr = functionCallResult.optString("meta") |
|
|
if (metaStr.isNotEmpty()) { |
|
|
if (metaStr.isNotEmpty()) { |
|
|
|
|
|
metadata = metaStr; |
|
|
val meta = JSONObject(metaStr) |
|
|
val meta = JSONObject(metaStr) |
|
|
FileLogger.d(TAG, "mcp调用结果: $metaStr") |
|
|
FileLogger.d(TAG, "mcp调用结果: $metaStr") |
|
|
if (meta.has("card_music")) { |
|
|
if (meta.has("card_music")) { //音乐卡片 |
|
|
val cardMusic = meta.getJSONObject("card_music") |
|
|
val cardMusic = meta.getJSONObject("card_music") |
|
|
FileLogger.d(TAG, "检查到音乐卡片: $cardMusic") |
|
|
FileLogger.d(TAG, "检查到音乐卡片: $cardMusic") |
|
|
val musicUrl = cardMusic.optString("url", "") |
|
|
val musicUrl = cardMusic.optString("url", "") |
|
|
val name = cardMusic.optString("name", "") |
|
|
val name = cardMusic.optString("name", "") |
|
|
val sgener = cardMusic.optString("sgener", "") |
|
|
val sgener = cardMusic.optString("sgener", "") |
|
|
processMusicPlay(musicUrl, name, sgener) |
|
|
processMusicPlay(musicUrl, name, sgener) |
|
|
|
|
|
}else if (meta.has("card_musiclist")) { //音乐列表 |
|
|
|
|
|
val cardMusiclist = meta.getJSONObject("card_musiclist") |
|
|
|
|
|
val musics = cardMusiclist.optJSONArray("musics") |
|
|
|
|
|
if (musics != null) { |
|
|
|
|
|
val playlist = mutableListOf<Map<String, String>>() |
|
|
|
|
|
for (i in 0 until musics.length()) { |
|
|
|
|
|
val item = musics.optJSONObject(i) ?: continue |
|
|
|
|
|
val url = item.optString("url", "") |
|
|
|
|
|
val name = item.optString("name", "") |
|
|
|
|
|
val sgener = item.optString("sgener", "") |
|
|
|
|
|
if (url.isNotEmpty()) { |
|
|
|
|
|
playlist.add(mapOf("url" to url, "name" to name, "sgener" to sgener)) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (playlist.isNotEmpty()) { |
|
|
|
|
|
processMusicPlayList(playlist) |
|
|
|
|
|
} else { |
|
|
|
|
|
FileLogger.w(TAG, "card_musiclist 中没有有效的音乐条目") |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
FileLogger.w(TAG, "card_musiclist.musics 不是一个数组") |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -784,7 +809,7 @@ object AgentService : CoroutineScope { |
|
|
/** |
|
|
/** |
|
|
* 保存聊天消息 |
|
|
* 保存聊天消息 |
|
|
*/ |
|
|
*/ |
|
|
private fun saveChatMessage(userMessage: String, assistantMessage: String) { |
|
|
private fun saveChatMessage(userMessage: String, assistantMessage: String,metadata : String) { |
|
|
launch(Dispatchers.IO) { |
|
|
launch(Dispatchers.IO) { |
|
|
try { |
|
|
try { |
|
|
// 保存用户消息 |
|
|
// 保存用户消息 |
|
|
@ -799,7 +824,8 @@ object AgentService : CoroutineScope { |
|
|
val assistantMessageId = chatStorageHelper.saveMessage( |
|
|
val assistantMessageId = chatStorageHelper.saveMessage( |
|
|
sessionId = sessionId, |
|
|
sessionId = sessionId, |
|
|
message = assistantMessage, |
|
|
message = assistantMessage, |
|
|
sender = "assistant" |
|
|
sender = "assistant", |
|
|
|
|
|
metadata = metadata |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
// if (assistantMessageId != -1L) { |
|
|
// if (assistantMessageId != -1L) { |
|
|
@ -977,4 +1003,21 @@ object AgentService : CoroutineScope { |
|
|
FileLogger.i(TAG, "启动音乐服务 播放音乐 $musicUrl") |
|
|
FileLogger.i(TAG, "启动音乐服务 播放音乐 $musicUrl") |
|
|
MusicServiceStarter.startServiceWithCommand(context, "play", url = musicUrl) |
|
|
MusicServiceStarter.startServiceWithCommand(context, "play", url = musicUrl) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 处理音乐播放列表 |
|
|
|
|
|
* 将ai返回的音乐连接 在后台启动播放 |
|
|
|
|
|
* |
|
|
|
|
|
* @param musicUrl 图片文件路径 |
|
|
|
|
|
* @param name 歌曲名称,默认为空 |
|
|
|
|
|
* @param singer 歌手,默认为false |
|
|
|
|
|
* @return 是否成功开始处理 |
|
|
|
|
|
*/ |
|
|
|
|
|
fun processMusicPlayList(playlist:List<Map<String,String>>){ |
|
|
|
|
|
// 在其他 Service、BroadcastReceiver 或 Application 中调用 |
|
|
|
|
|
|
|
|
|
|
|
val urls = playlist.mapNotNull { it["url"] }.distinct() |
|
|
|
|
|
FileLogger.i(TAG, "启动音乐服务 播放音乐列表 $urls") |
|
|
|
|
|
MusicServiceStarter.startServiceWithPlaylist(context, "playlist", urls = urls) |
|
|
|
|
|
} |
|
|
} |
|
|
} |