
    AHj                         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      Zded	efd
Zdeeef   d	efdZy)z%
Utility functions for A2A protocol.
    )TYPE_CHECKINGAnyDictListTupleUnionN)verbose_logger)SendMessageRequestSendStreamingMessageRequestc            
           e Zd ZdZededefd       Zedeeef   defd       Z	edddefd	       Z
ed
edefd       Zedddeeef   deeeef   fd       Zy)A2ARequestUtilsz2Utility class for A2A request/response processing.messagereturnc                    | yt        | t              r| j                  dg       }nt        | dg       xs g }g }|D ]v  }t        |t              r7|j                  d      dk(  s(|j	                  |j                  dd             Jt        |dd      dk(  s[|j	                  t        |dd             x dj                  |      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   
text_partsparts       R/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/a2a_protocol/utils.pyextract_text_from_messagez)A2ARequestUtils.extract_text_from_message   s     ? gt$KK,EGWb17RE "
 	AD$%88F#v-%%dhhvr&:;4.&8%%gdFB&?@	A xx
##    response_dictc                     | j                  di       }t        |t              sy|j                  di       }t        j	                  |      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   s      r   extract_text_from_responsez*A2ARequestUtils.extract_text_from_response0   sD     ""8R0&$'**Y+88AAr    requestz6Union[SendMessageRequest, SendStreamingMessageRequest]c                 <    t        | dd      }|y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'   s     r   get_input_message_from_requestz.A2ARequestUtils.get_input_message_from_requestB   s)     (D1>vy$//r    r   c                 ~    | sy	 t        j                  |       S # t        $ r t        j                  d       Y yw xY 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)litellmtoken_counter	Exceptionr	   debugr*   s    r   count_tokenszA2ARequestUtils.count_tokensT   sA     	((d33 	  !9:	s    <<c                     t         j                  |       }t         j                  |      }t         j                  |      }t         j	                  |      }t         j                  |      }||z   }|||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!   input_message
input_textprompt_tokensoutput_textcompletion_tokenstotal_tokenss           r   %calculate_usage_from_request_responsez5A2ARequestUtils.calculate_usage_from_request_responseg   sp      (FFwO$>>}M
'44Z@ &@@O+88E$'88/==r    N)__name__
__module____qualname____doc__staticmethodr   strr   r   r$   r(   intr/   r   r7    r    r   r   r      s    <$3 $3 $ $< B$sCx. BS B B" 0I0	0 0" 3 3  $ >I>CH~> 
sC}	> >r    r   r   r   c                 ,    t         j                  |       S N)r   r   )r   s    r   extract_text_from_a2a_messagerB      s    44W==r    r!   c                 ,    t         j                  |       S rA   )r   r$   )r!   s    r   extract_text_from_a2a_responserD      s    55mDDr    )r;   typingr   r   r   r   r   r   r+   litellm._loggingr	   	a2a.typesr
   r   r   r=   rB   rD   r?   r    r   <module>rH      s]    @ ?  +Is> s>n>3 >3 >E$sCx. ES Er    