§
     @g�+  ã                   óš  — d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
Z
d dl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mZ d d
lmZmZmZmZmZmZ d dl m!Z! d dl"m#Z#  ej$        e%¦  «        Z& G d„ de¦  «        Z' G d„ de¦  «        Z( G d„ de¦  «        Z) G d„ de¦  «        Z*e'e(e)e*gZ+ G d„ de¦  «        Z,dS )é    N)Údatetime)ÚListÚUnion)ÚRequest)ÚStreamingResponseÚJSONResponse)Ú	SigV4Auth)Ú
AWSRequest)ÚCredentials)ÚRequestFilterBaseÚResponseFilterBase)Ú
HTTPXProxyÚSessionInfoÚSessionRequestItemBaseÚSessionResponseItemBaseÚSessionStreamChunkItemBaseÚSessionErrorItemBase)Ú_AccessLogBase)ÚQueueClientBasec                   ó   — e Zd Zdedefd„ZdS )ÚClaudeRequestItemÚaccesslog_clsÚreturnc                 ó$  — 	 | j         d         d         d         }t          |t          ¦  «        r|d         }t          |t          ¦  «        r&|d         dk    r	|d         }n|d         dk    rd}nd}n4# t          $ r' t
                               d| j         › �¦  «         d }Y nw xY w || j        t          j	        ¦   «         d	|t          j        | j         d
¬¦  «        t          j        | j        d
¬¦  «        | j        j        d         ¬¦  «        S )NÚmessageséÿÿÿÿÚcontentÚtypeÚtextz(image)z(other)z"Error at parsing request for log: ÚrequestF©Úensure_asciiÚmodel)Ú
request_idÚ
created_atÚ	directionr   Úraw_bodyÚraw_headersr#   )Úrequest_jsonÚ
isinstanceÚlistÚdictÚ	ExceptionÚloggerÚerrorr$   r   ÚutcnowÚjsonÚdumpsÚrequest_headersÚsessionÚ
extra_info)Úselfr   r   s      úJ/var/www/piapp/venv/lib/python3.11/site-packages/aiproxy/bedrock_claude.pyÚto_accesslogzClaudeRequestItem.to_accesslog   s+  € ð	ØÔ'¨
Ô3°BÔ7¸	ÔBˆGÝ˜'¥4Ñ(Ô(ð &Ø! "œ+�Ý˜'¥4Ñ(Ô(ð (Ø˜6”? fÒ,Ð,Ø% fœo�G�GØ˜V”_¨Ò.Ð.Ø'�G�Gà'�Gøøåð 	ð 	ð 	Ý�LŠLÐQ¸dÔ>OÐQÐQÑRÔRÐRØˆGˆGˆGð	øøøð ˆ}Ø”Ý”Ñ(Ô(ØØÝ”Z Ô 1ÀÐFÑFÔFÝœ
 4Ô#7ÀeÐLÑLÔLØ”,Ô)¨'Ô2ð
ñ 
ô 
ð 	
s   ‚A1A4 Á4.B%Â$B%N©Ú__name__Ú
__module__Ú__qualname__r   r8   © ó    r7   r   r      s6   € € € € € ð
¨.ð 
¸^ð 
ð 
ð 
ð 
ð 
ð 
r>   r   c                   ó   — e Zd Zdedefd„ZdS )ÚClaudeResponseItemr   r   c                 ó0  — d }d}d}	 | j         d         d         d         }d| j         v r| j         d         d         nd}d| j         v r| j         d         d         nd}n2# t          $ r% t                               d| j         › �¦  «         Y nw xY w || j        t          j        ¦   «         d| j        |d d t          j	        | j         d	¬
¦  «        t          j	        | j
        d	¬
¦  «        | j                              d¦  «        ||| j        | j        ¬¦  «        S )Nr   r   r   ÚusageÚinput_tokensÚoutput_tokensz#Error at parsing response for log: ÚresponseFr!   r#   ©r$   r%   r&   Ústatus_coder   Úfunction_callÚ
tool_callsr'   r(   r#   Úprompt_tokensÚcompletion_tokensÚrequest_timeÚrequest_time_api)Úresponse_jsonr-   r.   r/   r$   r   r0   rG   r1   r2   Úresponse_headersÚgetÚdurationÚduration_api)r6   r   r   rJ   rK   s        r7   r8   zClaudeResponseItem.to_accesslog6   sY  € ØˆØˆØÐð	UØÔ(¨Ô3°AÔ6°vÔ>ˆGà˜dÔ0Ð0Ð0ð !Ô.¨wÔ7¸ÔGÐGØ67ð ð ˜dÔ0Ð0Ð0ð !%Ô 2°7Ô ;¸OÔ LÐ LØ67ð Ðøåð 	Uð 	Uð 	UÝ�LŠLÐS¸tÔ?QÐSÐSÑTÔTÐTÐTÐTð	Uøøøð ˆ}Ø”Ý”Ñ(Ô(Ø ØÔ(ØØØÝ”Z Ô 2ÀÐGÑGÔGÝœ
 4Ô#8ÀuÐMÑMÔMØÔ$×(Ò(¨Ñ1Ô1Ø'Ø/ØœØ!Ô.ð
ñ 
ô 
ð 	
s   ˆAA Á,BÂBNr9   r=   r>   r7   r@   r@   5   s6   € € € € € ð
¨.ð 
¸^ð 
ð 
ð 
ð 
ð 
ð 
r>   r@   c                   ó   — e Zd Zdedefd„ZdS )ÚClaudeStreamResponseItemr   r   c                 ó¤  — d}d}d}d}t          | j        j        d         ¦  «        | _        	 | j        j        d         D ]ì}t	          j        d|¦  «        D ]Ô}t          j        |dd …                              d¦  «        ¦  «        d         }t          j        t          j
        |¦  «                             ¦   «         ¦  «        }	|	d         d	k    r|	d
         }
|
d         }|
d         d         }Œš|	d         dk    r||	d         d         pdz  }Œº|	d         dk    r|	d         d         }ŒÕŒínH# t          $ r;}t                               d|› dt          j        ¦   «         › �¦  «         Y d }~nd }~ww xY w || j        t#          j        ¦   «         d| j        |d d | j        t          j        | j        d¬¦  «        |||| j        | j        ¬¦  «        S )NÚ r   Úresponse_eventss   event\{.*?\}é   zutf-8Úbytesr   Úmessage_startÚmessager#   rB   rC   Úcontent_block_deltaÚdeltar   Úmessage_deltarD   zError at to_accesslog: ú
rE   Fr!   rF   )Ústrr4   r5   Úresponse_contentÚreÚfindallr1   ÚloadsÚdecodeÚbase64Ú	b64decoder-   r.   r/   Ú	tracebackÚ
format_excr$   r   r0   rG   r2   rO   rQ   rR   )r6   r   Úresponse_textr#   rJ   rK   ÚchunkÚmÚb64bytesÚ
chunk_jsonÚmsgÚexs               r7   r8   z%ClaudeStreamResponseItem.to_accesslogV   s  € ØˆØˆØˆØÐå # D¤LÔ$;Ð<MÔ$NÑ OÔ OˆÔð	SØœÔ0Ð1BÔCð Qð Q�åœÐ$4°eÑ<Ô<ð Qð Q�AÝ#œz¨!¨A¨B¨B¬%¯,ª,°wÑ*?Ô*?Ñ@Ô@ÀÔI�HÝ!%¤­FÔ,<¸XÑ,FÔ,F×,MÒ,MÑ,OÔ,OÑ!PÔ!P�Jð " &Ô)¨_Ò<Ð<Ø(¨Ô3˜Ø # G¤˜Ø(+¨G¬°^Ô(D˜˜ð $ FÔ+Ð/DÒDÐDØ%¨°GÔ)<¸VÔ)DÐ)JÈÑJ˜˜ð $ FÔ+¨Ò>Ð>Ø,6°wÔ,?ÀÔ,PÐ)øð!QðQøõ& ð 	Sð 	Sð 	SÝ�LŠLÐQ°2ÐQÐQ½Ô9MÑ9OÔ9OÐQÐQÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøð ˆ}Ø”Ý”Ñ(Ô(Ø ØÔ(Ø!ØØØÔ*Ýœ
 4Ô#8ÀuÐMÑMÔMØØ'Ø/ØœØ!Ô.ð
ñ 
ô 
ð 	
s   ®C?D. Ä.
E3Ä81E.Å.E3Nr9   r=   r>   r7   rT   rT   U   s6   € € € € € ð-
¨.ð -
¸^ð -
ð -
ð -
ð -
ð -
ð -
r>   rT   c                   ó   — e Zd ZdS )ÚClaudeErrorItemN)r:   r;   r<   r=   r>   r7   rr   rr   †   s   € € € € € Ø€Cr>   rr   c                   ó  ‡ — e Zd Zddddddeeeedœ
dedededee	         dee
         d	ed
edededefˆ fd„Zdedefd„Zdededef         fd„Zdedefˆ fd„Zdededefd„Zdefˆ fd„Zdefd„Zdej        dej        defd„Zˆ xZS )ÚBedrockClaudeProxyNg      N@)
Úaws_access_key_idÚaws_secret_access_keyÚregion_nameÚtimeoutÚrequest_filtersÚresponse_filtersÚrequest_item_classÚresponse_item_classÚstream_response_item_classÚerror_item_classru   rv   rw   ry   rz   r{   r|   r}   r~   Úaccess_logger_queuec          
      óØ   •— t          ¦   «                              ||||||	|
|¬¦  «         d|› d�| _        d| _        d| _        t          t          ||¬¦  «        d|¬¦  «        | _        d S )	N)rx   ry   rz   r{   r|   r}   r~   r   zhttps://bedrock-runtime.z.amazonaws.comz/model/{model_and_method:path}zbedrock-claude)Ú
access_keyÚ
secret_keyÚbedrock)ÚcredentialsÚservice_namerw   )ÚsuperÚ__init__Úapi_base_urlÚapi_chat_resource_pathÚapi_service_idr	   r   Ú
authorizer)r6   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   Ú	__class__s               €r7   r‡   zBedrockClaudeProxy.__init__�   sž   ø€ õ 	‰Œ×ÒØØ+Ø-Ø1Ø 3Ø'AØ-Ø 3ð 	ñ 		
ô 		
ð 		
ð S°{ÐRÐRÐRˆÔØ&FˆÔ#Ø.ˆÔå#Ý#Ø,Ø0ðñ ô ð #Ø#ð
ñ 
ô 
ˆŒˆˆr>   r   r   c                 ó   — d|dœgdddœdœS )Nr   )r   r   r   )rC   rD   )r   rB   r=   )r6   r   s     r7   Útext_to_response_jsonz(BedrockClaudeProxy.text_to_response_json¶   s*   € à!'°Ð6Ð6Ð7Ø&'¸!Ð<Ð<ð
ð 
ð 	
r>   r4   c              ƒ   óü  K  — | j         D ]ñ}|                     |j        |j        |j        ¦  «        ƒ d {V —†x}rÁ|                      |¦  «        |_        t          |j        ¦  «        }|                      ||j        ¦  «         t          |j
        ¦  «        |_        | j                             | j                             |¬¦  «        ¦  «         |j        r!t"                               d¦  «         d|_        |c S Œòd S )N)r4   z{ClaudeProxy for Bedrock doesn't support instant reply from RequestFilter in stream mode. Return message as 400 bad request.i�  )ry   Úfilterr$   r)   r3   rŽ   rN   r   Úadd_response_headersr,   ÚheadersrO   r   Úputr|   Úfrom_sessionÚstreamr.   ÚwarningrG   )r6   r4   ÚfÚcompletion_contentÚjson_responses        r7   Úfilter_requestz!BedrockClaudeProxy.filter_request¼   s$  è è € ØÔ%ð 	%ð 	%ˆAØ+,¯8ª8°GÔ4FÈÔH\Ð^eÔ^uÑ+vÔ+vÐ%vÐ%vÐ%vÐ%vÐ%vÐ%vÐvÐ!ð %à(,×(BÒ(BÐCUÑ(VÔ(V�Ô%Ý ,¨WÔ-BÑ CÔ C�Ø×)Ò)¨-¸Ô9KÑLÔLÐLÝ+/°Ô0EÑ+FÔ+F�Ô(ð Ô(×,Ò,ØÔ,×9Ò9À'Ð9ÑJÔJñô ð ð
 ”>ð 4Ý—N’Nð  $añ  bô  bð  bØ03�MÔ-à$Ð$Ð$Ð$ð#%ð& ˆtr>   Úfastapi_requestc              ƒ   óü   •K  — t          ¦   «                              ||¦  «        ƒ d {V —† dt          |j        ¦  «        v |_        t          j        d|j        ¦  «                             d¦  «        |j        d<   d S )Núinvoke-with-response-streamzmodel/(.*?)/é   r#   )	r†   Úparse_requestr`   Úrequest_urlr•   rb   ÚsearchÚgroupr5   )r6   r›   r4   rŒ   s      €r7   rŸ   z BedrockClaudeProxy.parse_requestÓ   s{   øè è € Ý‰gŒg×#Ò# O°WÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø6½#¸gÔ>QÑ:RÔ:RÐRˆŒÝ&(¤i°ÀÔATÑ&UÔ&U×&[Ò&[Ð\]Ñ&^Ô&^ˆÔ˜7Ñ#Ð#Ð#r>   Úurlr3   Úbedrock_paramsc                 óÚ   — t          d||t          j        |¦  «                             ¦   «         ¬¦  «        }| j                             |¦  «         |                     ¦   «          |j        S )NÚPOST)Úmethodr£   r’   Údata)r
   r1   r2   Úencoder‹   Úadd_authÚpreparer’   )r6   r£   r3   r¤   Úars        r7   Ú get_aws_request_header_with_credz3BedrockClaudeProxy.get_aws_request_header_with_credØ   se   € ÝØØØ#Ý”˜NÑ+Ô+×2Ò2Ñ4Ô4ð	
ñ 
ô 
ˆð 	Œ× Ò  Ñ$Ô$Ð$Ø
�
Š
‰ŒˆØŒzÐr>   c                 ó  •— t          ¦   «                              |¦  «         d|j        v r|j        d= d|j        v r|j        d= |                      |                      |¦  «        |j        |j        ¦  «        d         |j        d<   d S )NÚauthorizationÚ
connection)r†   Úprepare_httpx_request_headersr3   r­   Úmake_urlr)   )r6   r4   rŒ   s     €r7   r±   z0BedrockClaudeProxy.prepare_httpx_request_headersã   sœ   ø€ Ý‰Œ×-Ò-¨gÑ6Ô6Ð6ð ˜gÔ5Ð5Ð5ØÔ'¨Ð8Ø˜7Ô2Ð2Ð2ØÔ'¨Ð5ð ×1Ò1Ø—’˜gÑ&Ô&ØÔ'ØÔ$ñô ð ô	ð 	Ô Ñ0Ð0Ð0r>   c                 óH   — | j         › d|j        d         › d|j        rdnd› �S )Nz/model/r#   ú/r�   Úinvoke)rˆ   r5   r•   )r6   r4   s     r7   r²   zBedrockClaudeProxy.make_urlô   sV   € ØÔ#ð  Lð  L¨GÔ,>¸wÔ,Gð  Lð  LÐlsÔlzð  LIÐKhÐKhð  AIð  Lð  Lð  	Lr>   Úasync_clientÚstream_responsec                 ób   ‡ ‡‡‡— ˆˆ ˆˆfd„}t           |¦   «         ‰j        ‰j        ¬¦  «        S )Nc            
     óÒ  •K  — g ‰j         d<   	 ‰                     ¦   «         2 3 d {V —†} ‰j         d                              | ¦  «         | W V — Œ-6 	 	 t          j        ¦   «         }|‰j        z
  ‰_        |‰j        z
  ‰_        ‰j         	                    ‰j
                             ‰¦  «        ¦  «         nj# t          $ r]}t                               d|› dt          j        ¦   «         › �¦  «         t                               d‰j        › �¦  «         Y d }~nd }~ww xY w‰                     ¦   «         ƒ d {V —† d S # ‰                     ¦   «         ƒ d {V —† w xY w# 	 t          j        ¦   «         }|‰j        z
  ‰_        |‰j        z
  ‰_        ‰j         	                    ‰j
                             ‰¦  «        ¦  «         nj# t          $ r]}t                               d|› dt          j        ¦   «         › �¦  «         t                               d‰j        › �¦  «         Y d }~nd }~ww xY w‰                     ¦   «         ƒ d {V —† w # ‰                     ¦   «         ƒ d {V —† w xY wxY w)NrW   zFailed in making log items: r_   zresponse_content: )r5   Ú	aiter_rawÚappendÚtimeÚ
start_timerQ   Ústart_time_apirR   r   r“   r}   r”   r-   r.   r/   rh   ri   Úresponse_bodyÚaclose)ÚbÚnowrp   r¶   r6   r4   r·   s      €€€€r7   Úprocess_streamz?BedrockClaudeProxy.make_stream_response.<locals>.process_streamø   sñ  øè è € Ø46ˆGÔÐ0Ñ1ð0à.×8Ò8Ñ:Ô:ð ð ð ð ð ð ð ˜!ØÔ&Ð'8Ô9×@Ò@ÀÑCÔCÐCØ�G�G�G�G�Gð  ;Ð:ð0Ýœ)™+œ+�CØ'*¨WÔ-?Ñ'?�GÔ$Ø+.°Ô1GÑ+G�GÔ(ØÔ,×0Ò0ØÔ7×DÒDÀWÑMÔMñô ð ð øõ !ð Oð Oð OÝ—L’LÐ!^ÀÐ!^Ð!^ÅiÔFZÑF\ÔF\Ð!^Ð!^Ñ_Ô_Ð_Ý—L’LÐ!M°gÔ6KÐ!MÐ!MÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøð
 '×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ø˜,×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøð0Ýœ)™+œ+�CØ'*¨WÔ-?Ñ'?�GÔ$Ø+.°Ô1GÑ+G�GÔ(ØÔ,×0Ò0ØÔ7×DÒDÀWÑMÔMñô ð ð øõ !ð Oð Oð OÝ—L’LÐ!^ÀÐ!^Ð!^ÅiÔFZÑF\ÔF\Ð!^Ð!^Ñ_Ô_Ð_Ý—L’LÐ!M°gÔ6KÐ!MÐ!MÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøð
 '×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ø˜,×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøøøs…   �E £A©(E ÁA#B7 Â6D= Â7
DÃADÄD= ÄDÄD= Ä=EÅI&ÅA#GÇIÇ
H)ÇAH$ÈIÈ$H)È)IÈ,I&ÉI#É#I&)rG   r’   )r   rG   rO   )r6   r¶   r·   r4   rÃ   s   ```` r7   Úmake_stream_responsez'BedrockClaudeProxy.make_stream_response÷   s^   øøøø€ ð	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0õ2 !ØˆNÑÔØÔ+ØÔ,ð
ñ 
ô 
ð 	
r>   )r:   r;   r<   r   r@   rT   rr   r`   r   r   r   r   r   r‡   r,   rŽ   r   r   r   rš   r   rŸ   r­   r±   r²   ÚhttpxÚAsyncClientÚResponserÄ   Ú__classcell__)rŒ   s   @r7   rt   rt   Ž   sú  ø€ € € € € ð "&Ø%)ØØØ37Ø59Ø#4Ø$6Ø+CØ!0ð%
ð %
ð %
ð ð%
ð  #ð	%
ð
 ð%
ð Ð/Ô0ð%
ð Ð1Ô2ð%
ð !ð%
ð "ð%
ð %)ð%
ð ð%
ð -ð%
ð %
ð %
ð %
ð %
ð %
ðN
¨#ð 
°$ð 
ð 
ð 
ð 
ð¨Kð ¸EÀ$ÈÐBTÔ<Uð ð ð ð ð._°7ð _À[ð _ð _ð _ð _ð _ð _ð
	°Cð 	È$ð 	Ð`dð 	ð 	ð 	ð 	ð°[ð ð ð ð ð ð ð"L ð Lð Lð Lð Lð
°Ô1Bð 
ÐUZÔUcð 
Ðnyð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r>   rt   )-rf   r   r1   Úloggingrb   r¼   rh   Útypingr   r   rÅ   Úfastapir   Úfastapi.responsesr   r   Úbotocore.authr	   Úbotocore.awsrequestr
   Úbotocore.credentialsr   Úaiproxy.proxyr   r   Úaiproxy.httpx_proxyr   r   r   r   r   r   Úaiproxy.accesslogr   Úaiproxy.queueclientr   Ú	getLoggerr:   r.   r   r@   rT   rr   Úqueue_item_typesrt   r=   r>   r7   ú<module>rÖ      s�  ðØ €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø #Ð #Ð #Ð #Ð #Ð #Ø *Ð *Ð *Ð *Ð *Ð *Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?ð [ð  [ð  [ð  [ð  [ð  [ð  [ð  [ð  [ð  [ð  [ð  [ð  [ð  [ð  [ð  [Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø /Ð /Ð /Ð /Ð /Ð /ð 
ˆÔ	˜8Ñ	$Ô	$€ð
ð 
ð 
ð 
ð 
Ð.ñ 
ô 
ð 
ð:
ð 
ð 
ð 
ð 
Ð0ñ 
ô 
ð 
ð@.
ð .
ð .
ð .
ð .
Ð9ñ .
ô .
ð .
ðbð ð ð ð Ð*ñ ô ð ð &Ð'9Ð;SÐUdÐeÐ ðG
ð G
ð G
ð G
ð G
˜ñ G
ô G
ð G
ð G
ð G
r>   