Skip to content

Commit 8d8aeee

Browse files
committed
Handle claude error events
1 parent 4cdbf9a commit 8d8aeee

1 file changed

Lines changed: 21 additions & 4 deletions

File tree

Tool/Sources/OpenAIService/APIs/ClaudeChatCompletionsService.swift

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public actor ClaudeChatCompletionsService: ChatCompletionsStreamAPI, ChatComplet
3535
var type: String
3636

3737
var errorDescription: String? {
38-
error?.message ?? "Unknown Error"
38+
error?.message ?? error?.type ?? type
3939
}
4040
}
4141

@@ -265,7 +265,13 @@ public actor ClaudeChatCompletionsService: ChatCompletionsStreamAPI, ChatComplet
265265
StreamDataChunk.self,
266266
from: line.data(using: .utf8) ?? Data()
267267
)
268+
if let error = chunk.error {
269+
throw error
270+
}
268271
return .init(chunk: chunk, done: chunk.type == "message_stop")
272+
} catch let error as APIError {
273+
Logger.service.error(error.errorDescription ?? "Unknown Error")
274+
throw error
269275
} catch {
270276
Logger.service.error("Error decoding stream data: \(error)")
271277
return .init(chunk: nil, done: false)
@@ -413,11 +419,22 @@ extension ClaudeChatCompletionsService.RequestBody {
413419
return .joinMessage
414420
}
415421

422+
/// Claude only supports caching at most 4 messages.
423+
var cacheControlMax = 4
424+
425+
func consumeCacheControl() -> Bool {
426+
if cacheControlMax > 0 {
427+
cacheControlMax -= 1
428+
return true
429+
}
430+
return false
431+
}
432+
416433
for message in body.messages {
417434
switch message.role {
418435
case .system:
419436
systemPrompts.append(.init(text: message.content, cache_control: {
420-
if message.cacheIfPossible, supportsPromptCache {
437+
if message.cacheIfPossible, supportsPromptCache, consumeCacheControl() {
421438
return .init()
422439
} else {
423440
return nil
@@ -433,7 +450,7 @@ extension ClaudeChatCompletionsService.RequestBody {
433450
case .padMessageAndAppendToList, .joinMessage:
434451
nonSystemMessages[nonSystemMessages.endIndex - 1].content.append(
435452
.init(type: .text, text: message.content, cache_control: {
436-
if message.cacheIfPossible, supportsPromptCache {
453+
if message.cacheIfPossible, supportsPromptCache, consumeCacheControl() {
437454
return .init()
438455
} else {
439456
return nil
@@ -451,7 +468,7 @@ extension ClaudeChatCompletionsService.RequestBody {
451468
case .padMessageAndAppendToList, .joinMessage:
452469
nonSystemMessages[nonSystemMessages.endIndex - 1].content.append(
453470
.init(type: .text, text: message.content, cache_control: {
454-
if message.cacheIfPossible, supportsPromptCache {
471+
if message.cacheIfPossible, supportsPromptCache, consumeCacheControl() {
455472
return .init()
456473
} else {
457474
return nil

0 commit comments

Comments
 (0)