Ë
    uPêj(<  ã                   ó¼  — U d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	 ddl
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 ddlmZ  e	ee   dz  «      Zee	d      ed<    e	e«      Zee	e      ed<   dedeeef   fd„Z dededz  fd„Z! G d„ de«      Z" G d„ de«      Z# G d„ de«      Z$ G d„ de«      Z% G d„ de«      Z& G d„ d e«      Z' G d!„ d"e«      Z(y)#z™
This file contains the handler for AWS Bedrock Nova Sonic realtime API.

This uses aws_sdk_bedrock_runtime for bidirectional streaming with Nova Sonic.
é    N)ÚFinalÚProtocol)Ú	JsonValueÚTypeAdapter)Ú_redact_stringÚverbose_proxy_logger)Úget_aws_dns_suffix)ÚLogging)ÚRealtimeResponseTransformInputé   )Ú
BaseAWSLLM)ÚBedrockErroré   )ÚBedrockRealtimeConfigzlist[str] | NoneÚ_CLIENT_MODALITIES_ADAPTERÚ_CLIENT_MESSAGE_ADAPTERÚvalueÚreturnc                 ó*   — t        | t        «      r| S i S ©N)Ú
isinstanceÚdict©r   s    új/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/bedrock/realtime/handler.pyÚ
_json_dictr      s   € Ü˜u¤dÔ+ˆ5Ð3°Ð3ó    c                 ó*   — t        | t        «      r| S d S r   )r   Ústrr   s    r   Ú	_json_strr      s   € Ü˜u¤cÔ*ˆ5Ð4°Ð4r   c                   óH   — e Zd ZdZdefd„Zdeddfd„Zd
dededz  ddfd	„Zy)ÚRealtimeClientWebSocketzAThe client-facing websocket surface the realtime bridge talks to.r   c              ƒ   ó   K  — y ­wr   © ©Úselfs    r   Úreceive_textz$RealtimeClientWebSocket.receive_text&   ó   è ø� ùó   ‚ÚdataNc              ƒ   ó   K  — y ­wr   r#   )r%   r)   s     r   Ú	send_textz!RealtimeClientWebSocket.send_text(   r'   r(   ÚcodeÚreasonc              ƒ   ó   K  — y ­wr   r#   )r%   r,   r-   s      r   ÚclosezRealtimeClientWebSocket.close*   r'   r(   )iè  N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   r+   Úintr/   r#   r   r   r!   r!   #   s0   „ ÙKà, CÓ,à5 CÐ5¨DÓ5áS ÐS°C¸$±JÐSÈ$ÔSr   r!   c                   ó$   — e Zd Zdeddfd„Zdd„Zy)ÚBedrockInputStreamÚeventr   Nc              ƒ   ó   K  — y ­wr   r#   )r%   r7   s     r   ÚsendzBedrockInputStream.send.   r'   r(   c              ƒ   ó   K  — y ­wr   r#   r$   s    r   r/   zBedrockInputStream.close0   r'   r(   )r   N)r0   r1   r2   Úobjectr9   r/   r#   r   r   r6   r6   -   s   „ Ø4 Ð4¨4Ó4ä&r   r6   c                   ó(   — e Zd Zededz  fd„«       Zy)ÚBedrockPayloadPartr   Nc                  ó   — y r   r#   r$   s    r   Úbytes_zBedrockPayloadPart.bytes_4   s   € Ø&)r   )r0   r1   r2   ÚpropertyÚbytesr?   r#   r   r   r=   r=   3   s   „ ØØ)˜ ™Ò)ó Ù)r   r=   c                   ó(   — e Zd Zededz  fd„«       Zy)ÚBedrockOutputChunkr   Nc                  ó   — y r   r#   r$   s    r   r   zBedrockOutputChunk.value9   ó   € Ø25r   )r0   r1   r2   r@   r=   r   r#   r   r   rC   rC   8   s   „ ØØ5Ð)¨DÑ0Ò5ó Ù5r   rC   c                   ó   — e Zd Zdedz  fd„Zy)ÚBedrockOutputStreamr   Nc              ƒ   ó   K  — y ­wr   r#   r$   s    r   ÚreceivezBedrockOutputStream.receive>   r'   r(   )r0   r1   r2   rC   rI   r#   r   r   rG   rG   =   s   „ Ø=Ð1°DÑ8Ô=r   rG   c                   ó8   — e Zd Zedefd„«       Zdeeef   fd„Z	y)ÚBedrockBidirectionalStreamr   c                  ó   — y r   r#   r$   s    r   Úinput_streamz'BedrockBidirectionalStream.input_streamB   rE   r   c              ƒ   ó   K  — y ­wr   r#   r$   s    r   Úawait_outputz'BedrockBidirectionalStream.await_outputE   r'   r(   N)
r0   r1   r2   r@   r6   rM   Útupler;   rG   rO   r#   r   r   rK   rK   A   s)   „ ØØ5Ð0Ò5ó Ø5àK E¨&Ð2EÐ*EÑ$FÔKr   rK   c            $       ó*  ‡ — e Zd ZdZˆ fd„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededz  dedz  d	edz  d
edz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  f"d„Z		 ddede
dededededz  fd„Zde
dededededefd„Zˆ xZS )ÚBedrockRealtimez=Handler for Bedrock Nova Sonic realtime speech-to-speech API.c                 ó"   •— t         ‰| �  «        y r   )ÚsuperÚ__init__)r%   Ú	__class__s    €r   rU   zBedrockRealtime.__init__K   s   ø€ Ü‰ÑÕr   NÚmodelÚ	websocketÚlogging_objÚapi_baseÚapi_keyÚtimeoutÚaws_region_nameÚaws_access_key_idÚaws_secret_access_keyÚaws_session_tokenÚaws_role_nameÚaws_session_nameÚaws_profile_nameÚaws_web_identity_tokenÚaws_sts_endpointÚaws_bedrock_runtime_endpointÚaws_external_idc              ‹   óÈ  K  — 	 ddl m}m} ddlm} ddlm} |€d|i}| j                  ||«      }|�|}n|�|}nd|› d	t        |«      › �}t        j                  d
||«       | j                  ||	|
|||||||¬«
      }|€t        dd¬«      ‚|j                  «       } ||||j                  |j                   |j"                   |«       ¬«      } ||¬«      }t%        «       }	 |j'                   ||¬«      «      ƒ d{  –—† }t        j                  d«       |j)                  t+        j,                  |j/                  ||«      «      «      ƒ d{  –—†  t        j                  d«       ddddddddœ}t1        j2                  | j5                  ||||||«      «      } t1        j2                  | j7                  ||||||«      «      }!t1        j8                  | |!d¬«      ƒ d{  –—†  y# t        $ r t        d«      ‚w xY w7 Œÿ7 Œ°7 Œ!# t:        $ rT}"t        j<                  d|"«       	 |j?                  dtA        d|"› �«      ¬«      ƒ d{  –—†7   ‚ # t:        $ r Y ‚ w xY wd}"~"ww xY w­w)a`  
        Establish bidirectional streaming connection with Bedrock Nova Sonic.

        Args:
            model: Model ID (e.g., 'amazon.nova-sonic-v1:0')
            websocket: Client WebSocket connection
            logging_obj: LiteLLM logging object
            aws_region_name: AWS region
            Various AWS authentication parameters
        r   )ÚBedrockRuntimeClientÚ0InvokeModelWithBidirectionalStreamOperationInput)ÚConfig)ÚStaticCredentialsResolverzRMissing aws_sdk_bedrock_runtime. Install with: pip install aws-sdk-bedrock-runtimeNr]   zhttps://bedrock-runtime.ú.z0Bedrock Realtime: Connecting to %s with model %s)
r^   r_   r`   r]   rb   rc   ra   rd   re   rg   i‘  z}No AWS credentials found for Bedrock realtime. Set aws_* params in litellm_params or configure credentials in the environment)Ústatus_codeÚmessage)Úendpoint_uriÚregionr^   r_   r`   Ú!aws_credentials_identity_resolver)Úconfig)Úmodel_idz2Bedrock Realtime: Bidirectional stream establishedz;Bedrock Realtime: sent session.created to client on connect©Úcurrent_output_item_idÚcurrent_response_idÚcurrent_conversation_idÚcurrent_delta_chunksÚcurrent_item_chunksÚcurrent_delta_typeÚsession_configuration_requestT)Úreturn_exceptionsz+Error in BedrockRealtime.async_realtime: %sió  zInternal error: )r,   r-   )!Úaws_sdk_bedrock_runtime.clientri   rj   Úaws_sdk_bedrock_runtime.configrk   Úsmithy_aws_core.identityrl   ÚImportErrorÚ_get_aws_region_namer	   r   ÚdebugÚget_credentialsr   Úget_frozen_credentialsÚ
access_keyÚ
secret_keyÚtokenr   Ú&invoke_model_with_bidirectional_streamr+   ÚjsonÚdumpsÚsession_created_eventÚasyncioÚcreate_taskÚ_forward_client_to_bedrockÚ_forward_bedrock_to_clientÚgatherÚ	ExceptionÚ	exceptionr/   r   )#r%   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   Úkwargsri   rj   rk   rl   Úoptional_paramsrp   ÚcredentialsÚfrozen_credentialsrs   Úbedrock_clientÚtransformation_configÚbedrock_streamÚsession_stateÚclient_to_bedrock_taskÚbedrock_to_client_taskÚes#                                      r   Úasync_realtimezBedrockRealtime.async_realtimeN   sä  è ø€ ð>	t÷õ >ÝJð
 Ð"à! ?ð&ˆOð #×7Ñ7¸ÈÓOˆOð ÐØ#‰LØ)Ð5Ø7‰Là5°oÐ5FÀaÔHZÐ[jÓHkÐGlÐmˆLä×"Ñ"Ð#UÐWcÐejÔkà!×1Ñ1Ø/Ø"7Ø/Ø+Ø-Ø-Ø'Ø#9Ø-Ø+ð 2ó 
ˆð ÐÜØðBôð ð %0×$FÑ$FÓ$HÐñ Ø%Ø"Ø0×;Ñ;Ø"4×"?Ñ"?Ø0×6Ñ6Ù.GÓ.Iô
ˆñ !5¸FÔ Cˆä'<Ó'>Ðð:	à*8×*_Ñ*_Ù@È%ÔPó+÷ %ˆNô !×&Ñ&Ð'[Ô\à×%Ñ%¤d§j¡jÐ1F×1\Ñ1\Ð]bÐdoÓ1pÓ&qÓr×rÐrÜ ×&Ñ&Ð'dÔeð +/Ø'+Ø+/Ø(,Ø'+Ø&*Ø15ñDˆMô -4×,?Ñ,?Ø×/Ñ/ØØ"Ø)ØØ!Øóó	-Ð"ô -4×,?Ñ,?Ø×/Ñ/Ø"ØØ)ØØØ!óó	-Ð"ô —.‘.Ø&Ø&Ø"&ô÷ ñ øôK ò 	tÜÐrÓsÐsð	túðr%øð søðLùô ò 	Ü ×*Ñ*Ð+XÐZ[Ô\ðØ—o‘o¨4¼ÐIYÐZ[ÐY\ÐG]Ó8^�oÓ_×_Ñ_ð øô ò ØØðþð		üs¨   ‚I"„G$ ˜CI"Ã!H Ã<G<Ã=AH ÅG>ÅBH ÇH ÇH Ç#I"Ç$G9Ç9I"Ç<H Ç>H È H È	IÈIÈ""IÉIÉIÉ
IÉ	IÉIÉIÉIÉIÉI"Ú	client_wsrš   r™   r›   c           	   ƒ   ó¼  ‡‡‡K  — ddl mŠmŠ dt        ddfˆˆˆfd„}	 	 |j	                  «       ƒ d{  –—† }t        j                  d|dd	 «       |j                  |||j                  d
«      ¬«      }	|	D ]  }
 ||
«      ƒ d{  –—†  Œ |�ád}d}t        j                  t        «      5  t        t        j                  |«      «      }t        |j                  d«      «      }|dk(  r<t         j#                  t        |j                  d«      «      j                  d«      «      }ddd«       |dk(  r=|j%                  t'        j(                  |j+                  |||«      «      «      ƒ d{  –—†  �ŒP7 �Œ=7 Œî# 1 sw Y   ŒRxY w7 Œ# t        $ rÍ}t        j                  d|d¬«       |j-                  «       D ]A  }t        j                  t        «      5   ||«      ƒ d{  –—†7   ddd«       Œ7# 1 sw Y   Œ@xY w t        j                  t        «      5  ‰j.                  j1                  «       ƒ d{  –—†7   ddd«       n# 1 sw Y   nxY wY d}~yY d}~yd}~ww xY w­w)z9Forward messages from client WebSocket to Bedrock stream.r   )ÚBidirectionalInputPayloadPartÚ,InvokeModelWithBidirectionalStreamInputChunkÚbedrock_messager   Nc              “   óÈ   •K  —  ‰ ‰| j                  d«      ¬«      ¬«      }‰j                  j                  |«      ƒ d {  –—†  t        j                  d| d d «       y 7 Œ­w)Núutf-8)r?   r   z%Bedrock Realtime: Sent to Bedrock: %séÈ   )ÚencoderM   r9   r   rƒ   )r¤   r7   r¢   r£   rš   s     €€€r   Úsend_to_bedrockzCBedrockRealtime._forward_client_to_bedrock.<locals>.send_to_bedrockö   sa   øè ø€ ÙGÙ3¸?×;QÑ;QÐRYÓ;ZÔ[ôˆEð !×-Ñ-×2Ñ2°5Ó9×9Ð9Ü ×&Ñ&Ð'NÐP_Ð`dÐadÐPeÕfð :ús   ƒ>A"ÁA ÁA"Tz*Bedrock Realtime: Received from client: %sr§   r|   )ro   rW   r|   Útypezsession.updateÚsessionÚ
modalitiesz&Client to Bedrock forwarding ended: %s©Úexc_info)Úaws_sdk_bedrock_runtime.modelsr¢   r£   r   r&   r   rƒ   Útransform_realtime_requestÚgetÚ
contextlibÚsuppressr’   r   r   Úvalidate_jsonr   r   Úvalidate_pythonr+   rŠ   r‹   Úsession_updated_eventÚsession_close_messagesrM   r/   )r%   r    rš   r™   rW   r›   rY   r©   ro   Útransformed_messagesr¤   Úclient_message_typeÚrequested_modalitiesÚparsed_client_messagerž   Úclose_messager¢   r£   s     `             @@r   r�   z*BedrockRealtime._forward_client_to_bedrockç   sQ  úè ø€ ÷	
ð
	g´3ð 	g¸4÷ 	gð(	:Øà )× 6Ñ 6Ó 8×8�Ü$×*Ñ*Ð+WÐY`ÐaeÐbeÐYfÔgð (=×'WÑ'WØ#ØØ2?×2CÑ2CÐDcÓ2dð (Xó (Ð$ð (<ò ;�OÙ)¨/Ó:×:Ñ:ð;ð Ð*Ø6:Ð'Ø=AÐ(Ü#×,Ñ,¬YÓ7ñ Ü0:Ô;R×;`Ñ;`ÐahÓ;iÓ0jÐ-Ü.7Ð8M×8QÑ8QÐRXÓ8YÓ.ZÐ+Ø.Ð2BÒBÜ3M×3]Ñ3]Ü *Ð+@×+DÑ+DÀYÓ+OÓ P× TÑ TÐUaÓ bó4Ð0÷	ð +Ð.>Ò>Ø'×1Ñ1Ü ŸJ™JØ 5× KÑ KÈEÐS^Ð`tÓ uóó÷ ð ñ7 à8ùð ;ø÷
ð úðùô ò 	:Ü ×&Ñ&Ð'OÐQRÐ]aÕbØ!6×!MÑ!MÓ!Oò 9�Ü×(Ñ(¬Ó3ñ 9Ù)¨-Ó8×8Ñ8÷9÷ 9ñ 9úð9ô ×$Ñ$¤YÓ/ñ :Ø$×1Ñ1×7Ñ7Ó9×9Ñ9÷:÷ :ñ :ú÷ :ñ :ûð	:üs´   …IŸF ³E0´AF ÂE3Â%F Â*A:E5Ä$AF Å)FÅ*F Å3F Å5E>Å:F Æ	IÆAIÇG+ÇG
ÇG+Ç"	IÇ+G4Ç0!IÈH>È/H2È0H>È5	IÈ>I	ÉIÉ

IÉIÉIc              ƒ   ó@  K  — 	 	 |j                  «       ƒ d{  –—† }|d   j                  «       ƒ d{  –—† }|€t        j                  d«       �n½|j                  r|j                  j
                  nd}	|	�r”|	j                  d«      }
t        j                  d|
dd «       |j                  d«      |j                  d	«      |j                  d
«      |j                  d«      |j                  d«      |j                  d«      |j                  d«      dœ}|j                  |
|||¬«      }|j                  |j                  d«      |j                  d	«      |j                  d
«      |j                  d«      |j                  d«      |j                  d«      |j                  d«      dœ«       |j                  dg «      }|D ]I  }t        j                  |«      }|j                  |«      ƒ d{  –—†  t        j                  d|dd «       ŒK �Œ		 	 |j                  «       ƒ d{  –—†  y7 �Œ7 �Œù7 ŒB# t        $ r"}t        j                  d|d¬«       Y d}~ŒHd}~ww xY w7 Œ;# t        $ r Y yw xY w# 	 |j                  «       ƒ d{  –—†7   w # t        $ r Y w w xY wxY w­w)z9Forward messages from Bedrock stream to client WebSocket.TNr   z&Bedrock Realtime: Bedrock stream endedr¦   z+Bedrock Realtime: Received from Bedrock: %sr§   rv   rw   rx   ry   rz   r{   r|   ru   )ro   rW   rY   Ú!realtime_response_transform_inputÚresponsez$Bedrock Realtime: Sent to client: %sz&Bedrock to client forwarding ended: %sr­   )rO   rI   r   rƒ   r   r?   Údecoder±   Útransform_realtime_responseÚupdaterŠ   r‹   r+   r’   r/   )r%   rš   r    r™   rW   rY   r›   ÚoutputÚresultÚpayload_bytesÚbedrock_responser¾   Útransformed_responseÚopenai_messagesÚopenai_messageÚmessage_jsonrž   s                    r   r�   z*BedrockRealtime._forward_bedrock_to_client'  s¨  è ø€ ð<	Øà-×:Ñ:Ó<×<�Ø% a™y×0Ñ0Ó2×2�à�>Ü(×.Ñ.Ð/WÔXÙà7=·|²| §¡× 3Ò 3È�Ú Ø'4×';Ñ';¸GÓ'DÐ$Ü(×.Ñ.Ð/\Ð^nÐosÐpsÐ^tÔuð 3@×2CÑ2CÐD\Ó2]Ø/<×/@Ñ/@ÐAVÓ/WØ3@×3DÑ3DÐE^Ó3_Ø0=×0AÑ0AÐBXÓ0YØ/<×/@Ñ/@ÐAVÓ/WØ.;×.?Ñ.?Ð@TÓ.UØ9F×9JÑ9JÐKjÓ9kñYÐ5ð ,A×+\Ñ+\Ø 0Ø#Ø$/Ø:[ð	 ,]ó ,Ð(ð "×(Ñ(à6J×6NÑ6NÐOgÓ6hØ3G×3KÑ3KÐLaÓ3bØ7K×7OÑ7OÐPiÓ7jØ4H×4LÑ4LÐMcÓ4dØ3G×3KÑ3KÐLaÓ3bØ2F×2JÑ2JÐK_Ó2`Ø=Q×=UÑ=UÐVuÓ=vñô
ð ';×&>Ñ&>¸zÈ2Ó&N�OØ*9ò o˜Ü'+§z¡z°.Ó'A˜Ø'×1Ñ1°,Ó?×?Ð?Ü,×2Ñ2Ð3YÐ[gÐhlÐilÐ[mÕnðoñ_ ð ðbØ—o‘oÓ'×'Ñ'ðo =ùØ2ùð\ @ùô ò 	cÜ ×&Ñ&Ð'OÐQRÐ]a×bÒbûð	cúð
 (ùÜò ÙðûðØ—o‘oÓ'×'Ò'øÜò ÙðÿsÓ   ‚J„H1 ˜H)™H1 ³H,´F8H1 Ç,H/Ç-!H1 ÈI0 ÈI! È#IÈ$I! È(JÈ)H1 È,H1 È/H1 È1	IÈ:IÉI0 ÉIÉI0 ÉI! É!	I-É*JÉ,I-É-JÉ0JÉ2JÊJÊJÊJÊ	JÊJÊJÊJÊJ)NNNNNNNNNNNNNNr   )r0   r1   r2   r3   rU   r   r!   ÚLiteLLMLoggingÚfloatrŸ   rK   r   r   r�   r�   Ú__classcell__)rV   s   @r   rR   rR   H   s¿  ø„ ÙGôð  $Ø"Ø $Ø&*Ø(,Ø,0Ø(,Ø$(Ø'+Ø'+Ø-1Ø'+Ø37Ø&*ñ%WàðWð +ðWð $ð	Wð
 ˜‘*ðWð �t‘ðWð ˜‘ðWð ˜t™ðWð  ™:ðWð  # T™zðWð  ™:ðWð ˜T‘zðWð  ™*ðWð  ™*ðWð !$ d¡
ðWð   ™*ð!Wð" '*¨D¡jð#Wð$ ˜t™ó%Wð@ .2ñ>:à*ð>:ð 3ð>:ð  5ð	>:ð
 ð>:ð 6ð>:ð $ dÑ*ó>:ð@Fà2ðFð +ðFð  5ð	Fð
 ðFð $ðFð 6÷Fr   rR   ))r3   r�   r²   rŠ   Útypingr   r   Úpydanticr   r   Úlitellm._loggingr   r   Ú(litellm.litellm_core_utils.aws_partitionr	   Ú*litellm.litellm_core_utils.litellm_loggingr
   rË   Úlitellm.types.realtimer   Úbase_aws_llmr   Úcommon_utilsr   Útransformationr   Úlistr   r   Ú__annotations__r   r   r   r   r!   r6   r=   rC   rG   rK   rR   r#   r   r   ú<module>rÙ      sÿ   ðòó Û Û ß "ç +ç AÝ GÝ PÝ Aå %Ý 'Ý 1áEPÐQUÐVYÑQZÐ]aÑQaÓEbÐ ˜E +Ð.@Ñ"AÑBÓ bÙ9DÀYÓ9OÐ ˜˜{¨9Ñ5Ñ6Ó Oð4�ið 4 D¨¨i¨Ñ$8ó 4ð5�Yð 5 3¨¡:ó 5ôT˜hô Tô'˜ô 'ô*˜ô *ô
6˜ô 6ô
>˜(ô >ôL ô Lôe�jõ er   