@@ -307,6 +307,8 @@ actor OpenAIChatCompletionsService: ChatCompletionsStreamAPI, ChatCompletionsAPI
307307 enforceMessageOrder: model. info. openAICompatibleInfo. enforceMessageOrder,
308308 supportsMultipartMessageContent: model. info. openAICompatibleInfo
309309 . supportsMultipartMessageContent,
310+ requiresBeginWithUserMessage: model. info. openAICompatibleInfo
311+ . requiresBeginWithUserMessage,
310312 canUseTool: model. info. supportsFunctionCalling,
311313 supportsImage: model. info. supportsImage,
312314 supportsAudio: model. info. supportsAudio
@@ -709,6 +711,7 @@ extension OpenAIChatCompletionsService.RequestBody {
709711 endpoint: URL ,
710712 enforceMessageOrder: Bool ,
711713 supportsMultipartMessageContent: Bool ,
714+ requiresBeginWithUserMessage: Bool ,
712715 canUseTool: Bool ,
713716 supportsImage: Bool ,
714717 supportsAudio: Bool
@@ -732,10 +735,21 @@ extension OpenAIChatCompletionsService.RequestBody {
732735
733736 model = body. model
734737
738+ var body = body
739+
740+ if requiresBeginWithUserMessage {
741+ let firstUserIndex = body. messages. firstIndex ( where: { $0. role == . user } ) ?? 0
742+ let endIndex = firstUserIndex
743+ for i in stride ( from: endIndex - 1 , to: 0 , by: - 1 )
744+ where i >= 0 && body. messages. endIndex > i
745+ {
746+ body. messages. remove ( at: i)
747+ }
748+ }
749+
735750 // Special case for Claude through OpenRouter
736751
737752 if endpoint. absoluteString. contains ( " openrouter.ai " ) , model. hasPrefix ( " anthropic/ " ) {
738- var body = body
739753 body. model = model. replacingOccurrences ( of: " anthropic/ " , with: " " )
740754 let claudeRequestBody = ClaudeChatCompletionsService . RequestBody ( body)
741755 messages = claudeRequestBody. system. map {
0 commit comments