@@ -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