Ë
    uPêjo4  ã                   óÆ   — d Z ddlZddlmZ ddlmZ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mZmZmZ d	d
lmZmZmZ ddlmZ er
ddlZddlmZ  G d„ de«      Zy)z)
A2A Protocol Transformation for LiteLLM
é    N)ÚIterator)ÚTYPE_CHECKINGÚAnyÚFinal)ÚBaseModelResponseIterator)Ú
BaseConfigÚBaseLLMException)ÚAllMessageValues)ÚChoicesÚMessageÚModelResponseÚUsageé   )ÚA2AErrorÚconvert_messages_to_promptÚextract_text_from_a2a_responseé   ©ÚA2AModelResponseIterator)ÚLoggingc                   ó<  — e Zd ZdZedededz  dedz  deeef   dz  deeef   deedz  edz  eeef   dz  f   fd	„«       Z	dede
e   fd
„Zdededededef
d„Z	 	 d%dedede
e   dedededz  dedz  defd„Z	 d&dedz  dedz  dededededz  defd„Zdede
e   dedededefd„Z	 	 d%dedej&                  dedddede
e   dededddedz  dedz  defd„Z	 d'deez  dededz  defd„Zd eeef   deeef   fd!„Zd"ed#edeej6                  z  defd$„Zy)(Ú	A2AConfigzƒ
    Configuration for A2A (Agent-to-Agent) Protocol.

    Handles transformation between OpenAI and A2A JSON-RPC 2.0 formats.
    ÚmodelÚapi_baseNÚapi_keyÚheadersÚoptional_paramsÚreturnc                 óö  — d| v r| j                  dd«      d   nd}|r|�	|�|�|||fS 	 ddlm} |j                  |«      }|r¤|€'|j                  r|j                  j                  d«      }|j                  ro|€|j                  j                  d«      }|€|j                  j                  d«      }|r|}|j                  j                  «       D ]  \  }	}
|	d	vsŒ|	|vsŒ|
||	<   Œ |||fS # t        $ r Y Œw xY w)
aµ  
        Resolve agent configuration from registry if model format is "a2a/<agent-name>".

        Extracts agent name from model string and looks up configuration in the
        agent registry (if available in proxy context).

        Args:
            model: Model string (e.g., "a2a/my-agent")
            api_base: Explicit api_base (takes precedence over registry)
            api_key: Explicit api_key (takes precedence over registry)
            headers: Explicit headers (takes precedence over registry)
            optional_params: Dict to merge additional litellm_params into

        Returns:
            Tuple of (api_base, api_key, headers) with registry values filled in
        ú/r   Nr   )Úglobal_agent_registryÚurlr   r   )r   r   r   r   )	ÚsplitÚ,litellm.proxy.agent_endpoints.agent_registryr!   Úget_agent_by_nameÚagent_card_paramsÚgetÚlitellm_paramsÚitemsÚImportError)r   r   r   r   r   Ú
agent_namer!   ÚagentÚagent_headersÚkeyÚvalues              úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/a2a/chat/transformation.pyÚ"resolve_agent_config_from_registryz,A2AConfig.resolve_agent_config_from_registry$   s1  € ð2 7:¸U±l˜EŸK™K¨¨QÓ/°Ò2Èˆ
ñ ˜hÐ2°wÐ7JÈwÐObØ˜W gÐ-Ð-ð	õð 1×BÑBÀ:ÓNˆEÙàÐ#¨×(?Ò(?Ø$×6Ñ6×:Ñ:¸5ÓA�Hð ×'Ò'Ø�Ø"'×"6Ñ"6×":Ñ":¸9Ó"E˜à�Ø/4×/CÑ/C×/GÑ/GÈ	Ó/R˜Ù(Ø&3˜Gð ',×&:Ñ&:×&@Ñ&@Ó&Bò 9™
˜˜UØÐ&QÒQÐVYÐapÒVpØ38˜O¨CÒ0ð9ð ˜ 'Ð)Ð)øô ò 	Ùð	ús   ªB0C, ÃC, Ã C, Ã,	C8Ã7C8c                 ó
   — g d¢S )z*Return list of supported OpenAI parameters)ÚstreamÚtemperatureÚ
max_tokensÚtop_p© )Úselfr   s     r0   Úget_supported_openai_paramsz%A2AConfig.get_supported_openai_paramsb   s   € ò
ð 	
ó    Únon_default_paramsÚdrop_paramsc                 óV   — |j                  «       D ]  \  }}|dk(  sŒ|du sŒ||d<   Œ |S )zÂ
        Map OpenAI parameters to A2A parameters.

        For A2A protocol, we need to map the stream parameter so
        transform_request can determine which JSON-RPC method to use.
        r3   T)r)   )r8   r;   r   r   r<   Úparamr/   s          r0   Úmap_openai_paramszA2AConfig.map_openai_paramsk   s@   € ð /×4Ñ4Ó6ò 	2‰LˆE�5Ø˜Ó  U¨d¢]Ø,1� Ò)ð	2ð Ðr:   Úmessagesr(   c                 ó4   — d|vr	d|vrd|d<   |�d|› �|d<   |S )a©  
        Validate environment and set headers for A2A requests.

        Args:
            headers: Request headers dict
            model: Model name
            messages: Messages list
            optional_params: Optional parameters
            litellm_params: LiteLLM parameters
            api_key: API key (optional for A2A)
            api_base: API base URL

        Returns:
            Updated headers dict
        zcontent-typezContent-Typezapplication/jsonzBearer ÚAuthorizationr7   )r8   r   r   r@   r   r(   r   r   s           r0   Úvalidate_environmentzA2AConfig.validate_environment   s;   € ð4  Ñ(¨^À7Ñ-JØ&8ˆG�NÑ#ð ÐØ)0°°	Ð':ˆG�OÑ$àˆr:   r3   c                 ó>   — |€t        d«      ‚|j                  d«      S )aá  
        Get the complete A2A agent endpoint URL.

        A2A agents use JSON-RPC 2.0 at the base URL, not specific paths.
        The method (message/send or message/stream) is specified in the
        JSON-RPC request body, not in the URL.

        Args:
            api_base: Base URL of the A2A agent (e.g., "http://0.0.0.0:9999")
            api_key: API key (not used for URL construction)
            model: Model name (not used for A2A, agent determined by api_base)
            optional_params: Optional parameters
            litellm_params: LiteLLM parameters
            stream: Whether this is a streaming request (affects JSON-RPC method)

        Returns:
            Complete URL for the A2A endpoint (base URL)
        z%api_base is required for A2A providerr    )Ú
ValueErrorÚrstrip)r8   r   r   r   r   r(   r3   s          r0   Úget_complete_urlzA2AConfig.get_complete_url¢   s'   € ð6 ÐÜÐDÓEÐEð �‰˜sÓ#Ð#r:   c                 óü   — t        t        j                  «       «      }|st        d«      ‚t	        |«      }dd|dœgt        t        j                  «       «      dœ}|j                  dd«      }	|	rdnd	}
d
||
d|idœ}|S )ab  
        Transform OpenAI request to A2A JSON-RPC 2.0 format.

        Args:
            model: Model name
            messages: List of OpenAI messages
            optional_params: Optional parameters
            litellm_params: LiteLLM parameters
            headers: Request headers

        Returns:
            A2A JSON-RPC 2.0 request dict
        z3At least one message is required for A2A completionÚuserÚtext©ÚkindrJ   ©ÚroleÚpartsÚ	messageIdr3   Fzmessage/streamzmessage/sendz2.0Úmessage)ÚjsonrpcÚidÚmethodÚparams)ÚstrÚuuidÚuuid4rE   r   r'   )r8   r   r@   r   r(   r   Ú
request_idÚfull_contextÚa2a_messager3   rT   Úrequest_datas               r0   Útransform_requestzA2AConfig.transform_requestÄ   s”   € ô,  ¤§
¡
£Ó-ˆ
áÜÐRÓSÐSô 9¸ÓBˆð Ø%¨|Ñ<Ð=ÜœTŸZ™Z›\Ó*ñ
ˆð (×+Ñ+¨H°eÓ<ˆÙ,2Ñ(¸ˆð ØØØ  +Ð.ñ	
ˆð Ðr:   Úraw_responseÚmodel_responseÚlogging_objÚLiteLLMLoggingObjr\   Úencodingztiktoken.Encoding | NoneÚ	json_modec           
      óŠ  — 	 |j                  «       }d|v rC|d   }t        |j                  d|j                  dd«      › �t	        |j
                  «      ¬«      ‚t        |«      }t        dd	t        |d
¬«      ¬«      g|_
        ||_        |j                  dt        t        j                  «       «      «      |_        	 d	dlm}  |d|¬«      } |d|d¬«      }t%        |dt'        ||||z   ¬«      «       |S # t        $ r3}t        |j                  d|› �t	        |j
                  «      ¬«      ‚d}~ww xY w# t        $ r Y |S w xY w)ao  
        Transform A2A JSON-RPC 2.0 response to OpenAI format.

        Args:
            model: Model name
            raw_response: HTTP response from A2A agent
            model_response: Model response object to populate
            logging_obj: Logging object
            request_data: Original request data
            messages: Original messages
            optional_params: Optional parameters
            litellm_params: LiteLLM parameters
            encoding: Encoding object
            api_key: API key
            json_mode: JSON mode flag

        Returns:
            Populated ModelResponse object
        zFailed to parse A2A response: ©Ústatus_coderQ   r   NÚerrorzA2A error: rQ   zUnknown errorÚstopr   Ú	assistant)ÚcontentrN   )Úfinish_reasonÚindexrQ   rS   )Útoken_counterzgpt-3.5-turbo)r   r@   T)r   rJ   Úcount_response_tokensÚusage)Úprompt_tokensÚcompletion_tokensÚtotal_tokens)ÚjsonÚ	Exceptionr   rf   Údictr   r'   r   r   r   Úchoicesr   rV   rW   rX   rS   Úlitellm.utilsrm   Úsetattrr   )r8   r   r^   r_   r`   r\   r@   r   r(   rb   r   rc   Úresponse_jsonÚerg   rJ   rm   rp   rq   s                      r0   Útransform_responsezA2AConfig.transform_responseù   sr  € ðB	Ø#/×#4Ñ#4Ó#6ˆMð �mÑ#Ø(¨Ñ1ˆEÜØ(×4Ñ4Ø% e§i¡i°	¸?Ó&KÐ%LÐMÜ˜\×1Ñ1Ó2ôð ô 5°]ÓCˆô Ø$ØÜØ Ø$ôôð	"
ˆÔð  %ˆÔð *×-Ñ-¨d´C¼¿
¹
»Ó4EÓFˆÔð	Ý3á#0°ÐQYÔ#ZˆMÙ'4¸?ÐQUÐmqÔ'rÐÜØØÜØ"/Ø&7Ø!.Ð1BÑ!Bôôð Ðøôq ò 	ÜØ(×4Ñ4Ø8¸¸Ð<Ü˜\×1Ñ1Ó2ôð ûð	ûôj ò 	ØàÐð	ús)   ‚C6 Â=7D5 Ã6	D2Ã?.D-Ä-D2Ä5	EÅEÚstreaming_responseÚsync_streamc                 ó   — t        |||¬«      S )a  
        Get streaming iterator for A2A responses.

        Args:
            streaming_response: Streaming response iterator
            sync_stream: Whether this is a sync stream
            json_mode: JSON mode flag

        Returns:
            A2A streaming iterator
        )r|   r}   rc   r   )r8   r|   r}   rc   s       r0   Úget_model_response_iteratorz%A2AConfig.get_model_response_iteratorV  s   € ô" (Ø1Ø#Øô
ð 	
r:   rQ   c                 ó¦   — |j                  dd«      }|j                  dd«      }|dt        |«      dœgt        t        j                  «       «      dœS )z¦
        Convert OpenAI message to A2A message format.

        Args:
            message: OpenAI message dict

        Returns:
            A2A message dict
        rj   Ú rN   rI   rJ   rK   rM   )r'   rV   rW   rX   )r8   rQ   rj   rN   s       r0   Ú_openai_message_to_a2a_messagez(A2AConfig._openai_message_to_a2a_messagem  sP   € ð !Ÿ™ Y°Ó3ˆØ—k‘k &¨&Ó1ˆð Ø%¬s°7«|Ñ<Ð=ÜœTŸZ™Z›\Ó*ñ
ð 	
r:   Úerror_messagerf   c                 ól   — t        |t        j                  «      rt        |«      n|}t	        |||¬«      S )z-Return appropriate error class for A2A errorsre   )Ú
isinstanceÚhttpxÚHeadersru   r   )r8   rƒ   rf   r   Úheaders_dicts        r0   Úget_error_classzA2AConfig.get_error_class€  s3   € ô 0:¸'Ä5Ç=Á=Ô/Qœd 7œmÐW^ˆÜØ#Ø!Ø ô
ð 	
r:   )NN)N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstaticmethodrV   ru   r   Útupler1   Úlistr9   Úboolr?   r
   rC   rG   r]   r†   ÚResponser   r{   r   r   r   r‚   Úintr‡   r	   r‰   r7   r:   r0   r   r      s  „ ñð ð;*Øð;*à˜‘*ð;*ð �t‘ð;*ð �c˜3�h‘ $Ñ&ð	;*ð
 ˜c 3˜h™ð;*ð 
ˆs�T‰z˜3 ™: t¨C°¨H¡~¸Ñ'<Ð<Ñ	=ò;*ó ð;*ðz
°ð 
¸¸c¹ó 
ðà ðð ðð ð	ð
 ðð 
óð6 #Ø#ñ!àð!ð ð!ð Ð'Ñ(ð	!ð
 ð!ð ð!ð �t‘ð!ð ˜‘*ð!ð 
ó!ðT #ñ $à˜‘*ð $ð �t‘ð $ð ð	 $ð
 ð $ð ð $ð �t‘ð $ð 
ó $ðD3àð3ð Ð'Ñ(ð3ð ð	3ð
 ð3ð ð3ð 
ó3ð@ #Ø!%ñ[àð[ð —n‘nð[ð &ð	[ð
 )ð[ð ð[ð Ð'Ñ(ð[ð ð[ð ð[ð -ð[ð �t‘ð[ð ˜$‘;ð[ð 
ó[ðB "'ñ	
à$ s™Nð
ð ð
ð ˜$‘;ð	
ð
 
#ó
ð.
°d¸3À¸8±nð 
ÈÈcÐSVÈhÉó 
ð&
¨Sð 
¸sð 
ÈTÐTY×TaÑTaÑMað 
Ðfvô 
r:   r   ) r�   rW   Úcollections.abcr   Útypingr   r   r   r†   Ú)litellm.llms.base_llm.base_model_iteratorr   Ú)litellm.llms.base_llm.chat.transformationr   r	   Úlitellm.types.llms.openair
   Úlitellm.types.utilsr   r   r   r   Úcommon_utilsr   r   r   Ústreaming_iteratorr   ÚtiktokenÚ*litellm.litellm_core_utils.litellm_loggingr   ra   r   r7   r:   r0   ú<module>rž      sP   ðñó Ý $ß ,Ñ ,ã å Oß RÝ 6ß FÓ F÷ñ õ
 9áÛåWôk
�
õ k
r:   