
     @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+   	'
3B7	BG'4(( &!"+'4(( (6?f,,%foGGV_..'GG'G 	 	 	LLQd>OQQRRRGGG	 }((Z 1FFF
4#7e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(3A6v>Gd000 !.w7GG67  d000 !% 27 ;O L L67  	U 	U 	ULLSt?QSSTTTTT	U }(( (Z 2GGG
4#8u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    #DL$;<M$N O O	S01BC Q Q$4e<< Q QA#z!ABB%,,w*?*?@@IH!%F,<X,F,F,M,M,O,O!P!PJ "&)_<<(3 #G(+G^(D $F+/DDD%G)<V)D)JJ $F+>>,6w,?,P)!QQ&  	S 	S 	SLLQ2QQ9M9O9OQQRRRRRRRR	S }(( (!*
4#8u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+,88G4FH\^e^u+v+v%v%v%v%v%v%vv! %(,(B(BCU(V(V% ,W-B C C))-9KLLL+/0E+F+F( (,,,99'9JJ  
 > 4NN  $a  b  b  b03M-$$$$#%& 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{      gg##OW=========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lslz  LIKhKh  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     46G010.88::       !&'89@@CCCGGGGG  ;:0)++C'*W-?'?G$+.1G+GG(,007DDWMM    ! O O OLL!^!^!^iFZF\F\!^!^___LL!Mg6K!M!MNNNNNNNNO
 '--///////////,--//////////0)++C'*W-?'?G$+.1G+GG(,007DDWMM    ! O O OLL!^!^!^iFZF\F\!^!^___LL!Mg6K!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 	02 !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        "&%)3759#4$6+C!0%
 %
 %
 %
  #	%

 %
 /0%
 12%
 !%
 "%
 %)%
 %
 -%
 %
 %
 %
 %
 %
N
# 
$ 
 
 
 
K E$BT<U    ._7 _[ _ _ _ _ _ _
	C 	$ 	`d 	 	 	 	[      "L L L L L
1B 
UZUc 
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;SUde G
 G
 G
 G
 G
 G
 G
 G
 G
 G
r>   