
     @g                     :   d dl m Z  d dlZd dl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 )    )datetimeN)List)Request)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                 4   	 | 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                             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get)selfr   r   s      L/var/www/piapp/venv/lib/python3.11/site-packages/aiproxy/anthropic_claude.pyto_accesslogzClaudeRequestItem.to_accesslog   s2   	'
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#''00
 
 
 	
s   A1A4 4.B%$B%N__name__
__module____qualname__r   r1        r0   r   r      s6        
. 
^ 
 
 
 
 
 
r7   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   r*   r@   r+   r,   response_headersr.   durationduration_api)r/   r   r   rC   rD   s        r0   r1   zClaudeResponseItem.to_accesslog-   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Nr2   r6   r7   r0   r9   r9   ,   s6        
. 
^ 
 
 
 
 
 
r7   r9   c                       e Zd ZdedefdZdS )ClaudeStreamResponseItemr   r   c                 |   d}d}d}d}| j                             d          }|D ]}|                    d          }t          |          dk     r+t          j        |d                                                   }	|	d         dk    r|	d	         }
|
d
         }|
d         d         }|	d         dk    r||	d         d         pdz  }|	d         dk    r|	d         d         } || j        t          j                    d| j	        |d d | j         t          j
        | j        d          |||| j        | j                  S )N r   z

zdata:      r   message_startmessager   r;   r<   content_block_deltadeltar   message_deltar=   r>   Fr   r?   )response_contentsplitlenr+   loadsstripr   r   r*   r@   r,   rH   rI   rJ   )r/   r   response_textr   rC   rD   chunkschunkchunk_split
chunk_jsonmsgs              r0   r1   z%ClaudeStreamResponseItem.to_accesslogM   st   &,,V44 	I 	IE++g..K;!##KN$8$8$:$:;;J &!_44 +G #G^ < F#'<<<G!4V!<!BB F#66$.w$7$H!}(( (!*
4#8uMMM'/!.
 
 
 	
r7   Nr2   r6   r7   r0   rL   rL   L   s6        +
. +
^ +
 +
 +
 +
 +
 +
r7   rL   c                       e Zd ZdS )ClaudeErrorItemN)r3   r4   r5   r6   r7   r0   rb   rb   {   s        Cr7   rb   c                        e Zd Zddddeeeed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e         fdZdedef fdZdef fdZ xZS )ClaudeProxyNg      N@)api_keytimeoutrequest_filtersresponse_filtersrequest_item_classresponse_item_classstream_response_item_classerror_item_classre   rg   rh   ri   rj   rk   rl   access_logger_queuec       	   
          t                                          ||||||||	           || _        d| _        d| _        d| _        d S )N)rf   rg   rh   ri   rj   rk   rl   rm   zhttps://api.anthropic.comz/v1/messages	anthropic)super__init__re   api_base_urlapi_chat_resource_pathapi_service_id)r/   re   rf   rg   rh   ri   rj   rk   rl   rm   	__class__s             r0   rq   zClaudeProxy.__init__   se     	+-1 3'A- 3 	 		
 		
 		
 7&4#)r7   r   r   c                     d|dgddddS )Nr   r   r   r   r<   r=   )r   r;   r6   r/   r   s     r0   text_to_response_jsonz!ClaudeProxy.text_to_response_json   s*    !'667&'!<<
 
 	
r7   c                 n    ddddg dd d ddddd	d
dddddddiddd|dddddddd dddidddigS )NrQ   -rR   	assistantaiproxyr   rx   )idr   roler   r   stop_reasonstop_sequencer;   )r   rR   content_block_startr   rN   rw   )r   indexcontent_blockr   pingrS   
text_delta)r   r   rT   content_block_stop)r   r   rU   end_turn)r   r   r=   )r   rT   r;   message_stopr6   ry   s     r0   text_to_response_chunksz#ClaudeProxy.text_to_response_chunks   s    $YXcpr  ~G  X\  os  OP  cd  ~e  ~e  2f  2f  g  g*QRXbdIeIeffV*Q,`dAeAeff)A66$z\`/a/am|~  mA  B  B^$
 	
r7   fastapi_requestsessionc                    K   t                                          ||           d {V  |j                            d          du |_        d S )NstreamT)rp   parse_requestr#   r.   r   )r/   r   r   ru   s      r0   r   zClaudeProxy.parse_request   sT      gg##OW========= -11(;;tCr7   c                 h    t                                          |           | j        |j        d<   d S )Nz	x-api-key)rp   prepare_httpx_request_headersre   r-   )r/   r   ru   s     r0   r   z)ClaudeProxy.prepare_httpx_request_headers   s0    --g666/3|,,,r7   )r3   r4   r5   r   r9   rL   rb   strr   r   r   r   r   rq   r&   rz   r   r   r	   r   r   __classcell__)ru   s   @r0   rd   rd      s^        3759#4$6+C!0* * * *
 /0* 12* !* "* %)* * -* * * * * *:
# 
$ 
 
 
 
	
C 	
DJ 	
 	
 	
 	
D7 D[ D D D D D D<[ < < < < < < < < < <r7   rd   )r   r+   loggingtypingr   fastapir   aiproxy.proxyr   r   aiproxy.httpx_proxyr   r	   r
   r   r   r   aiproxy.accesslogr   aiproxy.queueclientr   	getLoggerr3   r(   r   r9   rL   rb   queue_item_typesrd   r6   r7   r0   <module>r      s                       ? ? ? ? ? ? ? ? [  [  [  [  [  [  [  [  [  [  [  [  [  [  [  [ , , , , , , / / / / / / 
	8	$	$
 
 
 
 
. 
 
 
:
 
 
 
 
0 
 
 
@,
 ,
 ,
 ,
 ,
9 ,
 ,
 ,
^    *    &'9;SUde 5< 5< 5< 5< 5<* 5< 5< 5< 5< 5<r7   