如何在 Swift - iOS 中使用 Openai 完成 API 读取流?

问题描述 投票:0回答:0

我正在尝试读取流中的输出(当它出现时)而不是等待整个响应。

我使用了以下代码。

func caller() {
        let completionAPIURL = URL(string: "https://api.openai.com/v1/completions")!

        var request = URLRequest(url: completionAPIURL)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("<Token>", forHTTPHeaderField: "Authorization")
        
        let requestBody = """
        {
            "model": "<model>",
            "prompt": "<prompt>",
            "max_tokens": 200,
            "stream": true
        }
        """
        request.httpBody = requestBody.data(using: .utf8)

        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                print("Error: \(error)")
                return
            }

            print((response as? HTTPURLResponse)?.statusCode)
            
            guard let httpResponse = response as? HTTPURLResponse,
                  (200...299).contains(httpResponse.statusCode) else {
                print("Error: invalid HTTP response code")
                return
            }

            guard let data = data else {
                print("Error: missing response data")
                return
            }

            let eventStreamString = String(data: data, encoding: .utf8)!
            let eventStreamLines = eventStreamString.components(separatedBy: "\n")

            for event in eventStreamLines {
                let eventFields = event.components(separatedBy: ":")
                if eventFields.count < 2 {
                    continue
                }

                if fieldName == "data" {
                    if fieldValue == "[DONE]" {
                        // Stream terminated
                        break
                    } else {
                        // Process event data
                        print(event)
                    }
                }
            }
        }
        task.resume()
    }
    

问题是,它仍然等到整个响应到位,然后打印数据。我想要实现的是获取数据以及如何生成流,而不是在整个响应到位之后。

我是比较新手,希望得到详细的帮助。

swift server-sent-events
© www.soinside.com 2019 - 2024. All rights reserved.