Ë
    uPêjU}  ã                   óÊ  — U d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	 ddl
mZmZmZmZmZ ddlZddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlm Z  ddl!m"Z" er,ddl#m$Z% ddl#m&Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m+Z2 ddl1m3Z4 dZ5dZ6e	dz  e7d<   	 ddl#m$Z$m&Z&m8Z8m9Z9 ddl:m;Z6 ddl(m*Z*m+Z+m,Z,m<Z<m-Z-m.Z.m0Z0 dZ5ddl>m?Z?m@Z@mAZA ddlBmCZCmDZD ddlEmFZF e?ZGee7d<   deeHeIf   deJdeJd dfd!„ZKdeeHeIf   d"eHdz  d dfd#„ZLd$ZMee7d%<   deeHeIf   d&eeHeIf   d dfd'„ZNd(d)deeHeIf   d eHfd*„ZOd(d)d ed+   fd,„ZP	 dQd-d.d/eId0eHdz  d&eQeHeIf   d1eQeHeHf   dz  d e fd2„ZRd(d)d ed3   fd4„ZSdRd5„ZTd6d7d8eHeJz  d d9fd:„ZUdSd<„ZVd(d)d-d.d=ed+   d>eHdz  d0eHdz  d?eHdz  d d;fd@„ZWd(d)d-dAd edB   fdC„ZXd(d)d-dAd=ed+   d>eHdz  d0eHdz  d?eHdz  d edB   fdD„ZYe"	 	 	 	 	 	 dTd(ed)   d-ed.   d0eHdz  d&eQeHeIf   dz  d"eHdz  d1eQeHeHf   dz  deId e fdE„«       ZZe"d(d)d-d.ded e eeIeIe f   z  fdF„«       Z[d-dAd?eHd"eHdz  d&eQeHeIf   dz  dGeQeHeIf   dz  dHeQeHeIf   dz  d efdI„Z\	 	 	 	 	 	 	 	 dUd(ed)   d-edA   d0eHdz  d&eQeHeIf   dz  d"eHdz  dGeQeHeIf   dz  dHeQeHeIf   dz  d1eQeHeHf   dz  deId ee   fdJ„Z]eddfdKeHdLe^dMeQeHeHf   dz  dNe_d d)f
dO„Z`edfdKeHdLe^dMeQeHeHf   dz  d d+fdP„Zay# e=$ r dZ$dZ&dZ8dZ9Y �Œw xY w)Vzs
LiteLLM A2A SDK functions.

Provides standalone functions with @client decorator for LiteLLM logging integration.
é    N)ÚAsyncIteratorÚ	CoroutineÚMapping)Ú
ModuleType)ÚTYPE_CHECKINGÚAnyÚFinalÚOptionalÚcast)Úverbose_loggerÚverbose_proxy_logger)ÚA2AStreamingIterator)ÚA2ARequestUtils)ÚDEFAULT_A2A_AGENT_TIMEOUT)ÚLogging)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚLiteLLMSendMessageResponse)Úclient)ÚClient)ÚClientCallContext)Ú	AgentCardÚMessageÚSendMessageRequestÚSendMessageResponseÚSendStreamingMessageRequestÚSendStreamingMessageResponseÚ#SendStreamingMessageSuccessResponseÚTask)r   )ÚStreamResponseFÚ_a2a_conversions)r   r   ÚClientConfigÚcreate_client©Úconversions)r   r   r   ÚSendMessageSuccessResponser   r   r   T)ÚLiteLLMA2ACardResolverÚget_agent_card_urlÚnormalize_agent_card_interfaces)Úhandle_a2a_localhost_retryÚmap_a2a_exception)ÚA2ALocalhostURLErrorÚA2ACardResolverÚkwargsÚprompt_tokensÚcompletion_tokensÚreturnc                 óœ   — | j                  d«      }t        |t        «      r+t        j                  ||||z   ¬«      }||j
                  d<   yy)zó
    Set usage on litellm_logging_obj for standard logging payload.

    Args:
        kwargs: The kwargs dict containing litellm_logging_obj
        prompt_tokens: Number of input tokens
        completion_tokens: Number of output tokens
    Úlitellm_logging_obj)r/   r0   Útotal_tokensÚusageN)ÚgetÚ
isinstancer   ÚlitellmÚUsageÚmodel_call_details)r.   r/   r0   r3   r5   s        ú^/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/a2a_protocol/main.pyÚ_set_usage_on_logging_objr<   X   sU   € ð "(§¡Ð,AÓ!BÐÜÐ%¤wÔ/Ü—}‘}Ø'Ø/Ø&Ð):Ñ:ô
ˆð
 ;@Ð×.Ñ.¨wÒ7ð 0ó    Úagent_idc                 ól   — |€y| j                  d«      }t        |t        «      r||j                  d<   yy)z²
    Set agent_id on litellm_logging_obj for SpendLogs tracking.

    Args:
        kwargs: The kwargs dict containing litellm_logging_obj
        agent_id: The A2A agent ID
    Nr3   r>   )r6   r7   r   r:   )r.   r>   r3   s      r;   Ú_set_agent_id_on_logging_objr@   o   s>   € ð ÐØà!'§¡Ð,AÓ!BÐÜÐ%¤wÔ/à=EÐ×.Ñ.¨zÒ:ð 0r=   )Úcost_per_queryÚinput_cost_per_tokenÚoutput_cost_per_tokenÚ_A2A_COST_PARAM_KEYSÚlitellm_paramsc                 ó
  — | j                  d«      }t        |t        «      syt        D �ci c]  }|j                  |«      €Œ|||   “Œ }}|syi |j                  j                  d«      xs i ¥|¥|j                  d<   yc c}w )a]  
    Merge the agent's pricing params into model_call_details["litellm_params"]
    so A2ACostCalculator can read them.

    The non-streaming path reuses the proxy-built logging object, whose
    litellm_params already carries metadata / proxy_server_request / user-key
    context, so merge the pricing keys in rather than replacing the dict.
    r3   NrE   )r6   r7   r   rD   r:   )r.   rE   Úlogging_objÚkeyÚcost_paramss        r;   Ú"_set_litellm_params_on_logging_objrJ   †   sŸ   € ð  Ÿ™Ð$9Ó:€KÜ�k¤7Ô+Øô -AöØ%(ÀN×DVÑDVÐWZÓD[ÑDgˆˆ^˜CÑ Ñ ð€Kð ñ Øð8Ø×)Ñ)×-Ñ-Ð.>Ó?ÒEÀ2ð8à
ð8€K×"Ñ"Ð#3Ò4ùòs   «B ÁB Ú
a2a_clientÚA2AClientTypec                 óî   — d}t        | «      }|�t        |dd«      xs d}d|› �}d}|j                  d«      }t        |t        «      r,||_        ||_        ||j                  d<   ||j                  d<   |S )z·
    Extract agent info and set model/custom_llm_provider for cost tracking.

    Sets model info on the litellm_logging_obj if available.
    Returns the agent name for logging.
    ÚunknownÚnameú
a2a_agent/Ú	a2a_agentr3   ÚmodelÚcustom_llm_provider)Ú_get_a2a_client_agent_cardÚgetattrr6   r7   r   rR   rS   r:   )rK   r.   Ú
agent_nameÚ
agent_cardrR   rS   r3   s          r;   Ú_get_a2a_model_inforX   ¢   s˜   € ð €Jä2°:Ó>€JàÐÜ˜Z¨°Ó;ÒH¸yˆ
ð   
˜|Ð,€EØ!,Ðð "(§¡Ð,AÓ!BÐÜÐ%¤wÔ/Ø$)ÐÔ!Ø2EÐÔ/Ø:?Ð×.Ñ.¨wÑ7ØH[Ð×.Ñ.Ð/DÑEàÐr=   r   c                 óÆ   — t        t        d   t        | dd «      «      }|�|S t        t        d   t        | dd «      «      }|�|S t        t        d   t        | dd «      «      S )Nr   Ú_litellm_agent_cardrW   Ú_card)r   r
   rU   )rK   rW   s     r;   rT   rT   ¿   sk   € Ü”h˜{Ñ+¬W°ZÐAVÐX\Ó-]Ó^€JØÐØÐÜ”h˜{Ñ+¬W°ZÀÈtÓ-TÓU€JØÐØÐÜ”˜Ñ%¤w¨z¸7ÀDÓ'IÓJÐJr=   Úrequestr   rS   Úapi_baseÚagent_extra_headersc              ƒ   óŒ  K  — t        j                  d||«       ddlm} t	        | j
                  d«      r| j
                  j                  d¬«      nt        | j
                  «      }|j                  t        | j                  «      ||||¬«      ƒ d{  –—† }t        j                  |t        | j                  «      ¬	«      S 7 Œ.­w)
zÄ
    Route a send_message through the LiteLLM completion bridge (e.g. LangGraph, Bedrock AgentCore).

    Requires request; api_base is optional for providers that derive endpoint from model.
    z5A2A using completion bridge: provider=%s, api_base=%sr   ©ÚA2ACompletionBridgeHandlerÚ
model_dumpÚjson©Úmode©Ú
request_idÚparamsrE   r]   r^   N©rg   )r   ÚinfoÚ6litellm.a2a_protocol.litellm_completion_bridge.handlerra   Úhasattrrh   rb   ÚdictÚhandle_non_streamingÚstrÚidr   Ú	from_dict)r\   rS   r]   rE   r^   ra   rh   Úresponse_dicts           r;   Ú#_send_message_via_completion_bridgers   É   s«   è ø€ ô ×ÑÐOÐQdÐfnÔoõô 8?¸w¿~¹~È|Ô7\ˆW�^‰^×&Ñ&¨FÐ&Ô3ÔbfÐgn×guÑguÓbv€Fà!;×!PÑ!PÜ�w—z‘z“?ØØ%ØØ/ð "Qó "÷ €Mô &×/Ñ/°Ì#ÈgÏjÉjË/ÔZÐZðús   ‚BCÂCÂ/CÚA2ACallContextTypec                 ó   — t        | dd «      S )NÚ_litellm_call_context)rU   )rK   s    r;   Ú_get_a2a_call_contextrw   è   s   € Ü�:Ð6¸Ó=Ð=r=   c                 ó0   — ddl m} |j                  | «      S )Nr   r$   )Úa2a.compat.v0_3r%   Úto_core_send_message_request)r\   r%   s     r;   Ú_to_core_send_message_requestr{   ì   s   € Ý+à×3Ñ3°GÓ<Ð<r=   ÚeventÚCoreStreamResponserg   r   c                 ó4   — ddl m} |j                  | |¬«      S )Nr   r$   ri   )ry   r%   Úto_compat_stream_response)r|   rg   r%   s      r;   Ú_to_compat_stream_responser€   ò   s   € õ ,à×0Ñ0°À:Ð0ÓNÐNr=   r   c              ƒ   ó€  K  — t         €t        d«      ‚t        |«      }d}| j                  |t	        | «      ¬«      2 3 d{  –—† }|}Œ7 Œ6 |€t        d«      ‚t        ||j                  ¬«      }|j                  }t        |t        t        f«      st        d«      ‚t        t        |j                  |¬«      ¬«      S ­w)	zJSend a non-streaming message via a2a-sdk 1.x and return JSON-RPC response.Nú\The 'a2a' package is required for A2A agent invocation. Install it with: pip install a2a-sdk©Úcontextz9A2A send_message failed: no response received from agent.ri   zsA2A send_message failed: non-streaming message/send expects the agent's final event to be a Message or Task result.)rp   Úresult©Úroot)r!   ÚImportErrorr{   Úsend_messagerw   ÚRuntimeErrorr€   rp   r…   r7   r   r   r   r&   )rK   r\   Ú
pb_requestÚ
last_eventr|   Ústream_compatr…   s          r;   Ú_send_messagerŽ   ú   sÐ   è ø€ äÐÜØjó
ð 	
ô 6°gÓ>€JØ€JØ!×.Ñ.¨zÔCXÐYcÓCdÐ.Óe÷ ð ˆeØ‰
ðøÐeàÐÜÐVÓWÐWä5°jÈWÏZÉZÔX€MØ!×(Ñ(€FÜ�fœw¬˜oÔ.ÜðBó
ð 	
ô Ü'Ø�z‰zØô
ôð ùs)   ‚;B>½AÁA	ÁAÁB>Á	AÁA3B>rW   Úcard_urlrV   c           	   ƒ   óÎ  K  — d}t        d«      D ]  }	 t        | |«      ƒ d{  –—† } n |€t        d«      ‚|S 7 Œ# t        $ r1}t        ||| d¬«      ƒ d{  –—†7  } |rt	        |«      nd}Y d}~Œad}~wt
        $ re}	 t        ||||¬«       nJ# t        $ r5}	t        |	|| d¬«      ƒ d{  –—†7  } |rt	        |«      nd}Y d}	~	Y d}~Œ·d}	~	wt
        $ r ‚ w xY wY d}~ŒÍd}~ww xY w­w)z>Send an A2A message with retry logic for localhost URL errors.Né   F©ÚerrorrW   rK   Úis_streaming©rR   zCA2A send_message failed: no response received after retry attempts.)ÚrangerŽ   r,   r*   r(   Ú	Exceptionr+   rŠ   )
rK   r\   rW   r�   r]   rV   Úa2a_responseÚ_ÚeÚlocalhost_errs
             r;   Ú_execute_a2a_send_with_retryrœ     s  è ø€ ð €LÜ�1‹Xò ˆð	Ü!.¨z¸7Ó!C×CˆLÙðð4 ÐÜÐ`ÓaÐaØÐð5 Dùä#ò 	NÜ9ØØ%Ø%Ø"ô	 ÷ ð ˆJñ :DÔ)¨*Ô5È�HûÜò 	ðÜ! ! X¨x¸zÖJøÜ'ò Ü#=Ø'Ø)Ø)Ø!&ô	$÷ ð �
ñ >HÔ-¨jÔ9ÈT�ß�ûÜò Øðúô Kûð	üs‹   ‚C%”<£:¤<¨C%º<¼	C"ÁA1ÁAÁA1Á,C%Á1C"Á>BÂCÂ	CÂCÂ)B,
Â*CÂ>CÃC%ÃCÃCÃC%ÃC"Ã"C%r   r   c                óö   K  — t         €t        d«      ‚t        j                  |«      }| j                  |t	        | «      ¬«      2 3 d{  –—† }t        ||j                  ¬«      }t        |¬«      ­–— Œ07 Œ+6 y­w)z@Stream message events via a2a-sdk 1.x and yield JSON-RPC chunks.Nr‚   rƒ   ri   r†   )r!   rˆ   rz   r‰   rw   r€   rp   r   )rK   r\   r‹   r|   Úcompat_chunks        r;   Ú_stream_messagesrŸ   @  s|   è ø€ ô ÐÜØjó
ð 	
ô 1A×0]Ñ0]Ð^eÓ0f€JØ!×.Ñ.¨zÔCXÐYcÓCdÐ.Óe÷ >ð >ˆeÜ1°%ÀGÇJÁJÔOˆÜ*°Ô=Ô=ð>øÑeùs*   ‚AA9ÁA7Á	A5Á
A7Á(A9Á5A7Á7A9c           	     óØ  K  — d}d}t        d«      D ]  }	 t        | |«      2 3 d{  –—† }	d}|	­–— Œ |st        d«      ‚y7 Œ6 d} y# t        $ r4}
|r‚ t        |
|| d¬«      ƒ d{  –—†7  } |rt	        |«      nd}Y d}
~
Œod}
~
wt
        $ rZ}
|r‚ 	 t        |
|||¬«       ‚ # t        $ r5}t        ||| d¬«      ƒ d{  –—†7  } |rt	        |«      nd}Y d}~Y d}
~
ŒÈd}~ww xY wd}
~
ww xY w­w)z@Stream an A2A message with retry logic for localhost URL errors.Fr‘   NTr’   r•   zMA2A send_message_streaming failed: no response received after retry attempts.)r–   rŸ   r,   r*   r(   r—   r+   rŠ   )rK   r\   rW   r�   r]   rV   Úresponse_startedÚstream_succeededr™   Úchunkrš   r›   s               r;   Ú_execute_a2a_stream_with_retryr¤   O  s1  è ø€ ð ÐØÐÜ�1‹Xò  ˆð	Ü/°
¸GÓD÷ ð �eØ#'Ð Ø”ð	 ñB ÜÐjÓkÐkð ð?øÐDð  $ÐÙøÜ#ò 
	ÙØÜ9ØØ%Ø%Ø!ô	 ÷ ð ˆJñ :DÔ)¨*Ô5ÈˆHÜûÜò 	ÙØð
Ü! ! X¨x¸zÕJð øô (ò Ü#=Ø'Ø)Ø)Ø!%ô	$÷ ð �
ñ >HÔ-¨jÔ9ÈT�ß�ûðþð	üs§   ‚C*–A	¢A¦A§Aª	A	³C*ÁAÁA	ÁC*Á		C'ÁBÁ'A*Á(BÁ<C*ÂC'ÂC"ÂB!Â C"Â!	CÂ*CÂ<B?
Â=CÃC"ÃC*ÃCÃC"Ã"C'Ã'C*c              ‹   óÚ  K  — |xs i }|j                  d«      }|rt        |dd«      nd}|j                  d«      }	|	r%|€t        d«      ‚t        ||	|||¬«      ƒ d{  –—† S |€t        d«      ‚| €a|€t        d«      ‚|xs t	        t        j                  «       «      }d	|i}
|r||
d
<   |r|
j                  |«       t        ||
¬«      ƒ d{  –—† } | €J ‚t        | |«      }t        j                  d|j                  |«       t        | «      }|rt        |«      nd}t        | |||||¬«      ƒ d{  –—† }t        j                  d|j                  «       t!        j"                  |t	        |j                  «      ¬«      }|j$                  j'                  dd¬«      }t)        j*                  ||¬«      \  }}}t-        |||¬«       t/        ||¬«       t1        ||¬«       |S 7 �Œ…7 �Œ7 Œ¶­w)as  
    Async: Send a message to an A2A agent.

    Uses the @client decorator for LiteLLM logging and tracking.
    If litellm_params contains custom_llm_provider, routes through the completion bridge.

    Args:
        a2a_client: An initialized a2a.client.A2AClient instance (optional if using completion bridge)
        request: SendMessageRequest from a2a.types (optional if using completion bridge with api_base)
        api_base: API base URL (required for completion bridge, optional for standard A2A)
        litellm_params: Optional dict with custom_llm_provider, model, etc. for completion bridge
        agent_id: Optional agent ID for tracking in SpendLogs
        **kwargs: Additional arguments passed to the client decorator

    Returns:
        LiteLLMSendMessageResponse (wraps a2a SendMessageResponse with _hidden_params)

    Example (standard A2A):
        ```python
        from litellm.a2a_protocol import asend_message, create_a2a_client
        from a2a.types import SendMessageRequest, MessageSendParams
        from uuid import uuid4

        a2a_client = await create_a2a_client(base_url="http://localhost:10001")
        request = SendMessageRequest(
            id=str(uuid4()),
            params=MessageSendParams(
                message={"role": "user", "parts": [{"kind": "text", "text": "Hello!"}], "messageId": uuid4().hex}
            )
        )
        response = await asend_message(a2a_client=a2a_client, request=request)
        ```

    Example (completion bridge with LangGraph):
        ```python
        from litellm.a2a_protocol import asend_message
        from a2a.types import SendMessageRequest, MessageSendParams
        from uuid import uuid4

        request = SendMessageRequest(
            id=str(uuid4()),
            params=MessageSendParams(
                message={"role": "user", "parts": [{"kind": "text", "text": "Hello!"}], "messageId": uuid4().hex}
            )
        )
        response = await asend_message(
            request=request,
            api_base="http://localhost:2024",
            litellm_params={"custom_llm_provider": "langgraph", "model": "agent"},
        )
        ```
    r3   Úlitellm_trace_idNrS   ú)request is required for completion bridge)r\   rS   r]   rE   r^   úrequest is requiredú?Either a2a_client or api_base is required for standard A2A flowúX-LiteLLM-Trace-IdúX-LiteLLM-Agent-Id)Úbase_urlÚextra_headersz(A2A send_message request_id=%s, agent=%s©rK   r\   rW   r�   r]   rV   z)A2A send_message completed, request_id=%sri   rc   T)re   Úexclude_none)r\   rr   )r.   r/   r0   )r.   rE   ©r.   r>   )r6   rU   Ú
ValueErrorrs   ro   ÚuuidÚuuid4ÚupdateÚcreate_a2a_clientrX   r   rj   rp   rT   r(   rœ   r   Úfrom_a2a_responser‡   rb   r   Ú%calculate_usage_from_request_responser<   rJ   r@   )rK   r\   r]   rE   r>   r^   r.   rG   Útrace_idrS   r­   rV   rW   r�   r˜   Úresponserr   r/   r0   r™   s                       r;   Úasend_messagerº     s&  è ø€ ð| $Ò) r€NØŸ™Ð$9Ó:€KÙALŒw�{Ð$6¸Ô=ÐRV€HØ!/×!3Ñ!3Ð4IÓ!JÐñ Øˆ?ÜÐHÓIÐIÜ8ØØ 3ØØ)Ø 3ô
÷ 
ð 	
ð €ÜÐ.Ó/Ð/ð ÐØÐÜÐ^Ó_Ð_ØÒ0œs¤4§:¡:£<Ó0ˆØ0DÀhÐ/OˆÙØ2:ˆMÐ.Ñ/áØ× Ñ Ð!4Ô5Ü,°hÈmÔ\×\ˆ
ð Ð!Ð!Ð!ä+¨J¸Ó?€Jä×ÑÐBÀGÇJÁJÐPZÔ[ô 3°:Ó>€JÙ8BÔ(¨Ô4È€Hä <ØØØØØØô!÷ €Lô ×ÑÐCÀWÇZÁZÔPô 1×BÑBÀ<Ô\_Ð`g×`jÑ`jÓ\kÔl€Hð /;×.?Ñ.?×.JÑ.JÐPVÐeiÐ.JÓ.j€Mô
 	×=Ñ=ØØ#ô	ñ	ØØØ	ô ØØ#Ø+õô '¨fÀ^ÕTô !¨¸ÕBà€OðU
ùð. ]ùðús9   ‚AG+ÁG#ÁA/G+ÃG&ÃA#G+Ä2G)Ä3B1G+Ç&G+Ç)G+c                 ó°   — 	 t        j                  «       }|�t        d| |dœ|¤ŽS t        j                  t        d| |dœ|¤Ž«      S # t        $ r d}Y Œ>w xY w)a›  
    Sync: Send a message to an A2A agent.

    Uses the @client decorator for LiteLLM logging and tracking.

    Args:
        a2a_client: An initialized a2a.client.A2AClient instance
        request: SendMessageRequest from a2a.types
        **kwargs: Additional arguments passed to the client decorator

    Returns:
        LiteLLMSendMessageResponse (wraps a2a SendMessageResponse with _hidden_params)
    N)rK   r\   © )ÚasyncioÚget_running_looprŠ   rº   Úrun)rK   r\   r.   Úloops       r;   r‰   r‰     sg   € ð&Ü×'Ñ'Ó)ˆð ÐÜÐN¨
¸GÑNÀvÑNÐNä�{‰{œ=ÐZ°JÈÑZÐSYÑZÓ[Ð[øô ò ØŠðús   ‚A ÁAÁAÚmetadataÚproxy_server_requestc                 ó  — t         j                   j                  «       }d|› �}t        |dddœgdd|t        | j                  «      t        | j                  «      ¬«      }||_        d|_        ||j                  d	<   d|j                  d
<   |j                  |j                  d<   |r||j                  d<   |r|j                  «       ni }	|r||	d<   |r||	d<   |	|_
        |	|_        |	|j                  d<   |xs i |j                  d<   |S )z0Build logging object for streaming A2A requests.rP   Úuserzstreaming-request)ÚroleÚcontentFÚasend_message_streaming)rR   ÚmessagesÚstreamÚ	call_typeÚ
start_timeÚlitellm_call_idÚfunction_idrQ   rR   rS   rÊ   r>   rÁ   rÂ   rE   )ÚdatetimeÚnowr   ro   rp   rR   rS   r:   rÊ   ÚcopyrE   Úoptional_params)
r\   rV   r>   rE   rÁ   rÂ   rË   rR   rG   Ú_litellm_paramss
             r;   Ú_build_streaming_logging_objrÓ   1  s   € ô !×)Ñ)×-Ñ-Ó/€JØ 
˜|Ð,€Eä ØØ!Ð.AÑBÐCØØ+ØÜ˜GŸJ™J›Ü˜Ÿ
™
“Oô€Kð €KÔØ&1€KÔ#Ø.3€K×"Ñ" 7Ñ+Ø<G€K×"Ñ"Ð#8Ñ9Ø2=×2GÑ2G€K×"Ñ" ;Ñ/ÙØ5=ˆ×&Ñ& zÑ2á6D˜^×0Ñ0Ô2È"€OÙØ&.ˆ˜
Ñ#ÙØ2FˆÐ.Ñ/à!0€KÔØ"1€KÔØ7F€K×"Ñ"Ð#3Ñ4Ø19²¸R€K×"Ñ" :Ñ.àÐr=   c                óf  K  — |xs i }|j                  d«      }	|	r¨|€t        d«      ‚t        j                  d|	«       ddlm}
 t        |j                  d«      r|j                  j                  d¬	«      nt        |j                  «      }|
j                  t        |j                  «      ||||¬
«      2 3 d{  –—† }|­–— Œ|€t        d«      ‚|j                  d«      }t        |t        «      r|nd}| €”|€t        d«      ‚|rt        |dd«      nd}|xs> |j                  rt        |j                  «      nt        t!        j"                  «       «      }d|i}|r||d<   |r|j%                  |«       t'        ||d¬«      ƒ d{  –—† } | €J ‚t)        | |«      }|€t+        ||||||¬«      }t        j                  d|j                  |«       t-        | «      }|rt/        |«      nd}t1        | |||||¬«      }t3        ||¬«       t5        ||||¬«      2 3 d{  –—† }|­–— Œ7 �Œm6 y7 Œ£7 Œ6 y­w)aô  
    Async: Send a streaming message to an A2A agent.

    If litellm_params contains custom_llm_provider, routes through the completion bridge.

    Args:
        a2a_client: An initialized a2a.client.A2AClient instance (optional if using completion bridge)
        request: SendStreamingMessageRequest from a2a.types
        api_base: API base URL (required for completion bridge)
        litellm_params: Optional dict with custom_llm_provider, model, etc. for completion bridge
        agent_id: Optional agent ID for tracking in SpendLogs
        metadata: Optional metadata dict (contains user_api_key, user_id, team_id, etc.)
        proxy_server_request: Optional proxy server request data

    Yields:
        SendStreamingMessageResponse chunks from the agent

    Example (completion bridge with LangGraph):
        ```python
        from litellm.a2a_protocol import asend_message_streaming
        from a2a.types import SendStreamingMessageRequest, MessageSendParams
        from uuid import uuid4

        request = SendStreamingMessageRequest(
            id=str(uuid4()),
            params=MessageSendParams(
                message={"role": "user", "parts": [{"kind": "text", "text": "Hello!"}], "messageId": uuid4().hex}
            )
        )
        async for chunk in asend_message_streaming(
            request=request,
            api_base="http://localhost:2024",
            litellm_params={"custom_llm_provider": "langgraph", "model": "agent"},
        ):
            print(chunk)
        ```
    rS   Nr§   z2A2A streaming using completion bridge: provider=%sr   r`   rb   rc   rd   rf   r¨   r3   r©   r¦   rª   r«   T)r¬   r­   Ú	streaming)r\   rV   r>   rE   rÁ   rÂ   z2A2A send_message_streaming request_id=%s, agent=%sr®   r°   )rÉ   r\   rG   rV   )r6   r±   r   rj   rk   ra   rl   rh   rb   rm   Úhandle_streamingro   rp   r7   r   rU   r²   r³   r´   rµ   rX   rÓ   rT   r(   r¤   r@   r   )rK   r\   r]   rE   r>   rÁ   rÂ   r^   r.   rS   ra   rh   r£   Ú_raw_logging_objrG   Úlogging_trace_idr¸   r­   rV   rW   r�   rÉ   s                         r;   rÇ   rÇ   \  s}  è ø€ ð` $Ò) r€NØ!/×!3Ñ!3Ð4IÓ!JÐñ Øˆ?ÜÐHÓIÐIô 	×ÑÐPÐReÔfõ	
ô 7>¸g¿n¹nÈlÔ6[ˆG�N‰N×%Ñ%¨6Ð%Ô2ÔaeÐfm×ftÑftÓauð 	ð 6×FÑFÜ˜7Ÿ:™:“ØØ)ØØ 3ð Gó 
÷ 	ð 	�%ð ŒKð €ÜÐ.Ó/Ð/à$Ÿj™jÐ)>Ó?ÐÜ6@ÐAQÔSZÔ6[Ñ"2Ðae€KàÐØÐÜÐ^Ó_Ð_ÙT_¤'¨+Ð7IÈ4Ô"PÐeiÐØ*ÒdÀ'Ç*Â*¬s°7·:±:¬ÔRUÔVZ×V`ÑV`ÓVbÓRcˆØ0DÀhÐ/OˆÙØ2:ˆMÐ.Ñ/ÙØ× Ñ Ð!4Ô5Ü,ØØ'Øô
÷ 
ˆ
ð Ð!Ð!Ð!ä+¨J¸Ó?€JàÐÜ2ØØ!ØØ)ØØ!5ô
ˆô ×ÑÐLÈgÏjÉjÐZdÔeä2°:Ó>€JÙ8BÔ(¨Ô4È€Hä2ØØØØØØô€Fô !¨¸ÕBä+ØØØØô	÷ ð ˆeð ŒðI	ùð 
ð 	ð$
øðHøñ ùs\   ‚B3H1Â5H)Â9H&Â:H)Â=C
H1ÆH+ÆBH1ÈH/ÈH-ÈH/ÈH1È&H)È)H1È-H/È/H1r¬   Útimeoutr­   rÕ   c              ƒ   ó2  K  — t         st        d«      ‚t        j                  d| «       t	        t
        j                  d|i¬«      }|j                  }|r-t        j                  dt        |j                  «       «      «       t        || ¬«      }t        |j                  |rd|ind¬	«      ƒ d{  –—† «      }t        |t!        ||¬
«      ¬«      ƒ d{  –—† }||_        |rt%        |¬«      nd|_        ||_        t        j                  d| «       |S 7 Œc7 ŒA­w)a·  
    Create an A2A client for the given agent URL.

    This resolves the agent card and returns a ready-to-use A2A client.
    The client can be reused for multiple requests.

    Args:
        base_url: The base URL of the A2A agent (e.g., "http://localhost:10001")
        timeout: Request timeout in seconds (default: ``DEFAULT_A2A_AGENT_TIMEOUT`` / env ``DEFAULT_A2A_AGENT_TIMEOUT``)
        extra_headers: Optional additional headers to include in requests

    Returns:
        An initialized a2a.client.A2AClient instance

    Example:
        ```python
        from litellm.a2a_protocol import create_a2a_client, asend_message

        # Create client once
        client = await create_a2a_client(base_url="http://localhost:10001")

        # Reuse for multiple requests
        response1 = await asend_message(a2a_client=client, request=request1)
        response2 = await asend_message(a2a_client=client, request=request2)
        ```
    r‚   zCreating A2A client for %srÙ   ©Úllm_providerrh   z(A2A client created with extra_headers=%s©Úhttpx_clientr¬   ÚheadersN)Úhttp_kwargs)rÞ   rÕ   )Úclient_config)Úservice_parameterszA2A client created for %s)ÚA2A_SDK_AVAILABLErˆ   r   rj   r   r   ÚA2AProviderr   r   ÚdebugÚlistÚkeysr-   r)   Úget_agent_cardr#   r"   Ú_litellm_httpx_clientr   rv   rZ   )	r¬   rÙ   r­   rÕ   Ú_async_handlerrÞ   ÚresolverrW   rK   s	            r;   rµ   rµ   ç  s"  è ø€ õ@ ÜØjó
ð 	
ô ×ÑÐ4°hÔ?ä2Ü)×5Ñ5Ø˜7Ð#ô€Nð )×/Ñ/€LÙÜ×"Ñ"Ð#MÌtÐTa×TfÑTfÓThÓOiÔjä%°<È(ÔS€HÜ7Ø×%Ñ%ÑP]°9¸mÑ2LÐcgÐ%Óh×hó€Jô ,ØÜ"Ø%Øô
ô÷ €Jð (4€JÔ$ñ ô 	¨]Õ;àð Ô$ð
 &0€JÔ"ä×ÑÐ3°XÔ>àÐð/ 	iøðús%   ‚B-DÂ/DÂ0#DÃDÃA DÄDc              ƒ   ód  K  — t         st        d«      ‚t        j                  d| «       t	        t
        j                  d|i¬«      }|j                  }t        || ¬«      }|j                  «       ƒ d{  –—† }t        j                  dt        |d«      r|j                  «       |S d	«       |S 7 Œ:­w)
aƒ  
    Fetch the agent card from an A2A agent.

    Args:
        base_url: The base URL of the A2A agent (e.g., "http://localhost:10001")
        timeout: Request timeout in seconds (default: ``DEFAULT_A2A_AGENT_TIMEOUT`` / env ``DEFAULT_A2A_AGENT_TIMEOUT``)
        extra_headers: Optional additional headers to include in requests

    Returns:
        AgentCard from the A2A agent
    r‚   zFetching agent card from %srÙ   rÛ   rÝ   NzFetched agent card: %srO   rN   )rã   rˆ   r   rj   r   r   ÚA2Ar   r-   rè   rl   rO   )r¬   rÙ   r­   Úhttp_handlerrÞ   rë   rW   s          r;   Úaget_agent_cardrï   2  sµ   è ø€ õ  ÜØjó
ð 	
ô ×ÑÐ5°xÔ@ô 1Ü)×-Ñ-Ø˜7Ð#ô€Lð '×-Ñ-€Lä%Ø!Øô€Hð '×5Ñ5Ó7×7€Jä×ÑÐ0ÄWÈZÐY_ÔE`°*·/±/ÔpØÐð gpÔpØÐð 8ús   ‚A1B0Á3B.Á4;B0)N)r\   r   r1   ÚCoreSendMessageRequest)rK   rL   r\   r   r1   r   )NNNNNN)NNNNNNNN)bÚ__doc__r½   rÎ   r²   Úcollections.abcr   r   r   Útypesr   Útypingr   r   r	   r
   r   r8   Úlitellm._loggingr   r   Ú'litellm.a2a_protocol.streaming_iteratorr   Úlitellm.a2a_protocol.utilsr   Úlitellm.constantsr   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.types.agentsr   Úlitellm.utilsr   Ú
a2a.clientr   rL   r   rt   Úa2a.compat.v0_3.typesr   r   r   r   r   r   r   r   Úa2a.types.a2a_pb2rð   r    r}   rã   r!   Ú__annotations__r"   r#   ry   r%   r&   rˆ   Ú"litellm.a2a_protocol.card_resolverr'   r(   r)   Ú,litellm.a2a_protocol.exception_mapping_utilsr*   r+   Úlitellm.a2a_protocol.exceptionsr,   r-   ro   ÚobjectÚintr<   r@   rD   rJ   rX   rT   rm   rs   rw   r{   r€   rŽ   rœ   rŸ   r¤   rº   r‰   rÓ   rÇ   ÚfloatÚboolrµ   rï   r¼   r=   r;   ú<module>r     s7  ðòó Û Û ß =Ñ =Ý ß <Õ <ã ß AÝ HÝ 6Ý 7Ý >÷õ <Ý  áÝ2ÝB÷	÷ 	ó 	õ OÝFð Ð Ø&*Ð �*˜tÑ#Ó *ðßQÓQÝ?÷÷ ñ ð Ð÷ñ ÷
õ Að 0€�Ó /ð@Ø�C˜�KÑ ð@àð@ð ð@ð 
ó	@ð.FØ�C˜�KÑ ðFà�D‰jðFð 
óFð( bÐ �eÓ aðØ�C˜�KÑ ðà˜C ˜KÑ(ðð 
óð8 Oð ¸WÀSÈ&À[Ñ=Qð ÐVYó ð:K¨?ð K¸xÈÑ?Tó Kð 26ñ[Ø!ð[àð[ð �D‰jð[ð ˜˜f˜Ñ%ð	[ð
 ˜c 3˜h™¨$Ñ.ð[ð  ó[ð>> oð >¸(ÐCWÑ:Xó >ó=ðOØðOØ-0°3©YðOà*óOóð:&Øð&à!ð&ð ˜Ñ%ð&ð �D‰jð	&ð
 �D‰jð&ð �d‘
ð&ð ó&ðR>Øð>Ø*Gð>àÐ1Ñ2ó>ð-lØð-là*ð-lð ˜Ñ%ð-lð �D‰jð	-lð
 �D‰jð-lð �d‘
ð-lð Ð1Ñ2ó-lð` à,0Ø.2ØØ/3ØØ15ñPØ˜Ñ)ðPàÐ*Ñ+ðPð �D‰jðPð ˜˜f˜Ñ%¨Ñ,ð	Pð
 �D‰jðPð ˜c 3˜h™¨$Ñ.ðPð ðPð  òPó ðPðf ð\Øð\à!ð\ð ð\ð   )¨F°FÐ<VÐ,VÑ"WÑWò	\ó ð\ð:(Ø*ð(àð(ð �D‰jð(ð ˜˜f˜Ñ%¨Ñ,ð	(ð
 �3˜�;Ñ $Ñ&ð(ð ˜s F˜{Ñ+¨dÑ2ð(ð ó(ðX -1Ø7;ØØ/3ØØ)-Ø59Ø15ñHØ˜Ñ)ðHàÐ3Ñ4ðHð �D‰jðHð ˜˜f˜Ñ%¨Ñ,ð	Hð
 �D‰jðHð �3˜�;Ñ $Ñ&ðHð ˜s F˜{Ñ+¨dÑ2ðHð ˜c 3˜h™¨$Ñ.ðHð ðHð �3ÑóHðZ /Ø+/Øñ	HØðHàðHð ˜˜S˜‘> DÑ(ðHð ð	Hð
 óHðZ /Ø+/ñ%Øð%àð%ð ˜˜S˜‘> DÑ(ð%ð ô	%øða ò Ø€FØÐØ€LØƒMð	ús   Â!&K ËK"Ë!K"