o
    ưi1                     @   s   d Z ddl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 ddlmZmZ ddlmZ ddlmZmZmZ dd	lmZmZmZ d
dlmZ G dd deZdS )z)
A2A Protocol Transformation for LiteLLM
    N)AnyDictIteratorListOptionalUnion)BaseModelResponseIterator)
BaseConfigBaseLLMException)AllMessageValues)ChoicesMessageModelResponse   )A2AErrorconvert_messages_to_promptextract_text_from_a2a_response   A2AModelResponseIteratorc                   @   s  e Zd ZdZededee dee deeeef  deeef de	ee ee eeeef  f fdd	Z
dedee fd
dZdededededef
ddZ		d.dededee dededee dee defddZ	d/dee dee dedededee defddZdedee dedededefddZ		d.dedejdedededee dedededee dee defd d!Z	"d0d#eeef d$edee defd%d&Zd'eeef deeef fd(d)Zd*ed+edeeejf defd,d-Z dS )1	A2AConfigz
    Configuration for A2A (Agent-to-Agent) Protocol.
    
    Handles transformation between OpenAI and A2A JSON-RPC 2.0 formats.
    modelapi_baseapi_keyheadersoptional_paramsreturnc                 C   s   d| v r|  ddd nd}|r|dur!|dur!|dur!|||fS zMddlm} ||}|rm|du r<|jr<|jd}|jrm|du rI|jd}|du rW|jd}|rW|}|j D ]\}	}
|	d	vrl|	|vrl|
||	< q\W n	 tyw   Y nw |||fS )
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   )	splitZ,litellm.proxy.agent_endpoints.agent_registryr   Zget_agent_by_nameZagent_card_paramsgetlitellm_paramsitemsImportError)r   r   r   r   r   Z
agent_namer   ZagentZagent_headerskeyvalue r'   [/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/a2a/chat/transformation.py"resolve_agent_config_from_registry   s0   


z,A2AConfig.resolve_agent_config_from_registryc                 C   s   g dS )z*Return list of supported OpenAI parameters)streamZtemperatureZ
max_tokensZtop_pr'   )selfr   r'   r'   r(   get_supported_openai_params[   s   z%A2AConfig.get_supported_openai_paramsnon_default_paramsdrop_paramsc                 C   s.   |  D ]\}}|dkr|du r||d< q|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.
        r*   T)r#   )r+   r-   r   r   r.   paramr&   r'   r'   r(   map_openai_paramsd   s
   zA2AConfig.map_openai_paramsNmessagesr"   c                 C   s2   d|vrd|vrd|d< |dur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/jsonNzBearer Authorizationr'   )r+   r   r   r1   r   r"   r   r   r'   r'   r(   validate_environmentx   s
   zA2AConfig.validate_environmentr*   c                 C   s   |du rt d|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)
        Nz%api_base is required for A2A providerr   )
ValueErrorrstrip)r+   r   r   r   r   r"   r*   r'   r'   r(   get_complete_url   s   
zA2AConfig.get_complete_urlc                 C   sj   t t }|stdt|}dd|dgt t d}|dd}	|	r(dnd	}
d
||
d|id}|S )ar  
        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kindr8   rolepartsZ	messageIdr*   Fzmessage/streamzmessage/sendz2.0message)Zjsonrpcidmethodparams)struuiduuid4r4   r   r!   )r+   r   r1   r   r"   r   Z
request_idZfull_contextZa2a_messager*   r@   request_datar'   r'   r(   transform_request   s"   

		zA2AConfig.transform_requestraw_responsemodel_responselogging_objrE   encoding	json_modec              
   C   s   z|  }W n ty" } zt|jdt| t|jdd}~ww d|v r=|d }t|jd|dd t|jdt|}t	dd	t
|d
ddg|_||_|dtt |_|S )a  
        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_coder>   r   NerrorzA2A error: r>   zUnknown errorstopr   Z	assistant)contentr<   )Zfinish_reasonindexr>   r?   )json	Exceptionr   rM   rB   dictr   r!   r   r   r   choicesr   rC   rD   r?   )r+   r   rG   rH   rI   rE   r1   r   r"   rJ   r   rK   Zresponse_jsonerN   r8   r'   r'   r(   transform_response   s<   !zA2AConfig.transform_responseFstreaming_responsesync_streamc                 C   s   t |||d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
        )rX   rY   rK   r   )r+   rX   rY   rK   r'   r'   r(   get_model_response_iterator>  s
   z%A2AConfig.get_model_response_iteratorr>   c                 C   s8   | dd}| dd}|dt|dgtt dS )z
        Convert OpenAI message to A2A message format.
        
        Args:
            message: OpenAI message dict
        
        Returns:
            A2A message dict
        rP    r<   r7   r8   r9   r;   )r!   rB   rC   rD   )r+   r>   rP   r<   r'   r'   r(   _openai_message_to_a2a_messageU  s   

z(A2AConfig._openai_message_to_a2a_messageerror_messagerM   c                 C   s&   t |tjr
t|n|}t|||dS )z-Return appropriate error class for A2A errorsrL   )
isinstancehttpxHeadersrT   r   )r+   r]   rM   r   Zheaders_dictr'   r'   r(   get_error_classh  s   zA2AConfig.get_error_class)NN)N)F)!__name__
__module____qualname____doc__staticmethodrB   r   r   r   tupler)   r   r,   rT   boolr0   r   r3   r6   rF   r_   Responser   rW   r   r   r   rZ   r\   intr`   r
   ra   r'   r'   r'   r(   r      s    
 =	
	
*
"
B	

N

"r   )re   rC   typingr   r   r   r   r   r   r_   Z)litellm.llms.base_llm.base_model_iteratorr   Z)litellm.llms.base_llm.chat.transformationr	   r
   Zlitellm.types.llms.openair   Zlitellm.types.utilsr   r   r   Zcommon_utilsr   r   r   Zstreaming_iteratorr   r   r'   r'   r'   r(   <module>   s     