Add resilient AI service handling
This commit is contained in:
@@ -125,6 +125,8 @@ public final class OpenAIClient: AIService, Sendable {
|
||||
}
|
||||
|
||||
private func perform(_ clientRequest: OpenAIClientRequest) async throws -> Data {
|
||||
try Task.checkCancellation()
|
||||
|
||||
guard !configuration.apiKey.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else {
|
||||
throw OpenAIClientError.missingAPIKey
|
||||
}
|
||||
@@ -149,15 +151,30 @@ public final class OpenAIClient: AIService, Sendable {
|
||||
|
||||
let (data, response) = try await transport.data(for: request)
|
||||
guard (200..<300).contains(response.statusCode) else {
|
||||
if response.statusCode == 429 {
|
||||
throw OpenAIClientError.rateLimited(
|
||||
retryAfter: Self.retryAfterInterval(from: response)
|
||||
)
|
||||
}
|
||||
if (500..<600).contains(response.statusCode) {
|
||||
throw OpenAIClientError.serverError(response.statusCode)
|
||||
}
|
||||
throw OpenAIClientError.unacceptableStatusCode(response.statusCode)
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
private static func retryAfterInterval(from response: HTTPURLResponse) -> TimeInterval? {
|
||||
guard let value = response.value(forHTTPHeaderField: "Retry-After") else { return nil }
|
||||
return TimeInterval(value.trimmingCharacters(in: .whitespacesAndNewlines))
|
||||
}
|
||||
}
|
||||
|
||||
public enum OpenAIClientError: Error, Equatable, Sendable {
|
||||
case missingAPIKey
|
||||
case invalidResponse
|
||||
case rateLimited(retryAfter: TimeInterval?)
|
||||
case serverError(Int)
|
||||
case unacceptableStatusCode(Int)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user