Skip to content

Commit 91595a1

Browse files
committed
feat: Add publisher for inference state updates
1 parent 0d08ae6 commit 91595a1

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

macLlama/Services/ChatService/ChatService.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import Combine
1111
actor OllamaChatService {
1212
private(set) var messages: [APIChatMessage] = []
1313
private let currentResponseSubject: PassthroughSubject<String, Never> = .init()
14+
private let answeringSubject: PassthroughSubject<Bool, Never> = .init()
1415

1516
func sendMessage(model: String, userInput: String, images: [NSImage]?, showThink: Bool,
1617
predict: Double? = nil, temperature: Double? = nil) async throws -> AsyncStream<String> {
@@ -55,6 +56,9 @@ actor OllamaChatService {
5556
let stream = AsyncStream { continuation in
5657
Task {
5758
do {
59+
//start thinking
60+
self.sendToAnsweringSubject(true)
61+
5862
for try await line in bytesStream.lines {
5963
guard let data = line.data(using: .utf8),
6064
let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
@@ -76,6 +80,9 @@ actor OllamaChatService {
7680
let finalMessage = APIChatMessage(role: "assistant", content: assistantContent, images: nil, options: nil, assistantThink: assistantThink)
7781
messages.append(finalMessage)
7882

83+
//end thinking
84+
self.sendToAnsweringSubject(false)
85+
7986
#if DEBUG
8087
debugPrint(assistantThink)
8188
debugPrint("Request options: \(options)")
@@ -95,10 +102,18 @@ actor OllamaChatService {
95102
currentResponseSubject.send(value)
96103
}
97104

105+
private func sendToAnsweringSubject(_ value: Bool) {
106+
answeringSubject.send(value)
107+
}
108+
98109
public func currentResponsePublisher() -> AnyPublisher<String, Never> {
99110
return currentResponseSubject.eraseToAnyPublisher()
100111
}
101112

113+
public func answeringPublisher() -> AnyPublisher<Bool, Never> {
114+
return answeringSubject.eraseToAnyPublisher()
115+
}
116+
102117
///Convert NSImage array to Base64 String array
103118
private func nsImageArrayToBase64Array(_ images: [NSImage]?) async -> [String]? {
104119
var base64Strings: [String] = []

macLlama/Views/ConversationView/ChatInterfaceView/ChatInterfaceView.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,11 @@ struct ChatInterfaceView: View {
230230
await chatService.currentResponsePublisher().receive(on: RunLoop.main).sink { message in
231231
self.currentGeneratingResponse = message
232232
}.store(in: &cancellables)
233+
234+
//subscribe currently generating response
235+
await chatService.answeringPublisher().receive(on: RunLoop.main).sink { thinking in
236+
self.isThinking = thinking
237+
}.store(in: &cancellables)
233238
}
234239
}
235240
.frame(minWidth: Units.chatWindowWidth)
@@ -324,7 +329,7 @@ extension ChatInterfaceView {
324329

325330
//Reset state
326331
await MainActor.run {
327-
self.isThinking = false
332+
// self.isThinking = false
328333
self.isAutoScrolling = false
329334
self.autoScrollTask = nil
330335
}

0 commit comments

Comments
 (0)