o
    ưi                     @   s   d Z ddlmZmZmZmZmZmZ ddlZddl	m
Z
 er&ddlmZmZ G dd dZded	efd
dZdeeef d	efddZdS )z%
Utility functions for A2A protocol.
    )TYPE_CHECKINGAnyDictListTupleUnionN)verbose_logger)SendMessageRequestSendStreamingMessageRequestc                
   @   s   e Zd ZdZededefddZedeeef defddZ	ed	d
defddZ
ededefddZed	d
deeef deeeef fddZdS )A2ARequestUtilsz2Utility class for A2A request/response processing.messagereturnc                 C   s   | du rdS t | tr| dg }nt| dg pg }g }|D ])}t |tr6|ddkr5||dd qt|dddkrG|t|dd qd|S )z
        Extract text content from A2A message parts.

        Args:
            message: A2A message dict or object with 'parts' containing text parts

        Returns:
            Concatenated text from all text parts
        N partskindtext )
isinstancedictgetgetattrappendjoin)r   r   Z
text_partspart r   Q/home/app/Keep/.python/lib/python3.10/site-packages/litellm/a2a_protocol/utils.pyextract_text_from_message   s   


z)A2ARequestUtils.extract_text_from_messageresponse_dictc                 C   s0   |  di }t|tsdS | di }t|S )z
        Extract text content from A2A response result.

        Args:
            response_dict: A2A response dict with 'result' containing message

        Returns:
            Text from response message parts
        resultr   r   )r   r   r   r   r   )r   r   r   r   r   r   extract_text_from_response0   s
   

z*A2ARequestUtils.extract_text_from_responserequestz6Union[SendMessageRequest, SendStreamingMessageRequest]c                 C   s$   t | dd}|du rdS t |ddS )z
        Extract the input message from an A2A request.

        Args:
            request: The A2A SendMessageRequest or SendStreamingMessageRequest

        Returns:
            The message object/dict or None
        paramsNr   )r   )r    r!   r   r   r   get_input_message_from_requestB   s   z.A2ARequestUtils.get_input_message_from_requestr   c                 C   s6   | sdS zt j| dW S  ty   td Y dS w )z
        Count tokens in text using litellm.token_counter.

        Args:
            text: Text to count tokens for

        Returns:
            Token count, or 0 if counting fails
        r   r   zFailed to count tokens)litellmZtoken_counter	Exceptionr   debugr#   r   r   r   count_tokensT   s   
zA2ARequestUtils.count_tokensc                 C   sD   t | }t |}t |}t |}t |}|| }|||fS )a2  
        Calculate token usage from A2A request and response.

        Args:
            request: The A2A SendMessageRequest or SendStreamingMessageRequest
            response_dict: The A2A response as a dict

        Returns:
            Tuple of (prompt_tokens, completion_tokens, total_tokens)
        )r   r"   r   r'   r   )r    r   Zinput_messageZ
input_textZprompt_tokensZoutput_textZcompletion_tokensZtotal_tokensr   r   r   %calculate_usage_from_request_responseg   s   





z5A2ARequestUtils.calculate_usage_from_request_responseN)__name__
__module____qualname____doc__staticmethodr   strr   r   r   r"   intr'   r   r(   r   r   r   r   r      s,    
r   r   r   c                 C   
   t | S N)r   r   )r   r   r   r   extract_text_from_a2a_message      
r2   r   c                 C   r0   r1   )r   r   )r   r   r   r   extract_text_from_a2a_response   r3   r4   )r,   typingr   r   r   r   r   r   r$   Zlitellm._loggingr   Z	a2a.typesr	   r
   r   r.   r2   r4   r   r   r   r   <module>   s     w