o
    ưi5                     @   s   d dl mZ d dlmZmZ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T d dlT d d	lmZ d d
lmZ erUd dlmZ eZneZG dd deZdS )    )deepcopy)TYPE_CHECKINGAnyDictListLiteralOptionalTupleUnionN)ResponseReasoningItem)verbose_logger)BaseAzureLLM)OpenAIResponsesAPIConfig)*)GenericLiteLLMParams)LlmProviders)Loggingc                       s  e Zd ZdgZedefddZdedef fddZ	de
ded	ee de
fd
dZdedefddZdeeef deeef fddZdeeef deeef f fddZdedeeef ded	ede
def fddZdee d	e
defddZdededefddZdeded	ede
deeef f
ddZdeded	ede
deeef f
dd Z	!	!	!	"	#d2deded	ede
d$ee d%ee d&eee  d'ed(ed) deeef fd*d+Zdeded	ede
deeef f
d,d-Zd.e j!d/e"de#fd0d1Z$  Z%S )3AzureOpenAIResponsesAPIConfigZcontext_managementreturnc                 C   s   t jS )N)r   ZAZUREself r   b/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/azure/responses/transformation.pycustom_llm_provider   s   z1AzureOpenAIResponsesAPIConfig.custom_llm_providermodelc                    s   t  |} fdd|D S )zW
        Azure Responses API does not support context_management (compaction).
        c                    s   g | ]	}| j vr|qS r   )AZURE_UNSUPPORTED_PARAMS).0paramr   r   r   
<listcomp>%   s
    
zMAzureOpenAIResponsesAPIConfig.get_supported_openai_params.<locals>.<listcomp>)superget_supported_openai_params)r   r   Zbase_supported_params	__class__r   r   r        s   
z9AzureOpenAIResponsesAPIConfig.get_supported_openai_paramsheaderslitellm_paramsc                 C   s   t j||dS )N)r#   r$   )r   Z _base_validate_azure_environment)r   r#   r   r$   r   r   r   validate_environment+   s   z2AzureOpenAIResponsesAPIConfig.validate_environmentc                 C   s,   d|v r
| dd}d|v r| dd}|S )Nz
responses/ Zo_seriesz	o_series/)replace)r   r   r   r   r   get_stripped_model_name2   s
   z5AzureOpenAIResponsesAPIConfig.get_stripped_model_nameitemc              
   C   s   | ddkriz<t|}d|vr.t| dddkr&| dddd d n| dd|d< tdi |}|jd	d
}|dd |W S  tyh } ztd|  dd |	 D }|W  Y d}~S d}~ww |S )z
        Handle reasoning items to filter out the status field.
        Issue: https://github.com/BerriAI/litellm/issues/13484

        Azure OpenAI API does not accept 'status' field in reasoning input items.
        typeZ	reasoningsummaryZreasoning_contentr&   d   Nz...T)Zexclude_nonestatuszJFailed to create ResponseReasoningItem, falling back to manual filtering: c                 S   s&   i | ]\}}|d us|dvr||qS )N>   Zencrypted_contentr-   contentr   r   kvr   r   r   
<dictcomp>Y   s    zHAzureOpenAIResponsesAPIConfig._handle_reasoning_item.<locals>.<dictcomp>r   )
getdictlenr   Z
model_dumppop	Exceptionr   debugitems)r   r)   Z	item_dataZreasoning_itemZdict_reasoning_itemefiltered_itemr   r   r   _handle_reasoning_item:   s.   
z4AzureOpenAIResponsesAPIConfig._handle_reasoning_iteminputc                    s~   ddl m} t |}t|tr=g }|D ]"}t|tr2|ddkr2dd | D }|	| q|	| q|t
|S |S )z
        Override parent method to also filter out 'status' field from message items.
        Azure OpenAI API does not accept 'status' field in input messages.
        r   )castr*   messagec                 S   s   i | ]\}}|d kr||qS )r-   r   r/   r   r   r   r2   t   s    zGAzureOpenAIResponsesAPIConfig._validate_input_param.<locals>.<dictcomp>)typingr>   r   _validate_input_param
isinstancelistr4   r3   r9   appendResponseInputParam)r   r=   r>   Zvalidated_inputZfiltered_inputr)   r;   r!   r   r   rA   b   s   

z3AzureOpenAIResponsesAPIConfig._validate_input_param$response_api_optional_request_paramsc                    s   |  |}d|v r?t|d tr?g }|d D ]$}t|tr5d|v r5t|}	|	d}
|	|
 ||	 q|| q||d< t j	|||||dS )z<No transform applied since inputs are in OpenAI spec alreadyZtoolsfunction)r   r=   rF   r$   r#   )
r(   rB   rC   r4   r   r6   updaterD   r   transform_responses_api_request)r   r   r=   rF   r$   r#   Zstripped_model_nameZ	new_toolsZtoolZnew_toolZfunction_datar!   r   r   rI   |   s(   
	


z=AzureOpenAIResponsesAPIConfig.transform_responses_api_requestapi_basec                 C   s   ddl m} tj||d|dS )ag  
        Constructs a complete URL for the API request.

        Args:
        - api_base: Base URL, e.g.,
            "https://litellm8397336933.openai.azure.com"
            OR
            "https://litellm8397336933.openai.azure.com/openai/responses?api-version=2024-05-01-preview"
        - model: Model name.
        - optional_params: Additional query parameters, including "api_version".
        - stream: If streaming is required (optional).

        Returns:
        - A complete URL string, e.g.,
        "https://litellm8397336933.openai.azure.com/openai/responses?api-version=2024-05-01-preview"
        r   )#AZURE_DEFAULT_RESPONSES_API_VERSIONz/openai/responses)rJ   r$   ZrouteZdefault_api_version)Zlitellm.constantsrK   r   Z_get_base_azure_url)r   rJ   r$   rK   r   r   r   get_complete_url   s   z.AzureOpenAIResponsesAPIConfig.get_complete_urlresponse_idc           	      C   sT   ddl m}m} ||}|jd}| d| }||j|j||j|j|j	f}|S )zX
        Constructs a URL for the API request with the response_id in the path.
        r   urlparse
urlunparse/)
urllib.parserO   rP   pathrstripschemenetlocparamsqueryfragment)	r   rJ   rM   rO   rP   
parsed_urlrS   new_pathZconstructed_urlr   r   r   &_construct_url_for_response_id_in_path   s   
zDAzureOpenAIResponsesAPIConfig._construct_url_for_response_id_in_pathc                 C   *   | j ||d}i }td|  ||fS )a_  
        Transform the delete response API request into a URL and data

        Azure OpenAI API expects the following request:
        - DELETE /openai/responses/{response_id}?api-version=xxx

        This function handles URLs with query parameters by inserting the response_id
        at the correct location (before any query parameters).
        rJ   rM   zdelete response url=r\   r   r8   )r   rM   rJ   r$   r#   Z
delete_urldatar   r   r   %transform_delete_response_api_request   s   zCAzureOpenAIResponsesAPIConfig.transform_delete_response_api_requestc                 C   r]   )z
        Transform the get response API request into a URL and data

        OpenAI API expects the following request
        - GET /v1/responses/{response_id}
        r^   zget response url=r_   )r   rM   rJ   r$   r#   Zget_urlr`   r   r   r   "transform_get_response_api_request   s   z@AzureOpenAIResponsesAPIConfig.transform_get_response_api_requestN   descafterbeforeincludelimitorder)ascrd   c
                 C   s   | j ||dd }
i }|d ur||d< |d ur||d< |r$d||d< |d ur,||d< |	d ur4|	|d< td	|
  |
|fS )
Nr^   z/input_itemsre   rf   ,rg   rh   ri   zlist input items url=)r\   joinr   r8   )r   rM   rJ   r$   r#   re   rf   rg   rh   ri   urlrW   r   r   r   "transform_list_input_items_request  s&   z@AzureOpenAIResponsesAPIConfig.transform_list_input_items_requestc                 C   sn   ddl m}m} ||}|jd}| d| d}	||j|j|	|j|j|j	f}
i }t
d|
  |
|fS )ad  
        Transform the cancel response API request into a URL and data

        Azure OpenAI API expects the following request:
        - POST /openai/responses/{response_id}/cancel?api-version=xxx

        This function handles URLs with query parameters by inserting the response_id
        at the correct location (before any query parameters).
        r   rN   rQ   z/cancelzcancel response url=)rR   rO   rP   rS   rT   rU   rV   rW   rX   rY   r   r8   )r   rM   rJ   r$   r#   rO   rP   rZ   rS   r[   Z
cancel_urlr`   r   r   r   %transform_cancel_response_api_request.  s    zCAzureOpenAIResponsesAPIConfig.transform_cancel_response_api_requestraw_responselogging_objc                 C   sF   z|  }W n ty   ddlm} ||j|jdw tdi |S )zX
        Transform the cancel response API response into a ResponsesAPIResponse
        r   )AzureOpenAIError)r?   status_codeNr   )jsonr7   Z*litellm.llms.azure.chat.gpt_transformationrr   textrs   ResponsesAPIResponse)r   rp   rq   Zraw_response_jsonrr   r   r   r   &transform_cancel_response_api_responseX  s   zDAzureOpenAIResponsesAPIConfig.transform_cancel_response_api_response)NNNrc   rd   )&__name__
__module____qualname__r   propertyr   r   strrC   r    r4   r   r   r%   r(   r   r   r<   r
   rE   rA   rI   rL   r\   r	   ra   rb   r   intr   rn   ro   httpxResponseLiteLLMLoggingObjrv   rw   __classcell__r   r   r!   r   r      s    
"(


"
!





	


#

*r   )copyr   r@   r   r   r   r   r   r   r	   r
   r~   Zopenai.types.responsesr   Zlitellm._loggingr   Zlitellm.llms.azure.common_utilsr   Z,litellm.llms.openai.responses.transformationr   Zlitellm.types.llms.openaiZlitellm.types.responses.mainZlitellm.types.routerr   Zlitellm.types.utilsr   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjr   r   r   r   r   r   <module>   s     (