-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMusicAssistant.swift
More file actions
92 lines (76 loc) · 2.79 KB
/
MusicAssistant.swift
File metadata and controls
92 lines (76 loc) · 2.79 KB
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
import Foundation
import PythonKit
class MusicAssistant: ObservableObject {
@Published var messages: [Message] = []
@Published var isProcessing = false
private var pythonAssistant: PythonObject?
struct Message: Identifiable {
let id = UUID()
let text: String
let isUser: Bool
let timestamp: Date
}
init() {
setupPythonEnvironment()
}
private func setupPythonEnvironment() {
// Set up Python environment
let sys = Python.import("sys")
let os = Python.import("os")
// Add the current directory to Python path
if let currentPath = FileManager.default.currentDirectoryPath as? String {
sys.path.append(currentPath)
}
// Import the Python module
do {
let agent = Python.import("agent")
pythonAssistant = agent.MusicAssistant()
} catch {
print("Error importing Python module: \(error)")
}
}
@MainActor
func startNewChat() async {
guard let assistant = pythonAssistant else { return }
do {
let greeting = try await assistant.start_new_chat().string
messages.append(Message(text: greeting, isUser: false, timestamp: Date()))
} catch {
print("Error starting new chat: \(error)")
messages.append(Message(text: "Error starting new chat. Please try again.", isUser: false, timestamp: Date()))
}
}
@MainActor
func sendMessage(_ text: String) async {
guard let assistant = pythonAssistant else { return }
// Add user message to the chat
messages.append(Message(text: text, isUser: true, timestamp: Date()))
isProcessing = true
do {
let response = try await assistant.process_message(text).string
messages.append(Message(text: response, isUser: false, timestamp: Date()))
} catch {
print("Error processing message: \(error)")
messages.append(Message(text: "Error processing message. Please try again.", isUser: false, timestamp: Date()))
}
isProcessing = false
}
func clearChat() {
guard let assistant = pythonAssistant else { return }
do {
try assistant.clear_conversation()
messages.removeAll()
} catch {
print("Error clearing chat: \(error)")
}
}
func getConversationHistory() -> [[String: Any]] {
guard let assistant = pythonAssistant else { return [] }
do {
return try assistant.get_conversation_history().array
} catch {
print("Error getting conversation history: \(error)")
return []
}
}
}