|
|
|
@ -154,7 +154,9 @@ class AgentServiceImpl: NSObject { |
|
|
|
if let openaiModel = config["openaiModel"] as? String { |
|
|
|
self.model = openaiModel |
|
|
|
} |
|
|
|
|
|
|
|
if let openaivisionModel = config["openaivisionModel"] as? String { |
|
|
|
self.visionModel = openaivisionModel |
|
|
|
} |
|
|
|
if let customSystemPrompt = config["systemPrompt"] as? String, !customSystemPrompt.isEmpty { |
|
|
|
self.systemPrompt = customSystemPrompt |
|
|
|
} else { |
|
|
|
@ -501,7 +503,7 @@ audioStream.saveAudioDataTo(data: audioData) |
|
|
|
os_log("sendMessageStream调用完成", log: logger, type: .info) |
|
|
|
} |
|
|
|
|
|
|
|
func processImageInput(imagePath: String, text: String, speakResponse: Bool) -> Bool { |
|
|
|
func processImageInput(imagePath: String,imageUrl: String, text: String, speakResponse: Bool) -> Bool { |
|
|
|
if !isInitialized { |
|
|
|
sendError("服务未初始化", code: "NOT_INITIALIZED") |
|
|
|
return false |
|
|
|
@ -525,15 +527,15 @@ audioStream.saveAudioDataTo(data: audioData) |
|
|
|
DispatchQueue.global(qos: .userInitiated).async { [weak self] in |
|
|
|
guard let self = self else { return } |
|
|
|
|
|
|
|
guard let imageBase64 = chatApiService.fileToBase64(filePath: imagePath) else { |
|
|
|
DispatchQueue.main.async { |
|
|
|
self.sendEvent(name: "error", data: [ |
|
|
|
"code": "IMAGE_CONVERSION_FAILED", |
|
|
|
"message": "图片转换失败" |
|
|
|
]) |
|
|
|
} |
|
|
|
return |
|
|
|
} |
|
|
|
// guard let imageBase64 = chatApiService.fileToBase64(filePath: imagePath) else { |
|
|
|
// DispatchQueue.main.async { |
|
|
|
// self.sendEvent(name: "error", data: [ |
|
|
|
// "code": "IMAGE_CONVERSION_FAILED", |
|
|
|
// "message": "图片转换失败" |
|
|
|
// ]) |
|
|
|
// } |
|
|
|
// return |
|
|
|
// } |
|
|
|
|
|
|
|
DispatchQueue.main.async { |
|
|
|
self.sendEvent(name: "image_ready", data: [ |
|
|
|
@ -541,7 +543,7 @@ audioStream.saveAudioDataTo(data: audioData) |
|
|
|
"imagePath": imagePath |
|
|
|
]) |
|
|
|
|
|
|
|
let userMessage = chatApiService.createUserMessageWithImage(text: text, imageBase64: imageBase64) |
|
|
|
let userMessage = chatApiService.createUserMessageWithImage(text: text, imageUrl: imageUrl) |
|
|
|
let displayText = text.isEmpty ? "[图片]" : text |
|
|
|
|
|
|
|
self.processWithChatApiServiceInternal( |
|
|
|
@ -747,38 +749,16 @@ private func jsonToString(_ json: [String: Any]) -> String? { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 处理音乐卡片 |
|
|
|
private func processMusicCard(_ cardMusic: [String: Any]) { |
|
|
|
let id = cardMusic["id"] as? Int ?? 0 |
|
|
|
let url = cardMusic["url"] as? String ?? "" |
|
|
|
let title = cardMusic["name"] as? String ?? "" |
|
|
|
let artist = cardMusic["sgener"] as? String ?? "" |
|
|
|
let coverUrl = cardMusic["image"] as? String ?? "" |
|
|
|
let ts = cardMusic["ts"] as? Int ?? 0 |
|
|
|
|
|
|
|
processMusicPlay([ |
|
|
|
"id": id, |
|
|
|
"url": url, |
|
|
|
"title": title, |
|
|
|
"artist": artist, |
|
|
|
"coverUrl": coverUrl, |
|
|
|
"ts": ts |
|
|
|
]) |
|
|
|
} |
|
|
|
|
|
|
|
// 处理音乐列表卡片 |
|
|
|
private func processMusicListCard(_ musics: [[String: Any]]) { |
|
|
|
var playlist: [[String: Any]] = [] |
|
|
|
|
|
|
|
for item in musics { |
|
|
|
let id = item["id"] as? Int ?? 0 |
|
|
|
let url = item["url"] as? String ?? "" |
|
|
|
let title = item["name"] as? String ?? "" |
|
|
|
let artist = item["sgener"] as? String ?? "" |
|
|
|
let coverUrl = item["image"] as? String ?? "" |
|
|
|
let ts = item["ts"] as? Int ?? 0 |
|
|
|
|
|
|
|
playlist.append([ |
|
|
|
// 处理音乐卡片 |
|
|
|
private func processMusicCard(_ cardMusic: [String: Any]) { |
|
|
|
let id = cardMusic["id"] as? Int ?? 0 |
|
|
|
let url = cardMusic["url"] as? String ?? "" |
|
|
|
let title = cardMusic["name"] as? String ?? "" |
|
|
|
let artist = cardMusic["sgener"] as? String ?? "" |
|
|
|
let coverUrl = cardMusic["image"] as? String ?? "" |
|
|
|
let ts = cardMusic["ts"] as? Int ?? 0 |
|
|
|
|
|
|
|
processMusicPlay([ |
|
|
|
"id": id, |
|
|
|
"url": url, |
|
|
|
"title": title, |
|
|
|
@ -787,19 +767,41 @@ private func processMusicListCard(_ musics: [[String: Any]]) { |
|
|
|
"ts": ts |
|
|
|
]) |
|
|
|
} |
|
|
|
|
|
|
|
if !playlist.isEmpty { |
|
|
|
processMusicPlayList(playlist) |
|
|
|
|
|
|
|
// 处理音乐列表卡片 |
|
|
|
private func processMusicListCard(_ musics: [[String: Any]]) { |
|
|
|
var playlist: [[String: Any]] = [] |
|
|
|
|
|
|
|
for item in musics { |
|
|
|
let id = item["id"] as? Int ?? 0 |
|
|
|
let url = item["url"] as? String ?? "" |
|
|
|
let title = item["name"] as? String ?? "" |
|
|
|
let artist = item["sgener"] as? String ?? "" |
|
|
|
let coverUrl = item["image"] as? String ?? "" |
|
|
|
let ts = item["ts"] as? Int ?? 0 |
|
|
|
|
|
|
|
playlist.append([ |
|
|
|
"id": id, |
|
|
|
"url": url, |
|
|
|
"title": title, |
|
|
|
"artist": artist, |
|
|
|
"coverUrl": coverUrl, |
|
|
|
"ts": ts |
|
|
|
]) |
|
|
|
} |
|
|
|
|
|
|
|
if !playlist.isEmpty { |
|
|
|
processMusicPlayList(playlist) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 处理导航卡片 |
|
|
|
private func processNavigationCard(_ cardNavigation: [String: Any]) { |
|
|
|
let start = cardNavigation["start"] as? String ?? "" |
|
|
|
let end = cardNavigation["end"] as? String ?? "" |
|
|
|
// 实际处理导航逻辑 |
|
|
|
print("启动导航: 从 \(start) 到 \(end)") |
|
|
|
} |
|
|
|
// 处理导航卡片 |
|
|
|
private func processNavigationCard(_ cardNavigation: [String: Any]) { |
|
|
|
let start = cardNavigation["start"] as? String ?? "" |
|
|
|
let end = cardNavigation["end"] as? String ?? "" |
|
|
|
// 实际处理导航逻辑 |
|
|
|
print("启动导航: 从 \(start) 到 \(end)") |
|
|
|
} |
|
|
|
// 后台播放单曲 |
|
|
|
private func processMusicPlay(_ song: [String: Any]) { |
|
|
|
sendEvent(name: "music_play", data: song) |
|
|
|
|