MacPaw / OpenAI

Swift community driven package for OpenAI public API
MIT License
2.09k stars 351 forks source link

Cancel the async openAI.chatsStream(query: query) #198

Open thekoc opened 6 months ago

thekoc commented 6 months ago

Is your feature request related to a problem? Please describe.

Simple use case:

let task = Task {
    for try await result in openAI.chatsStream(query: query) {
        print(result)
    }
}

During the streaming, if I cancel the task manually (e.g. The stop generation button in the official ChatGPT app), I expect the stream to be stopped.

task.cancel() // Expecting the network connection to be cancelled too.

Unexpectedly, by monitoring the network activity, the generation does not stop even if the task has been cancelled.

This is due to (by my poor understanding) the underlying StreamingSession does not stop alongside with the task accordingly.

// func performStreamingRequest<ResultType: Codable>(request: any URLRequestBuildable, onResult: @escaping (Result<ResultType, Error>) -> Void, completion: ((Error?) -> Void)?)
let session = StreamingSession<ResultType>(urlRequest: request)
// ...
session.perform() // Once initialized never stopped

Describe the solution you'd like Use the onTermination method to handle cancellation from the outside task.

This pull request might also help

Describe alternatives you've considered Empty

Additional context Empty

longseespace commented 6 months ago

This might be useful to you @thekoc

https://github.com/longseespace/OpenAI/commit/a290a1a119fc465cdb1740472242fbfca57069b9

tisfeng commented 6 months ago

I also need this feature, and would like to be able to proactively cancel stream requests.

Why hasn't the developer handled this issue?

tisfeng commented 5 months ago

I needed this feature, but nobody responded, so I implemented it myself, thanks https://github.com/longseespace/OpenAI/commit/a290a1a119fc465cdb1740472242fbfca57069b9 .

In case others need it too, I submitted a PR https://github.com/MacPaw/OpenAI/pull/214 .