@@ -339,6 +339,7 @@ def __init__(
339
339
self .reasoning_effort = reasoning_effort
340
340
self .additional_params = kwargs
341
341
self .is_anthropic = self ._is_anthropic_model (model )
342
+ self .is_nova = self ._is_nova_model (model )
342
343
self .stream = stream
343
344
344
345
litellm .drop_params = True
@@ -354,6 +355,17 @@ def __init__(
354
355
self .set_callbacks (callbacks )
355
356
self .set_env_callbacks ()
356
357
358
+ def _is_nova_model (self , model : str ) -> bool :
359
+ """Determine if the model is an Amazon Nova model.
360
+
361
+ Args:
362
+ model: The model identifier string.
363
+
364
+ Returns:
365
+ bool: True if the model is a Nova model, False otherwise.
366
+ """
367
+ return "amazon.nova-" in model .lower ()
368
+
357
369
def _is_anthropic_model (self , model : str ) -> bool :
358
370
"""Determine if the model is from Anthropic provider.
359
371
@@ -366,6 +378,20 @@ def _is_anthropic_model(self, model: str) -> bool:
366
378
ANTHROPIC_PREFIXES = ("anthropic/" , "claude-" , "claude/" )
367
379
return any (prefix in model .lower () for prefix in ANTHROPIC_PREFIXES )
368
380
381
+ def _ensure_starts_with_user_message (self , messages : List [Dict [str , str ]]) -> List [Dict [str , str ]]:
382
+ """Ensure messages list starts with a user message.
383
+
384
+ Args:
385
+ messages: List of message dictionaries
386
+
387
+ Returns:
388
+ List of messages with a user message at the start if needed
389
+ """
390
+ # Check if first message is system (or empty list)
391
+ if not messages or messages [0 ]["role" ] == "system" :
392
+ return [{"role" : "user" , "content" : "." }, * messages ]
393
+ return messages
394
+
369
395
def _prepare_completion_params (
370
396
self ,
371
397
messages : Union [str , List [Dict [str , str ]]],
@@ -1157,15 +1183,9 @@ def _format_messages_for_provider(
1157
1183
):
1158
1184
return messages + [{"role" : "user" , "content" : "" }]
1159
1185
1160
- # Handle Anthropic models
1161
- if not self .is_anthropic :
1162
- return messages
1163
-
1164
- # Anthropic requires messages to start with 'user' role
1165
- if not messages or messages [0 ]["role" ] == "system" :
1166
- # If first message is system or empty, add a placeholder user message
1167
- return [{"role" : "user" , "content" : "." }, * messages ]
1168
-
1186
+ # Both Nova and Anthropic require the conversation to start with a user message
1187
+ if self .is_nova or self .is_anthropic :
1188
+ return self ._ensure_starts_with_user_message (messages )
1169
1189
return messages
1170
1190
1171
1191
def _get_custom_llm_provider (self ) -> Optional [str ]:
0 commit comments