
    jKj6                        d Z ddlZddlmZmZmZmZmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZ dedee   fdZ	 dd	eeeef      d
ee   dee   fdZdeeef   dee   fdZdee   dee	   fdZdedefdZdedee   fdZdedefdZdedefdZdedeee   ee   f   fdZdedee   dee   fdZdedee   deeef   ddfdZdedee   deeef   ddfdZdeeef   defdZ dee   dedee   fdZ!y)z
Anthropic-specific conversion utilities.

This module handles the conversion of Anthropic API responses and inputs
into standardized formats for PostHog tracking.
    N)AnyDictListOptionalTuple)FormattedContentItemFormattedFunctionCallFormattedMessageFormattedTextContentStreamingContentBlock
TokenUsageToolInProgress)serialize_raw_usageresponsereturnc           	         g }| |S g }t        | d      r| j                  D ]  }t        |d      rH|j                  dk(  r9t        |d      r-|j                  r!d|j                  d}|j	                  |       Wt        |d      sd|j                  dk(  stt        |d      st        |d      sd|j
                  |j                  t        |d	i       d
d}|j	                  |        |rd|d}|j	                  |       |S )z
    Format an Anthropic response into standardized message format.

    Args:
        response: The response object from Anthropic API

    Returns:
        List of formatted messages with role and content
    contenttypetextr   r   tool_usenameidfunctioninputr   	argumentsr   r   r   	assistantroler   )hasattrr   r   r   appendr   r   getattr)r   outputr   choicetext_contentfunction_callmessages          y/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/ai/anthropic/anthropic_converter.pyformat_anthropic_responser+      s    &(F*,G x#&&F'KK6)FF+KK #"KK6 |, 'KK:-FF+FD) ' )) &%,VWb%A!8 }-7 ': %
 	gM    messagessystemc                     g }||j                  d|d       | r=| D ]8  }|j                  dd      |j                  dd      d}|j                  |       : |S )z
    Format Anthropic input messages with optional system prompt.

    Args:
        messages: List of message dictionaries
        system: Optional system prompt to prepend

    Returns:
        List of formatted messages
    r.   r    r!   userr    )r#   get)r-   r.   formatted_messagesmsgformatted_msgs        r*   format_anthropic_inputr6   R   sq     24 !!8"GH C /779b1/M %%m4  r,   kwargsc                 &    | j                  dd      S )z
    Extract tool definitions from Anthropic API kwargs.

    Args:
        kwargs: Keyword arguments passed to Anthropic API

    Returns:
        Tool definitions if present, None otherwise
    toolsN)r2   )r7   s    r*   extract_anthropic_toolsr:   s   s     ::gt$$r,   content_blocksc                 (   g }| D ]  }|j                  d      dk(  r(|j                  d|j                  d      xs dd       ?|j                  d      dk(  sT|j                  d|j                  d      |j                  d      xs i d        |S )a  
    Format content blocks from Anthropic streaming response.

    Used by streaming handlers to format accumulated content blocks.

    Args:
        content_blocks: List of content block dictionaries from streaming

    Returns:
        List of formatted content items
    r   r   r1   r   r   r   r   )r2   r#   )r;   	formattedblocks      r*   "format_anthropic_streaming_contentr?      s     -/I99V&"!IIf-3 YYv*,&))D/ %		* 5 ;  $ r,   c           
          t        | d      syt        | j                  d      sy| j                  j                  }t        |d      r t        dt	        t        |dd                  S y)a  
    Extract web search count from Anthropic response.

    Anthropic provides exact web search counts via usage.server_tool_use.web_search_requests.

    Args:
        response: The response from Anthropic API

    Returns:
        Number of web search requests (0 if none)
    usager   server_tool_useweb_search_requests)r"   rA   rB   maxintr$   )r   rB   s     r*   "extract_anthropic_web_search_countrF      s\     8W%8>>#45nn44O 561c'/3H!LMNNr,   c                     t        | dd      S )z,Extract stop reason from Anthropic response.stop_reasonN)r$   )r   s    r*   extract_anthropic_stop_reasonrI      s    8]D11r,   c                    t        | d      st        dd      S t        t        | j                  dd      t        | j                  dd            }t        | j                  d      r"| j                  j                  }|r
|dkD  r||d<   t        | j                  d      r"| j                  j
                  }|r
|dkD  r||d<   t        |       }|dkD  r||d<   t        | j                        }|r||d	<   |S )
z
    Extract usage from a full Anthropic response (non-streaming).

    Args:
        response: The complete response from Anthropic API

    Returns:
        TokenUsage with standardized usage
    rA   r   )input_tokensoutput_tokensrK   rL   cache_read_input_tokenscache_creation_input_tokensweb_search_count	raw_usage)r"   r   r$   rA   rM   rN   rF   r   )r   result
cache_readcache_creationrO   
serializeds         r*   %extract_anthropic_usage_from_responserU      s     8W%q::X^^^Q?hnnoqAF
 x~~89^^;;
*q.0:F,-x~~<=!CCnq04BF019(C!%5!" %X^^4J({Mr,   eventc                    t               }t        | d      r| j                  dk(  rt        | d      rt        | j                  d      rt	        | j                  j
                  dd      |d<   t	        | j                  j
                  dd      |d<   t	        | j                  j
                  dd      |d<   t        | j                  j
                        }|r||d	<   t        | d      r| j
                  rt	        | j
                  d
d      |d
<   t        | j
                  d      rB| j
                  j                  }t        |d      r t        t	        |dd            }|dkD  r||d<   t        | j
                        }|r||d	<   |S )z
    Extract usage statistics from an Anthropic streaming event.

    Args:
        event: Streaming event from Anthropic API

    Returns:
        Dictionary of usage statistics
    r   message_startr)   rA   rK   r   rN   rM   rP   rL   rB   rC   rO   )	r   r"   r   r)   r$   rA   r   rB   rE   )rV   rA   rT   rB   rO   s        r*   "extract_anthropic_usage_from_eventrY      sc    #E uf%**"?5)$)H$+EMM,?,?QR$SE.!3:##%BA4E/0 07##%>0E+,
 -U]]-@-@AJ%/k" ug5;;!(oq!Io 5;; 12#kk99O(=>#&O-BAF$  $a'0@E,- )5
!+E+Lr,   c                 &   t        | d      r| j                  dk(  syt        | d      sy| j                  }t        |d      sy|j                  dk(  r	ddd}|dfS |j                  d	k(  r(d
t        |dd      t        |dd      i dd}|dd}||fS y)z
    Handle content block start event from Anthropic streaming.

    Args:
        event: Content block start event

    Returns:
        Tuple of (content_block, tool_in_progress)
    r   content_block_start)NNcontent_blockr   r1   r   Nr   r   r   r   r   r   )r>   input_string)r"   r   r\   r$   )rV   r>   r\   
tool_blocktool_in_progresss        r*   $handle_anthropic_content_block_startr`   #  s     E6"uzz5J'J5/*E5&!zzV8>/Kd""	z	!%r*!(!;"M-


 6@QS+T+++r,   current_blockc                     t        | d      rjt        | j                  d      rT| j                  j                  xs d}|6|j                  d      dk(  r"|j                  d      }|
||z   |d<   |S ||d<   |S y)z
    Handle text delta event from Anthropic streaming.

    Args:
        event: Delta event
        current_block: Current text block being accumulated

    Returns:
        Text delta if present
    deltar   r1   Nr   )r"   rc   r   r2   )rV   ra   
delta_texttext_vals       r*   handle_anthropic_text_deltarf   K  s     ug75;;#?[[%%+
$):):6)Bf)L$((0H#(0:(=f%  )3f%r,   tools_in_progressc                    t        | d      r| j                  dk(  syt        | d      r/t        | j                  d      r| j                  j                  dk(  syt        | d      r~| j                  t	        |      k  re|| j                     }|j                  d      dk(  rA|j                  d      |v r-||d      }t        | j                  d	d
      }|dxx   |z  cc<   yyyyy)z
    Handle tool input delta event from Anthropic streaming.

    Args:
        event: Tool delta event
        content_blocks: List of content blocks
        tools_in_progress: Dictionary tracking tools being accumulated
    r   content_block_deltaNrc   input_json_deltaindexr   r   partial_jsonr1   r]   )r"   r   rc   rk   lenr2   r$   )rV   r;   rg   r>   toolrl   s         r*   handle_anthropic_tool_deltaro   h  s     E6"uzz5J'J 	wEKK(KK 22ug5;;^1D#Du{{+99V
*uyyBS/S$U4[1D"5;;CL L0  0T* $Er,   c                    t        | d      r| j                  dk(  syt        | d      r| j                  t        |      k  rf|| j                     }|j	                  d      dk(  rB|j	                  d      |v r.||d      }	 t        j                  |d         |d   d<   ||d   = yyyyy# t
        j                  t        f$ r Y &w xY w)	z
    Finalize tool input when content block stops.

    Args:
        event: Content block stop event
        content_blocks: List of content blocks
        tools_in_progress: Dictionary tracking tools being accumulated
    r   content_block_stopNrk   r   r   r]   r   )	r"   r   rk   rm   r2   jsonloadsJSONDecodeError	Exception)rV   r;   rg   r>   rn   s        r*   finalize_anthropic_tool_inputrv     s     E6"uzz5I'Iug5;;^1D#Du{{+99V
*uyyBS/S$U4[1D15D<P1Qj!+.
 "%+. 0T* $E (()4 s    B) )CCc                      ddl m}  || d      S )z
    Format Anthropic streaming input using system prompt merging.

    Args:
        kwargs: Keyword arguments passed to Anthropic API

    Returns:
        Formatted input ready for PostHog tracking
    r   )merge_system_prompt	anthropic)posthog.ai.utilsrx   )r7   rx   s     r*    format_anthropic_streaming_inputr{     s     5v{33r,   accumulated_contentc                 <    t        |       }|rd|dgS dd|dgdgS )aw  
    Format complete Anthropic streaming output.

    Combines existing logic for formatting content blocks with fallback to accumulated content.

    Args:
        content_blocks: List of content blocks accumulated during streaming
        accumulated_content: Raw accumulated text content as fallback

    Returns:
        Formatted messages ready for PostHog tracking
    r   r    r   r   )r?   )r;   r|   formatted_contents      r*   *format_anthropic_streaming_output_completer     sA     ;>J$1BCDD
 $%+5HIJ
 	
r,   )N)"__doc__rr   typingr   r   r   r   r   posthog.ai.typesr   r	   r
   r   r   r   r   rz   r   r+   strr6   r:   r?   rE   rF   rI   rU   rY   r`   rf   ro   rv   r{   r    r,   r*   <module>r      s    3 3   18 85E0F 8x =A4S>",4SM	
B%DcN %x} %#./#	
#L  42C 2HSM 2
&C &J &R1c 1j 1h%%
8)*H^,DDE%P'(=>c]:11./1 C/01 
	1B//.// C/0/ 
	/@4T#s(^ 4 4
./
FI
	

r,   