diff --git a/Sources/OpenAISwift/OpenAISwift.swift b/Sources/OpenAISwift/OpenAISwift.swift index dd4e27c..e07083a 100644 --- a/Sources/OpenAISwift/OpenAISwift.swift +++ b/Sources/OpenAISwift/OpenAISwift.swift @@ -7,6 +7,7 @@ import FoundationXML public enum OpenAIError: Error { case genericError(error: Error) case decodingError(error: Error) + case badResponse(code: Int, response: String?) } public class OpenAISwift { @@ -170,8 +171,20 @@ extension OpenAISwift { private func makeRequest(request: URLRequest, completionHandler: @escaping (Result) -> Void) { let session = config.session let task = session.dataTask(with: request) { (data, response, error) in + if let error = error { completionHandler(.failure(error)) + } else if let response = response as? HTTPURLResponse, + !(200...299).contains(response.statusCode) { + //Responses outside the 2xx range don't necessarily throw errors, but we should treat them as errors + //E.g. a rejected api key will generate a 401 and a helpful message, but no error + let code = response.statusCode + var responseString:String? + if let data { + responseString = String(data:data,encoding: .utf8) + } + + completionHandler(.failure(OpenAIError.badResponse(code: code, response: responseString))) } else if let data = data { completionHandler(.success(data)) }