o
    ưiC                     @   s   d Z ddlZddlZddlmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ dd	lm Z m!Z!m"Z" dd
l#m$Z$ G dd deZ%dS )z
This file contains the transformation logic for Bedrock Nova Sonic realtime API.

Transforms between OpenAI Realtime API format and Bedrock Nova Sonic format.
    N)AnyListOptionalUnion)verbose_logger)uuid)Logging)BaseRealtimeConfig)OpenAIRealtimeContentPartDoneOpenAIRealtimeDoneEventOpenAIRealtimeEventsOpenAIRealtimeOutputItemDoneOpenAIRealtimeResponseAudioDone&OpenAIRealtimeResponseContentPartAddedOpenAIRealtimeResponseDelta OpenAIRealtimeResponseDoneObjectOpenAIRealtimeResponseTextDone&OpenAIRealtimeStreamResponseBaseObject+OpenAIRealtimeStreamResponseOutputItemAddedOpenAIRealtimeStreamSession!OpenAIRealtimeStreamSessionEvents)ALL_DELTA_TYPESRealtimeResponseTransformInputRealtimeResponseTypedDict)get_empty_usagec                   @   s,  e Zd ZdZdd Z	dEdededee defd	d
Z	dEdee dedee defddZ	de
fddZdEdedeee  defddZdee dee fddZdFdede
defddZdedee fddZdedee fddZdedee fdd Zdedee fd!d"Zdedee fd#d$Zdedee fd%d&Z	dEd'eded(ee dee fd)d*Zd+eded,edefd-d.Zd+ed/ee d0ee d1ee deee ee ee ee ee f f
d2d3Zd+ed0ee d/ee d4eee  deee eee  f f
d5d6Z d+ed0ee d/ee dee fd7d8Z!d+ed0ee d/ee d9ee d4eee  deee eee  f fd:d;Z"d+ed/ee d1ee deee ee ee ee f fd<d=Z#d+ed0ee d/ee deee eef fd>d?Z$dedee fd@dAZ%d'e&ee'f ded,edBe(de)f
dCdDZ*dS )GBedrockRealtimeConfigz>Configuration for Bedrock Nova Sonic realtime transformations.c                 C   s   t t | _t t | _t t | _d| _d| _d| _d| _	d| _
d| _d| _d| _d	| _d
| _d| _d| _d| _d| _d	| _d
| _d| _d S )Ni   g?gffffff?]        Zmatthewbase64ZSPEECHz
audio/lpcm>  
text/plain)struuid_libuuid4prompt_nameZcontent_nameaudio_content_name
max_tokenstop_ptemperatureoutput_sample_rate_hertzoutput_sample_size_bitsoutput_channel_countvoice_idoutput_encodingoutput_audio_typeoutput_media_typeinput_sample_rate_hertzinput_sample_size_bitsinput_channel_countinput_encodinginput_audio_typeinput_media_typetext_media_typeself r:   c/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/bedrock/realtime/transformation.py__init__)   s(   
zBedrockRealtimeConfig.__init__Nheadersmodelapi_keyreturnc                 C   s   |S )z@Validate environment - no special validation needed for Bedrock.r:   )r9   r=   r>   r?   r:   r:   r;   validate_environmentI   s   z*BedrockRealtimeConfig.validate_environmentapi_basec                 C   s   |pdS )z6Get complete URL - handled by aws_sdk_bedrock_runtime. r:   )r9   rB   r>   r?   r:   r:   r;   get_complete_urlO   s   z&BedrockRealtimeConfig.get_complete_urlc                 C   s   dS )z'Bedrock requires session configuration.Tr:   r8   r:   r:   r;   requires_session_configurationU   s   z4BedrockRealtimeConfig.requires_session_configurationtoolsc              
   C   s   ddd| j | j| jdiii}| jd| ji| j| j| j| j| j	| j
| jdd}|r9ddi|d	< d
| |i|d< dd|ii}t||dS )z
        Create initial session configuration for Bedrock Nova Sonic.

        Args:
            model: Model ID
            tools: Optional list of tool definitions

        Returns JSON string with session start and prompt start events.
        eventsessionStartinferenceConfigurationZ	maxTokensZtopPr)   	mediaTyperK   sampleRateHertzsampleSizeBitschannelCountZvoiceIdencoding	audioType
promptNameZtextOutputConfigurationZaudioOutputConfigurationapplication/jsontoolUseOutputConfigurationrF   toolConfigurationpromptStart)session_startprompt_start)r'   r(   r)   r%   r7   r0   r*   r+   r,   r-   r.   r/   "_transform_tools_to_bedrock_formatjsondumps)r9   r>   rF   rX   prompt_start_configrY   r:   r:   r;   session_configuration_requestY   s<   
z3BedrockRealtimeConfig.session_configuration_requestc                 C   sh   g }|D ]-}| ddkr1| di }d| dd| dddt| di id	i}|| q|S )
z
        Transform OpenAI tool format to Bedrock tool format.

        Args:
            tools: List of OpenAI format tools

        Returns:
            List of Bedrock format tools
        typefunctionZtoolSpecnamerC   descriptionr[   
parameters)ra   rb   ZinputSchema)getr[   r\   append)r9   rF   Zbedrock_toolsZtoolr`   Zbedrock_toolr:   r:   r;   rZ      s   



	z8BedrockRealtimeConfig._transform_tools_to_bedrock_formatTaudio_format	is_outputc                 C   s,   |dkr
|rdS dS |dv rdS |rdS dS )a"  
        Map OpenAI audio format to sample rate.
        
        Args:
            audio_format: OpenAI audio format (pcm16, g711_ulaw, g711_alaw)
            is_output: Whether this is for output (True) or input (False)
            
        Returns:
            Sample rate in Hz
        Zpcm16r   r    )Z	g711_ulawZ	g711_alawi@  r:   )r9   rf   rg   r:   r:   r;    _map_audio_format_to_sample_rate   s
   z6BedrockRealtimeConfig._map_audio_format_to_sample_ratejson_messagec              
   C   s  t d g }|di }d|v r|d | _d|v r|d | _d|v r(|d | _d|v r8|d }| j|dd| _d	|v rH|d	 }| j|d
d| _d|v rQ|d | _d|v rZ|d | _ddd| j| j	| jdiii}|
t| | jd| ji| j| j| j| j| j| j| jdd}|d}|rddi|d< d| |i|d< dd|ii}	|
t|	 |d}
|
rtt }dd| j|dd
dd| jidii}|
t| dd| j||
dii}|
t| dd | j|d!ii}|
t| |S )"z
        Transform session.update event to Bedrock session configuration.

        Args:
            json_message: OpenAI session.update message

        Returns:
            List of Bedrock format messages (JSON strings)
        zHandling session.updatesessionZmax_response_output_tokensr)   ZvoiceZoutput_audio_formatT)rg   Zinput_audio_formatFr*   r1   rG   rH   rI   rJ   rK   rL   rR   rF   rT   rU   rV   rW   instructionscontentStartTEXTZSYSTEMrS   contentNamer_   interactiveroletextInputConfiguration	textInputrS   ro   content
contentEndrS   ro   )r   debugrd   r'   r)   r-   rh   r*   r1   r(   re   r[   r\   r%   r7   r0   r+   r,   r.   r/   rZ   r"   r#   r$   )r9   ri   messagesZsession_configZoutput_formatZinput_formatrX   r]   rF   rY   rk   text_content_nametext_content_start
text_inputtext_content_endr:   r:   r;   transform_session_update_event   s   









	z4BedrockRealtimeConfig.transform_session_update_eventc                 C   s   t d g }t| ds3dd| j| jddd| j| j| j| j| j	| j
dd	ii}|t| d| _|d
d}dd| j| j|dii}|t| |S )z
        Transform input_audio_buffer.append event to Bedrock audio input.

        Args:
            json_message: OpenAI input_audio_buffer.append message

        Returns:
            List of Bedrock format messages (JSON strings)
        z"Handling input_audio_buffer.append_audio_content_startedrG   rl   ZAUDIOTUSER)rK   rM   rN   rO   rQ   rP   )rS   ro   r_   rp   rq   ZaudioInputConfigurationaudiorC   Z
audioInputrt   )r   rx   hasattrr%   r&   r6   r1   r2   r3   r5   r4   re   r[   r\   r   rd   )r9   ri   ry   Zaudio_content_startZ
audio_dataZaudio_eventr:   r:   r;   )transform_input_audio_buffer_append_event<  sB   


	z?BedrockRealtimeConfig.transform_input_audio_buffer_append_eventc                 C   sL   t d g }t| dr$dd| j| jdii}|t| t| d |S )z
        Transform input_audio_buffer.commit event to Bedrock audio content end.

        Args:
            json_message: OpenAI input_audio_buffer.commit message

        Returns:
            List of Bedrock format messages (JSON strings)
        z"Handling input_audio_buffer.commitr   rG   rv   rw   )	r   rx   r   r%   r&   re   r[   r\   delattr)r9   ri   ry   Zaudio_content_endr:   r:   r;   )transform_input_audio_buffer_commit_eventp  s   



z?BedrockRealtimeConfig.transform_input_audio_buffer_commit_eventc              
   C   s   t d g }|di }|d}|dkr| |S |dkry|dg }|D ]Q}|ddkrxtt }dd	| j|d
ddd| jidii}|	t
| dd| j||dddii}	|	t
|	 dd| j|dii}
|	t
|
 q'|S )z
        Transform conversation.item.create event to Bedrock text input or tool result.

        Args:
            json_message: OpenAI conversation.item.create message

        Returns:
            List of Bedrock format messages (JSON strings)
        z!Handling conversation.item.createitemr_   function_call_outputmessageru   Z
input_textrG   rl   rm   Tr   rK   rn   rs   textrC   rt   rv   rw   )r   rx   rd   4transform_conversation_item_create_tool_result_eventr"   r#   r$   r%   r7   re   r[   r\   )r9   ri   ry   r   Z	item_typeru   Zcontent_partrz   r{   r|   r}   r:   r:   r;   (transform_conversation_item_create_event  sV   




	z>BedrockRealtimeConfig.transform_conversation_item_create_eventc                 C      t d g S )z
        Transform response.create event to Bedrock format.

        Args:
            json_message: OpenAI response.create message

        Returns:
            List of Bedrock format messages (JSON strings)
        zHandling response.creater   rx   r9   ri   r:   r:   r;   transform_response_create_event     

z5BedrockRealtimeConfig.transform_response_create_eventc                 C   r   )z
        Transform response.cancel event to Bedrock format.

        Args:
            json_message: OpenAI response.cancel message

        Returns:
            List of Bedrock format messages (JSON strings)
        zHandling response.cancelr   r   r:   r:   r;   transform_response_cancel_event  r   z5BedrockRealtimeConfig.transform_response_cancel_eventr   r^   c              	   C   s   zt |}W n t jy   td|dd   g  Y S w |d}|dkr.| |S |dkr7| |S |dkr@| |S |dkrI| 	|S |d	krR| 
|S |d
kr[| |S td|  g S )aE  
        Transform OpenAI realtime request to Bedrock Nova Sonic format.

        Args:
            message: OpenAI format message (JSON string)
            model: Model ID
            session_configuration_request: Previous session config

        Returns:
            List of Bedrock format messages (JSON strings)
        Invalid JSON message: N   r_   zsession.updatezinput_audio_buffer.appendzinput_audio_buffer.commitzconversation.item.createzresponse.createzresponse.cancelzUnknown message type: )r[   loadsJSONDecodeErrorr   warningrd   r~   r   r   r   r   r   )r9   r   r>   r^   ri   Zmessage_typer:   r:   r;   transform_realtime_request  s*   






z0BedrockRealtimeConfig.transform_realtime_requestrG   logging_objc                 C   sL   t d t|jddgd}|durt|tr||d< td|tt dS )	a  
        Transform Bedrock sessionStart event to OpenAI session.created.

        Args:
            event: Bedrock sessionStart event
            model: Model ID
            logging_obj: Logging object

        Returns:
            OpenAI session.created event
        zHandling sessionStartr   r   )idZ
modalitiesNr>   zsession.created)r_   rj   event_id)	r   rx   r   Zlitellm_trace_id
isinstancer"   r   r   r$   )r9   rG   r>   r   rj   r:   r:   r;   transform_session_start_event  s   

z3BedrockRealtimeConfig.transform_session_start_eventcurrent_response_idcurrent_output_item_idcurrent_conversation_idc                 C   s.  |d }| d}|dkrg |||dfS td |s"dt  }|s+dt  }|s4dt  }| d	d
}|d
kr@dnd}g }	tddt  d|dg |dd}
|	|
 td|d|ddddg dd}|	| tddddt  ||dkrdddnddd|d}|	| |	||||fS )a  
        Transform Bedrock contentStart event to OpenAI response events.

        Args:
            event: Bedrock contentStart event
            current_response_id: Current response ID
            current_output_item_id: Current output item ID
            current_conversation_id: Current conversation ID

        Returns:
            Tuple of (events, response_id, output_item_id, conversation_id, delta_type)
        rl   rq   Z	ASSISTANTNzHandling ASSISTANT contentStartZresp_Zitem_Zconv_r_   rm   r   r   zresponse.createdevent_realtime.responseZin_progress)objectr   statusoutputconversation_idr_   r   responsezresponse.output_item.addedr   realtime.itemr   	assistantr   r   r_   r   rq   ru   )r_   response_idoutput_indexr   zresponse.content_part.addedrC   r_   r   r_   Z
transcript)r_   content_indexr   r   item_idpartr   )	rd   r   rx   r   r$   r   re   r   r   )r9   rG   r   r   r   Zcontent_startrq   content_typecurrent_delta_typereturned_messagesZresponse_createdZoutput_item_addedZcontent_part_addedr:   r:   r;   transform_content_start_event6  sp   





z3BedrockRealtimeConfig.transform_content_start_eventcurrent_delta_chunksc              	   C   sj   t d |d dd}|r|sg |fS tdddt  |d||d}|d	u r+g }|| |g|fS )
a{  
        Transform Bedrock textOutput event to OpenAI response.text.delta.

        Args:
            event: Bedrock textOutput event
            current_output_item_id: Current output item ID
            current_response_id: Current response ID
            current_delta_chunks: Current delta chunks

        Returns:
            Tuple of (events, updated_delta_chunks)
        zHandling textOutput
textOutputru   rC   zresponse.text.deltar   r   r_   r   r   r   r   r   deltaN)r   rx   rd   r   r   r$   re   )r9   rG   r   r   r   Ztext_contentZ
text_deltar:   r:   r;   transform_text_output_event  s"   


z1BedrockRealtimeConfig.transform_text_output_eventc              	   C   sL   t d |d dd}|r|sg S tdddt  |d||d}|gS )	a5  
        Transform Bedrock audioOutput event to OpenAI response.audio.delta.

        Args:
            event: Bedrock audioOutput event
            current_output_item_id: Current output item ID
            current_response_id: Current response ID

        Returns:
            List of OpenAI events
        zHandling audioOutputaudioOutputru   rC   zresponse.audio.deltar   r   r   )r   rx   rd   r   r   r$   )r9   rG   r   r   Zaudio_contentZaudio_deltar:   r:   r;   transform_audio_output_event  s   

z2BedrockRealtimeConfig.transform_audio_output_eventr   c                 C   sH  |d }t d|  |r|sg |fS g }|dkrVd}|r(ddd |D }tddd	t  |d||d
}	||	 tddd	t  |dd|d|d}
||
 n0|dkrtddd	t  |d|d}|| tddd	t  |dddd|d}
||
 t	dd	t  d||ddddg dd}|| |dfS )a  
        Transform Bedrock contentEnd event to OpenAI response done events.

        Args:
            event: Bedrock contentEnd event
            current_output_item_id: Current output item ID
            current_response_id: Current response ID
            current_delta_type: Current delta type (text or audio)
            current_delta_chunks: Current delta chunks

        Returns:
            Tuple of (events, reset_delta_chunks)
        rv   zHandling contentEnd: r   rC   c                 S   s   g | ]}| d dqS )r   rC   )rd   ).0chunkr:   r:   r;   
<listcomp>  s    zEBedrockRealtimeConfig.transform_content_end_event.<locals>.<listcomp>zresponse.text.doner   r   )r_   r   r   r   r   r   r   zresponse.content_part.doner   )r_   r   r   r   r   r   r   r   zresponse.audio.done)r_   r   r   r   r   r   r   zresponse.output_item.doner   r   	completedr   r   )r_   r   r   r   r   N)
r   rx   joinr   r   r$   re   r
   r   r   )r9   rG   r   r   r   r   Zcontent_endr   Zaccumulated_textZ	text_doneZcontent_part_doneZ
audio_doneZoutput_item_doner:   r:   r;   transform_content_end_event  s   
		

	
z1BedrockRealtimeConfig.transform_content_end_eventc                 C   sh   t d |r	|sg dddfS t }tddt  td|dg ||j|j|j	ddd	}|gdddfS )
ac  
        Transform Bedrock promptEnd event to OpenAI response.done.

        Args:
            event: Bedrock promptEnd event
            current_response_id: Current response ID
            current_conversation_id: Current conversation ID

        Returns:
            Tuple of (events, reset_output_item_id, reset_response_id, reset_delta_type)
        zHandling promptEndNzresponse.doner   r   r   )prompt_tokenscompletion_tokenstotal_tokens)r   r   r   r   r   usager   )
r   rx   r   r   r   r$   r   r   r   r   )r9   rG   r   r   Z	usage_objZresponse_doner:   r:   r;   transform_prompt_end_eventP  s(   
z0BedrockRealtimeConfig.transform_prompt_end_eventc           
   
   C   s   t d |d }|r|sg ddfS i }d|v r9zt|d tr't|d n|d }W n tjy8   i }Y nw |dd}|dd}ddlm	} d	d
t
  ||d||t|d}	|t|	g||fS )aA  
        Transform Bedrock toolUse event to OpenAI format.

        Args:
            event: Bedrock toolUse event
            current_output_item_id: Current output item ID
            current_response_id: Current response ID

        Returns:
            Tuple of (events, tool_call_id, tool_name) for tracking
        zHandling toolUsetoolUserC   input	toolUseIdZtoolNamer   )castz%response.function_call_arguments.doner   )r_   r   r   r   r   call_idra   	arguments)r   rx   r   r"   r[   r   r   rd   typingr   r   r$   r\   r   )
r9   rG   r   r   Ztool_useZ
tool_inputtool_call_id	tool_namer   Zfunction_call_eventr:   r:   r;   transform_tool_use_event{  s0   

(z.BedrockRealtimeConfig.transform_tool_use_eventc           
      C   s   t d g }|di }|ddkrqtt }|dd}|dd}dd	| j|d
dd|dddiddii}|t	| dd| j|t
|trN|nt	|dii}|t	| dd| j|dii}	|t	|	 |S )a  
        Transform conversation.item.create with tool result to Bedrock format.

        Args:
            json_message: OpenAI conversation.item.create message with tool result

        Returns:
            List of Bedrock format messages (JSON strings)
        z1Handling conversation.item.create for tool resultr   r_   r   r   rC   r   rG   rl   FZTOOLrm   rK   r!   )r   r_   rr   )rS   ro   rp   r_   rq   ZtoolResultInputConfigurationZ
toolResultrt   rv   rw   )r   rx   rd   r"   r#   r$   r%   re   r[   r\   r   )
r9   ri   ry   r   Ztool_content_namer   r   Ztool_content_startZtool_resultZtool_content_endr:   r:   r;   r     sR   

	zJBedrockRealtimeConfig.transform_conversation_item_create_tool_result_event!realtime_response_transform_inputc                 C   sD  zt |}W nH t jyO   t|tr|dd jdddn|dd }td|  g |d|d|d	|d
|d|d|dd Y S w |d}|d}|d
}	|d	}
|d}|d}g }|di }d|v r| 	|||}|
| t ddi}nd|v r| ||||	\}}}}	}|| nod|v r| ||||
\}}
|| n[d|v r| |||}|| nJd|v r| |||||
\}}
|| n5d|v r| |||\}}}|| td| d| d nd|v r| |||	\}}}}|| ||||
|	|d||dS )ab  
        Transform Bedrock Nova Sonic response to OpenAI realtime format.

        Args:
            message: Bedrock format message (JSON string)
            model: Model ID
            logging_obj: Logging object
            realtime_response_transform_input: Current state

        Returns:
            Transformed response with updated state
        Nr   zutf-8replace)errorsr   r   r   r   r   current_item_chunksr   r^   )r   r   r   r   r   r   r   r^   rG   rH   Z
configuredTrl   r   r   rv   r   zTool use event: z (ID: )Z	promptEnd)r[   r   r   r   bytesdecoder   r   rd   r   re   r\   r   extendr   r   r   r   rx   r   )r9   r   r>   r   r   ri   Zmessage_previewr   r   r   r   r   r^   r   rG   Zsession_createdeventsr   r   r:   r:   r;   transform_realtime_response  s   ,






z1BedrockRealtimeConfig.transform_realtime_response)N)T)+__name__
__module____qualname____doc__r<   dictr"   r   rA   rD   boolrE   r   r^   rZ   intrh   r~   r   r   r   r   r   r   LiteLLMLoggingObjr   r   tupler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r:   r:   r;   r   &   s   !

 4 4E
*
 
e

*
#

h
+
2A
r   )&r   r[   r   r#   r   r   r   r   r   Zlitellm._loggingr   Zlitellm._uuidZ*litellm.litellm_core_utils.litellm_loggingr   r   Z-litellm.llms.base_llm.realtime.transformationr	   Zlitellm.types.llms.openair
   r   r   r   r   r   r   r   r   r   r   r   r   Zlitellm.types.realtimer   r   r   Zlitellm.utilsr   r   r:   r:   r:   r;   <module>   s    <