Ë
    uPêjž7  ã                   óÈ   — d dl mZ d dl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­ d d	l­ d d
lmZ d dlmZ er	d dlmZ eZneZ G d„ de«      Zy)é    )Údeepcopy)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralN)ÚResponseReasoningItem)Úverbose_logger)Úencode_url_path_segment)ÚBaseAzureLLM)ÚOpenAIResponsesAPIConfig)Ú*)ÚGenericLiteLLMParams)ÚLlmProviders)ÚLoggingc                   óD  ‡ — e Zd ZdgZedefd„«       Zdedefˆ fd„Z	de
dededz  de
fd	„Zdedefd
„Zde
eef   de
eef   fd„Zdeez  deez  fˆ fd„Zdedeez  de
dede
de
fˆ fd„Zdedz  de
defd„Zdefd„Zdedz  de
defd„Zdefd„Zd&dedededefd„Zdededede
deee
f   f
d„Zdededede
deee
f   f
d„Z	 	 	 	 	 d'dededede
dedz  dedz  dee   dz  deded    deee
f   fd!„Zdededede
deee
f   f
d"„Zd#e jB                  d$e"de#fd%„Z$ˆ xZ%S )(ÚAzureOpenAIResponsesAPIConfigÚcontext_managementÚreturnc                 ó"   — t         j                  S )N)r   ÚAZURE©Úselfs    úp/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/azure/responses/transformation.pyÚcustom_llm_providerz1AzureOpenAIResponsesAPIConfig.custom_llm_provider   s   € ä×!Ñ!Ð!ó    Úmodelc                 ój   •— t         ‰| �  |«      }|D �cg c]  }|| j                  vsŒ|‘Œ c}S c c}w )zW
        Azure Responses API does not support context_management (compaction).
        )ÚsuperÚget_supported_openai_paramsÚAZURE_UNSUPPORTED_PARAMS)r   r   Úbase_supported_paramsÚparamÚ	__class__s       €r   r   z9AzureOpenAIResponsesAPIConfig.get_supported_openai_params    s6   ø€ ô (-¡wÑ'JÈ5Ó'QÐØ#8Ög˜%¸EÈ×IfÑIfÒ<f’ÒgÐgùÒgs   •0©0ÚheadersÚlitellm_paramsNc                 ó0   — t        j                  ||¬«      S )N)r$   r%   )r   Ú _base_validate_azure_environment)r   r$   r   r%   s       r   Úvalidate_environmentz2AzureOpenAIResponsesAPIConfig.validate_environment'   s   € Ü×<Ñ<ÀWÐ]kÔlÐlr   c                 ó^   — d|v r|j                  dd«      }d|v r|j                  dd«      }|S )Nz
responses/Ú Úo_seriesz	o_series/)Úreplace)r   r   s     r   Úget_stripped_model_namez5AzureOpenAIResponsesAPIConfig.get_stripped_model_name*   s7   € à˜5Ñ Ø—M‘M ,°Ó3ˆEØ˜ÑØ—M‘M +¨rÓ2ˆEØˆr   Úitemc                 ó  — |j                  d«      dk(  r–	 t        |«      }d|vrKt        |j                  dd«      «      dkD  r|j                  dd«      dd dz   n|j                  dd«      |d<   t        j                  |«      }|j                  d	¬
«      }|j                  dd«       |S |S # t        $ rR}t        j                  d|«       |j                  «       D ��ci c]  \  }}|€|dvr||“Œ nc c}}w }}}|cY d}~S d}~ww xY w)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.
        ÚtypeÚ	reasoningÚsummaryÚreasoning_contentr*   éd   Nz...T)Úexclude_noneÚstatuszLFailed to create ResponseReasoningItem, falling back to manual filtering: %s>   r6   ÚcontentÚencrypted_content)ÚgetÚdictÚlenr   Úmodel_validateÚ
model_dumpÚpopÚ	Exceptionr	   ÚdebugÚitems)	r   r.   Ú	item_dataÚreasoning_itemÚdict_reasoning_itemÚeÚkÚvÚfiltered_items	            r   Ú_handle_reasoning_itemz4AzureOpenAIResponsesAPIConfig._handle_reasoning_item2   s-  € ð �8‰8�FÓ˜{Ò*ð%ä#'¨£:�	Ø IÑ-ô ˜yŸ}™}Ð-@À"ÓEÓFÈÒLð "Ÿ™Ð&9¸2Ó>¸tÀÐDÀuÒLà&Ÿ]™]Ð+>ÀÓCð ˜iÑ(ô )>×(LÑ(LÈYÓ(W�ð .<×-FÑ-FÐTXÐ-FÓ-YÐ#Ø#×'Ñ'¨°$Ô7à*Ð*ð ˆøô ò %Ü×$Ñ$Ð%sÐuvÔwð !%§
¡
£÷(á˜˜1Ø�}¨Ð1[Ñ([ð �q‘Dñ(ùó (�ñ (ð
 %Õ$ûð%ús*   –BB- Â-	DÂ6)DÃC3Ã2DÃ=DÄDÚinputc                 ój  •— ddl m} t        ‰	| �  |«      }t	        |t
        «      r†g }|D ]r  }t	        |t        «      rO|j                  d«      dk(  r;|j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}|j                  |«       Œb|j                  |«       Œt  |t        |«      S |S c c}}w )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   )Úcastr0   Úmessager6   )ÚtypingrL   r   Ú_validate_input_paramÚ
isinstanceÚlistr:   r9   rA   ÚappendÚResponseInputParam)
r   rJ   rL   Úvalidated_inputÚfiltered_inputr.   rF   rG   rH   r#   s
            €r   rO   z3AzureOpenAIResponsesAPIConfig._validate_input_paramW   s²   ø€ õ
 	 ô "'¡Ñ!>¸uÓ!Eˆô �o¤tÔ,Ø/1ˆNØ'ò 0�Ü˜d¤DÔ)¨d¯h©h°vÓ.>À)Ò.Kà6:·j±j³l×$T©d¨a°ÀaÈ8Ãm Q¨¡TÐ$T�MÑ$TØ"×)Ñ)¨-Õ8à"×)Ñ)¨$Õ/ð0ñ Ô*¨NÓ;Ð;àÐùó %Us   Á%B/Á3B/Ú$response_api_optional_request_paramsc                 óf  •— | j                  |«      }d|v rˆt        |d   t        «      rug }|d   D ]f  }t        |t        «      rCd|v r?t	        |«      }	|	j                  d«      }
|	j                  |
«       |j                  |	«       ŒV|j                  |«       Œh ||d<   t        ‰| �%  |||||¬«      S )z<No transform applied since inputs are in OpenAI spec alreadyÚtoolsÚfunction)r   rJ   rV   r%   r$   )
r-   rP   rQ   r:   r   r>   ÚupdaterR   r   Útransform_responses_api_request)r   r   rJ   rV   r%   r$   Ústripped_model_nameÚ	new_toolsÚtoolÚnew_toolÚfunction_datar#   s              €r   r[   z=AzureOpenAIResponsesAPIConfig.transform_responses_api_requesto   sÒ   ø€ ð &*×%AÑ%AÀ%Ó%HÐð Ð:Ñ:¼zØ0°Ñ9¼4ô@
ð 68ˆIØ<¸WÑEò +�Ü˜d¤DÔ)¨j¸DÑ.@Ü/7¸«~�HØ$,§L¡L°Ó$<�MØ—O‘O MÔ2Ø×$Ñ$ XÕ.à×$Ñ$ TÕ*ð+ð =FÐ0°Ñ9ä‰wÑ6Ø%ØØ1UØ)Øð 7ó 
ð 	
r   Úapi_basec                 ó@   — ddl m} t        j                  ||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_VERSIONú/openai/responses)ra   r%   ÚrouteÚdefault_api_version)Úlitellm.constantsrc   r   Ú_get_base_azure_url)r   ra   r%   rc   s       r   Úget_complete_urlz.AzureOpenAIResponsesAPIConfig.get_complete_url‘   s'   € õ* 	Jä×/Ñ/ØØ)Ø%Ø Cô	
ð 	
r   c                  ó   — y)NT© r   s    r   Úsupports_native_websocketz7AzureOpenAIResponsesAPIConfig.supports_native_websocket¯   s   € Ør   c                 ó4  — |€t        d«      ‚t        j                  |«      }|j                  j	                  d«      }dD ]$  }|j                  |«      sŒ|dt        |«        } n |j                  dk(  rdnd}t        |j                  ||› d�d¬	«      «      S )
uÝ   
        Azure Responses WebSocket endpoint is at /openai/v1/responses with no
        api-version query param. Auth is via Authorization header, model is sent
        in the response.create body â€” not the URL.
        Nz(api_base is required for Azure WebSocketú/)ú/openai/v1/responsesrd   ÚhttpsÚwssÚwsro   )ÚschemeÚpathÚquery)
Ú
ValueErrorÚhttpxÚURLrt   ÚrstripÚendswithr;   rs   ÚstrÚ	copy_with)r   ra   r%   Ú
parsed_urlrt   Úsuffixrs   s          r   Úget_websocket_urlz/AzureOpenAIResponsesAPIConfig.get_websocket_url²   s¤   € ð ÐÜÐGÓHÐHä!ŸI™I hÓ/ˆ
Ø�‰×%Ñ% cÓ*ˆàCò 	ˆFØ�}‰}˜VÕ$Ø˜Nœs 6›{˜lÐ+�Ùð	ð ",×!2Ñ!2°gÒ!=™À4ˆÜ�:×'Ñ'¨v¸t¸fÐDXÐ<YÐaeÐ'ÓfÓgÐgr   c                  ó   — y)NFrk   r   s    r   Úmodel_in_websocket_urlz4AzureOpenAIResponsesAPIConfig.model_in_websocket_urlÉ   s   € àr   Úresponse_idÚpath_suffixc                 ó  — ddl m}m}  ||«      }|j                  j	                  d«      }t        |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Ú
urlunparsern   r‚   )Ú
field_name)Úurllib.parser…   r†   rt   ry   r
   rs   ÚnetlocÚparamsru   Úfragment)r   ra   r‚   rƒ   r…   r†   r}   rt   Úencoded_response_idÚnew_pathÚconstructed_urls              r   Ú&_construct_url_for_response_id_in_pathzDAzureOpenAIResponsesAPIConfig._construct_url_for_response_id_in_pathÐ   s–   € ÷ 	6ñ % XÓ.ˆ
ð !—o‘o×,Ñ,¨SÓ1ˆÜ%<¸[ÐUbÔ%cÐØ!˜F !Ð$7Ð#8¸¸ÐFˆñ ",à×!Ñ!Ø×!Ñ!ØØ×!Ñ!Ø× Ñ Ø×#Ñ#ðó	"
ˆð Ðr   c                 ó`   — | j                  ||¬«      }i }t        j                  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).
        ©ra   r‚   zdelete response url=%s©r�   r	   r@   )r   r‚   ra   r%   r$   Ú
delete_urlÚdatas          r   Ú%transform_delete_response_api_requestzCAzureOpenAIResponsesAPIConfig.transform_delete_response_api_requestì   s<   € ð  !×GÑGÐQYÐgrÐGÓsˆ
àˆÜ×ÑÐ5°zÔBØ˜4ÐÐr   c                 ó`   — | j                  ||¬«      }i }t        j                  d|«       ||fS )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=%sr’   )r   r‚   ra   r%   r$   Úget_urlr”   s          r   Ú"transform_get_response_api_requestz@AzureOpenAIResponsesAPIConfig.transform_get_response_api_request  s:   € ð ×DÑDÈhÐdoÐDÓpˆØˆÜ×ÑÐ2°GÔ<Ø˜ˆ}Ðr   ÚafterÚbeforeÚincludeÚlimitÚorder)ÚascÚdescc
                 óÆ   — | j                  ||d¬«      }
i }|�||d<   |�||d<   |rdj                  |«      |d<   |�||d<   |	�|	|d<   t        j                  d	|
«       |
|fS )
Nz/input_items©ra   r‚   rƒ   r™   rš   ú,r›   rœ   r�   zlist input items url=%s)r�   Újoinr	   r@   )r   r‚   ra   r%   r$   r™   rš   r›   rœ   r�   ÚurlrŠ   s               r   Ú"transform_list_input_items_requestz@AzureOpenAIResponsesAPIConfig.transform_list_input_items_request  s–   € ð ×@Ñ@Ø¨;ÀNð Aó 
ˆð )+ˆØÐØ#ˆF�7‰OØÐØ%ˆF�8ÑÙØ #§¡¨Ó 1ˆF�9ÑØÐØ#ˆF�7‰OØÐØ#ˆF�7‰OÜ×ÑÐ6¸Ô<Ø�Fˆ{Ðr   c                 ób   — | j                  ||d¬«      }i }t        j                  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).
        z/cancelr¡   zcancel response url=%sr’   )r   r‚   ra   r%   r$   Ú
cancel_urlr”   s          r   Ú%transform_cancel_response_api_requestzCAzureOpenAIResponsesAPIConfig.transform_cancel_response_api_request7  sD   € ð  !×GÑGØ¨;ÀIð Hó 
ˆ
ð ˆÜ×ÑÐ5°zÔBØ˜4ÐÐr   Úraw_responseÚlogging_objc                 ó°   — 	 |j                  «       }t        j                  |«      S # t        $ r% ddlm}  ||j                  |j
                  ¬«      ‚w xY w)zX
        Transform the cancel response API response into a ResponsesAPIResponse
        r   )ÚAzureOpenAIError)rM   Ústatus_code)Újsonr?   Ú*litellm.llms.azure.chat.gpt_transformationr¬   Útextr­   ÚResponsesAPIResponser<   )r   r©   rª   Úraw_response_jsonr¬   s        r   Ú&transform_cancel_response_api_responsezDAzureOpenAIResponsesAPIConfig.transform_cancel_response_api_responseO  sZ   € ð	dØ'3×'8Ñ'8Ó':Ðô
 $×2Ñ2Ð3DÓEÐEøô	 ò 	dÝSá"¨<×+<Ñ+<È,×JbÑJbÔcÐcð	dús	   ‚' §.A)r*   )NNNé   rŸ   )&Ú__name__Ú
__module__Ú__qualname__r    Úpropertyr   r   r{   rQ   r   r:   r   r(   r-   r   rI   rS   rO   r[   ri   Úboolrl   r   r�   r�   Útupler•   r˜   Úintr   r¥   r¨   rw   ÚResponseÚLiteLLMLoggingObjr±   r³   Ú__classcell__)r#   s   @r   r   r      s
  ø„ à 4Ð5Ðàð" \ò "ó ð"ðh°ð h¸õ hðm¨Dð m¸ð mÐNbÐeiÑNið mÐnró mð¨Sð °Só ð#¨4°°S°©>ð #¸dÀ3ÈÀ8¹nó #ðJ¨3Ð1CÑ+Cð ÈÐN`ÑH`õ ð0 
àð 
ð Ð'Ñ'ð 
ð /3ð	 
ð
 -ð 
ð ð 
ð 
õ 
ðD
à˜‘*ð
ð ð
ð 
ó	
ð<¨4ó ðhà˜‘*ðhð ðhð 
ó	hð.¨ó ñ¸sð ÐQTð Ðcfð Ðpsó ð8 àð ð ð ð -ð	 ð
 ð ð 
ˆs�DˆyÑ	ó ð2àðð ðð -ð	ð
 ðð 
ˆs�DˆyÑ	óð0 !Ø!Ø$(ØØ(.ñàðð ðð -ð	ð
 ðð �T‰zðð �d‘
ðð �c‘˜TÑ!ðð ðð �}Ñ%ðð 
ˆs�DˆyÑ	óð@ àð ð ð ð -ð	 ð
 ð ð 
ˆs�DˆyÑ	ó ð0Fà—n‘nðFð 'ðFð 
÷	Fr   r   )Úcopyr   rN   r   r   r   r   rw   Úopenai.types.responsesr   Úlitellm._loggingr	   Ú$litellm.litellm_core_utils.url_utilsr
   Úlitellm.llms.azure.common_utilsr   Ú,litellm.llms.openai.responses.transformationr   Úlitellm.types.llms.openaiÚlitellm.types.responses.mainÚlitellm.types.routerr   Úlitellm.types.utilsr   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjr½   r   rk   r   r   ú<module>rË      sO   ðÝ ß 5Ó 5ã Ý 8å +Ý HÝ 8Ý QÜ 'Ü *Ý 5Ý ,áÝXà*ÑàÐôEFÐ$<õ EFr   