@@ -347,7 +347,7 @@ def __init__(self, config: Config, execution_context: ExecutionContext) -> None:
347347 @traced (name = "llm_chat_completions" , run_type = "uipath" )
348348 async def chat_completions (
349349 self ,
350- messages : List [Dict [str , str ]],
350+ messages : Union [ List [Dict [str , str ]], List [ tuple ]],
351351 model : str = ChatModels .gpt_4o_mini_2024_07_18 ,
352352 max_tokens : int = 4096 ,
353353 temperature : float = 0 ,
@@ -475,13 +475,31 @@ class Country(BaseModel):
475475 This service uses UiPath's normalized API format which provides consistent
476476 behavior across different underlying model providers and enhanced enterprise features.
477477 """
478+ role_mapping = {"human" : "user" , "ai" : "assistant" }
479+ converted_messages = []
480+
481+ for message in messages :
482+ if isinstance (message , tuple ) and len (message ) == 2 :
483+ role , content = message
484+ mapped_role = role_mapping .get (role .lower (), role )
485+ converted_messages .append ({"role" : mapped_role , "content" : content })
486+ elif isinstance (message , dict ):
487+ role = message .get ("role" , "" )
488+ mapped_role = role_mapping .get (role .lower (), role )
489+ converted_messages .append ({** message , "role" : mapped_role })
490+ else :
491+ raise ValueError (
492+ f"Invalid message format: { message } . Expected tuple (role, content) or dict with 'role' and 'content' keys."
493+ )
494+
478495 endpoint = EndpointManager .get_normalized_endpoint ().format (
479496 model = model , api_version = api_version
480497 )
481498 endpoint = Endpoint ("/" + endpoint )
482499
483500 request_body = {
484- "messages" : messages ,
501+ # "messages": messages,
502+ "messages" : converted_messages ,
485503 "max_tokens" : max_tokens ,
486504 "temperature" : temperature ,
487505 "n" : n ,
0 commit comments