o
    ưiW%                     @   s   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 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rQd dlmZ eZneZG dd deZdS )    )TYPE_CHECKINGAnyDictListOptionalUnionN)verbose_logger)XAI_API_BASE)OpenAIResponsesAPIConfig)get_secret_str)!ResponsesAPIOptionalRequestParams)XAIWebSearchToolXAIXSearchTool)GenericLiteLLMParams)LlmProviders)Loggingc                       s   e Zd ZdZedefddZdedef fddZ	de
eef deee
eef f fd	d
Zde
eef deee
eef f fddZdededede
fddZdededee defddZdee dedefddZdefddZ  ZS )XAIResponsesAPIConfiga  
    Configuration for XAI's Responses API.
    
    Inherits from OpenAIResponsesAPIConfig since XAI's Responses API is largely
    compatible with OpenAI's, with a few differences:
    - Does not support the 'instructions' parameter
    - Requires code_interpreter tools to have 'container' field removed
    - Recommends store=false when sending images
    
    Reference: https://docs.x.ai/docs/api-reference#create-new-response
    returnc                 C   s   t jS )N)r   ZXAIself r   `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/xai/responses/transformation.pycustom_llm_provider"   s   z)XAIResponsesAPIConfig.custom_llm_providermodelc                    s"   t  |}d|v r|d |S )z
        Get supported parameters for XAI Responses API.
        
        XAI supports most OpenAI Responses API params except 'instructions'.
        instructions)superget_supported_openai_paramsremove)r   r   Zsupported_params	__class__r   r   r   &   s   
z1XAIResponsesAPIConfig.get_supported_openai_paramstoolc                 C   sr   ddi}d|v rt d i }d|v r|d }||d< d|v r'|d }||d< |r-||d< d|v r7|d |d< |S )	a1  
        Transform web_search tool to XAI format.
        
        XAI supports web_search with specific filters:
        - allowed_domains (max 5)
        - excluded_domains (max 5)
        - enable_image_understanding
        
        XAI does NOT support search_context_size (OpenAI-specific).
        type
web_searchZsearch_context_sizezWXAI does not support 'search_context_size' parameter. Removing it from web_search tool.allowed_domainsexcluded_domainsfiltersenable_image_understanding)r   info)r   r    xai_toolr%   r#   r$   r   r   r   _transform_web_search_tool4   s"   z0XAIResponsesAPIConfig._transform_web_search_toolc                 C   s   ddi}d|v r|d }||d< d|v r|d }||d< d|v r&|d |d< d|v r0|d |d< d|v r:|d |d< d|v rD|d |d< |S )	a`  
        Transform x_search tool to XAI format.
        
        XAI supports x_search with specific parameters:
        - allowed_x_handles (max 10)
        - excluded_x_handles (max 10)
        - from_date (ISO8601: YYYY-MM-DD)
        - to_date (ISO8601: YYYY-MM-DD)
        - enable_image_understanding
        - enable_video_understanding
        r!   x_searchZallowed_x_handlesZexcluded_x_handlesZ	from_dateZto_dater&   Zenable_video_understandingr   )r   r    r(   Zallowed_handlesZexcluded_handlesr   r   r   _transform_x_search_tool[   s    z.XAIResponsesAPIConfig._transform_x_search_toolresponse_api_optional_paramsdrop_paramsc           	      C   s  t |}d|v rtd |d d|v r td |d d|v r|d r|d }t|ts4|g}g }|D ]L}t|t r|d}|dkrUtd |ddi q8|d	krgtd
 || | q8|dkrytd || 	| q8|| q8|| q8||d< |S )a  
        Map parameters for XAI Responses API.
        
        Handles XAI-specific transformations:
        1. Drops 'instructions' parameter (not supported)
        2. Transforms code_interpreter tools to remove 'container' field
        3. Transforms web_search tools to XAI format (removes search_context_size, adds filters)
        4. Transforms x_search tools to XAI format
        5. Sets store=false when images are detected (recommended by XAI)
        r   zIXAI Responses API does not support 'instructions' parameter. Dropping it.metadatazEXAI Responses API does not support 'metadata' parameter. Dropping it.Ztoolsr!   Zcode_interpreterzAXAI: Transforming code_interpreter tool, removing container fieldr"   z/XAI: Transforming web_search tool to XAI formatr*   z-XAI: Transforming x_search tool to XAI format)
dictr   debugpop
isinstancelistgetappendr)   r+   )	r   r,   r   r-   paramsZ
tools_listZtransformed_toolsr    Z	tool_typer   r   r   map_openai_params   sL   




z'XAIResponsesAPIConfig.map_openai_paramsheaderslitellm_paramsc                 C   sB   |pt  }|jptjptd}|std|dd| i |S )z
        Validate environment and set up headers for XAI API.
        
        Uses XAI_API_KEY from environment or litellm_params.
        ZXAI_API_KEYzXXAI API key is required. Set XAI_API_KEY environment variable or pass api_key parameter.AuthorizationzBearer )r   api_keylitellmr   
ValueErrorupdate)r   r8   r   r9   r;   r   r   r   validate_environment   s   

z*XAIResponsesAPIConfig.validate_environmentapi_basec                 C   s*   |p
t jp
tdp
t}|d}| dS )z
        Get the complete URL for XAI Responses API endpoint.
        
        Returns:
            str: The full URL for the XAI /responses endpoint
        r	   /z
/responses)r<   r@   r   r	   rstrip)r   r@   r9   r   r   r   get_complete_url   s   

z&XAIResponsesAPIConfig.get_complete_urlc                 C   s   dS )z7XAI does not support native WebSocket for Responses APIFr   r   r   r   r   supports_native_websocket   s   z/XAIResponsesAPIConfig.supports_native_websocket)__name__
__module____qualname____doc__propertyr   r   strr3   r   r   r   r   r   r)   r   r+   r   boolr7   r/   r   r   r?   rC   rD   __classcell__r   r   r   r   r      sB    **'(
J

r   )typingr   r   r   r   r   r   r<   Zlitellm._loggingr   Zlitellm.constantsr	   Z,litellm.llms.openai.responses.transformationr
   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.openair   Zlitellm.types.llms.xair   r   Zlitellm.types.routerr   Zlitellm.types.utilsr   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjZLiteLLMLoggingObjr   r   r   r   r   <module>   s     