Add resilient AI service handling

This commit is contained in:
diyaa
2026-09-13 21:28:13 +02:00
parent ae88c6e533
commit eb61bd076c
6 changed files with 324 additions and 5 deletions
@@ -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)
}