Skip to content

Commit 2e141b7

Browse files
committed
Join same-role messages for claude models
1 parent dff5d89 commit 2e141b7

File tree

1 file changed

+40
-18
lines changed

1 file changed

+40
-18
lines changed

Tool/Sources/OpenAIService/APIs/ClaudeChatCompletionsService.swift

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public actor ClaudeChatCompletionsService: ChatCompletionsStreamAPI, ChatComplet
1111
case claude3Opus = "claude-3-opus-20240229"
1212
case claude3Sonnet = "claude-3-sonnet-20240229"
1313
case claude3Haiku = "claude-3-haiku-20240307"
14-
14+
1515
public var contextWindow: Int {
1616
switch self {
1717
case .claude3Opus: return 200_000
@@ -146,6 +146,25 @@ public actor ClaudeChatCompletionsService: ChatCompletionsStreamAPI, ChatComplet
146146
var role: MessageRole
147147
/// The content of the message.
148148
var content: [MessageContent]
149+
150+
mutating func appendText(_ text: String) {
151+
var otherContents = [MessageContent]()
152+
var existedText = ""
153+
for existed in content {
154+
switch existed.type {
155+
case .text:
156+
if existedText.isEmpty {
157+
existedText = existed.text ?? ""
158+
} else if let text = existed.text {
159+
existedText += "\n\n" + text
160+
}
161+
default:
162+
otherContents.append(existed)
163+
}
164+
}
165+
166+
content = otherContents + [.init(type: .text, text: existedText + "\n\n\(text)")]
167+
}
149168
}
150169

151170
var model: String
@@ -313,24 +332,27 @@ extension ClaudeChatCompletionsService.RequestBody {
313332
var nonSystemMessages = [Message]()
314333

315334
for message in body.messages {
316-
if message.role == .system {
335+
switch message.role {
336+
case .system:
317337
systemPrompts.append(message.content)
318-
} else {
319-
nonSystemMessages.append(.init(
320-
role: {
321-
switch message.role {
322-
case .user:
323-
return .user
324-
case .assistant:
325-
return .assistant
326-
case .system:
327-
return .user
328-
case .tool:
329-
return .assistant
330-
}
331-
}(),
332-
content: [.init(type: .text, text: message.content)]
333-
))
338+
case .tool, .assistant:
339+
if let last = nonSystemMessages.last, last.role == .assistant {
340+
nonSystemMessages[nonSystemMessages.endIndex - 1].appendText(message.content)
341+
} else {
342+
nonSystemMessages.append(.init(
343+
role: .assistant,
344+
content: [.init(type: .text, text: message.content)]
345+
))
346+
}
347+
case .user:
348+
if let last = nonSystemMessages.last, last.role == .user {
349+
nonSystemMessages[nonSystemMessages.endIndex - 1].appendText(message.content)
350+
} else {
351+
nonSystemMessages.append(.init(
352+
role: .user,
353+
content: [.init(type: .text, text: message.content)]
354+
))
355+
}
334356
}
335357
}
336358

0 commit comments

Comments
 (0)