Ë
    uPêj$Ä  ã                   ój  — d dl Z d dlZd dlmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZ d dlZ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mZ d d	l m!Z! d d
l"m#Z#m$Z$m%Z%m&Z& de'deee'      fd„Z(de'dee)e*e'f      fd„Z+de'dedz  fd„Z,de'de-fd„Z.de'de'fd„Z/ G d„ d«      Z0 G d„ d«      Z1y)é    N)ÚIterableÚMappingÚSequence)ÚAnyÚFinalÚOptionalÚUnionÚcastÚget_type_hintsÚoverload)Ú	BaseModel)ÚTypeIs)Úverbose_logger)ÚBaseResponsesAPIConfig)ÚAllMessageValuesÚOutputTokensDetailsÚResponseAPIUsageÚResponseInputParamÚ!ResponsesAPIOptionalRequestParamsÚResponsesAPIResponseÚResponsesAPIStreamOptionsÚResponseText)ÚDecodedResponseId)ÚCompletionTokensDetailsWrapperÚPromptTokensDetailsWrapperÚSpecialEnumsÚUsageÚvalueÚreturnc                 ó"   — t        | t        «      S ©N)Ú
isinstanceÚlist©r   s    ú\/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/responses/utils.pyÚ_is_object_sequencer&      s   € Ü�eœTÓ"Ð"ó    c                 ó"   — t        | t        «      S r!   )r"   Údictr$   s    r%   Ú_is_object_dictr*   #   s   € ô �eœTÓ"Ð"r'   Ústream_optionsc                 ó€   — t        | t        «      sy | j                  d«      }t        |t        «      sy t	        |¬«      S )NÚinclude_obfuscation)r-   )r"   r   ÚgetÚboolr   )r+   r-   s     r%   Ú&normalize_responses_api_stream_optionsr0   )   s=   € ô �n¤gÔ.ØØ!/×!3Ñ!3Ð4IÓ!JÐÜÐ)¬4Ô0ØÜ$Ð9LÔMÐMr'   Úpartc                 óN   — t        | t        «      xr | j                  d«      dk(  S )NÚtypeÚtext©r"   r)   r.   ©r1   s    r%   Ú_is_chat_text_partr7   4   s"   € Ü�dœDÓ!Ò@ d§h¡h¨vÓ&6¸&Ñ&@Ð@r'   c                 ó^   — t        | t        «      r| j                  d«      dk(  ri | ¥ddi¥S | S )Nr3   r4   Ú
input_textr5   r6   s    r%   Ú_as_input_text_partr:   8   s3   € Ü�$œÔ $§(¡(¨6Ó"2°fÒ"<Ø-�$Ð-˜ Ñ-Ð-Ø€Kr'   c                   ó²  — e Zd ZdZededefd„«       Zedeez  dz  de	e
   fd„«       Zedeez  d	e	e
   d
e	e
   de	e   fd„«       Zedeeef   dz  deeef   dz  deeef   dz  fd„«       Zede	e   dz  dededz  dedz  def
d„«       Ze	 	 dMdededede	e   dz  dedz  defd„«       Zedeeef   defd„«       Zee	 dNdededz  deeef   dz  defd„«       «       Zee	 dNdeeef   dedz  deeef   dz  deeef   fd„«       «       Ze	 dNdeeeef   z  dedz  deeef   dz  deeeef   z  fd„«       Zed ed!edefd"„«       Zed#edeeef   dz  fd$„«       Zed%ed edefd&„«       Zed'edeedz  ef   fd(„«       Zed)ed*eeef   f   d edz  ded*eeef   f   fd+„«       Zed,edefd-„«       Z ededz  d edz  d.edefd/„«       Z!ed.ede"fd0„«       Z#ed.edefd1„«       Z$ed.edz  dedz  fd2„«       Z%ed3edefd4„«       Z&ededz  d edz  d5edefd6„«       Z'ed5ede"fd7„«       Z(ed5edefd8„«       Z)ed9ededz  d edz  ddfd:„«       Z*ed;ededz  d edz  ddfd<„«       Z+ed=ededz  d edz  ddfd>„«       Z,ed9ed?e-e   ddfd@„«       Z.ed;ed?e-e   ddfdA„«       Z/ed=ed?e-e   ddfdB„«       Z0ed)ede	e   fdC„«       Z1e	 dNdeeeef   z  dedz  deeef   dz  deeeef   z  fdD„«       Z2e	 dNdEe3dF   ez  dz  dGe4dH   de4dH   fdI„«       Z5edJeeef   dz  dKe6e   dz  deedz  eeeeef   f   dz  eeef   dz  eeef   dz  f   fdL„«       Z7y)OÚResponsesAPIRequestUtilsz2Helper utils for constructing ResponseAPI requestsÚmessager   c                 ó  — t        | t        «      r| j                  d«      dk(  r| S | j                  d«      }t        |t        «      rt	        d„ |D «       «      s| S |D �cg c]  }t        |«      ‘Œ }}i | ¥d|i¥S c c}w )NÚroleÚ	assistantÚcontentc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr!   )r7   )Ú.0r1   s     r%   ú	<genexpr>zVResponsesAPIRequestUtils.shape_prompt_managed_message_for_responses.<locals>.<genexpr>F   s   è ø€ Ò3aÐQUÔ4FÀt×4LÑ3aùó   ‚)r"   r)   r.   r#   Úanyr:   )r=   rA   r1   Úshaped_contents       r%   Ú*shape_prompt_managed_message_for_responseszCResponsesAPIRequestUtils.shape_prompt_managed_message_for_responsesA   s}   € ä˜'¤4Ô(¨G¯K©K¸Ó,?À;Ò,NØˆNØ!Ÿ+™+ iÓ0ˆÜ˜'¤4Ô(´Ñ3aÐY`Ô3aÔ0aØˆNØGNÖ O¸tÔ!4°TÕ!:Ð OˆÐ OØ5�'Ð5˜9 nÑ5Ð5ùò !Ps   Á A<ÚinputNc                 óŒ   — | €g S t        | t        «      rd| dœgS | D �cg c]  }t        |t        «      sŒd|v sŒ|‘Œ c}S c c}w )NÚuser)r?   rA   r?   )r"   Ústrr)   )rI   Úitems     r%   Ú responses_input_to_chat_messagesz9ResponsesAPIRequestUtils.responses_input_to_chat_messagesK   sI   € ð ˆ=ØˆIÜ�eœSÔ!Ø#°Ñ6Ð7Ð7Ø!&ÖT˜¬*°T¼4Õ*@ÀVÈtÂ^’ÒTÐTùÒTs   ŸAµAºAÚoriginal_inputÚclient_inputÚmerged_inputc           
      óH  ‡‡— t         j                  }t        | t        «      r‰D �cg c]
  } ||«      ‘Œ c}S t	        | «      }t        d„ |D «       «      Št	        ˆfd„t        |«      D «       «      }t        |«      t        |«      k(  r‰D �cg c]
  } ||«      ‘Œ c}S |st        j                  d«       g |¢S t        |«      t        ‰«      k(  xr t        d„ t        |‰«      D «       «      }|rBt        t        |‰«      «      }t        |«      D �	�
cg c]  \  }	}
|	|v r |||	   «      n|
‘Œ c}
}	S t        ˆfd„|D «       «      }|rŽt        |«      D �	�ci c]$  \  }	}t        ||   «      ||	r||	dz
     dz   nd| “Œ& }}	}||d   dz   d  }‰D ��
cg c]/  }g |j                  t        |«      d	«      ¢ ||«      ‘­D ]  }
|
‘Œ Œ1 c}
}t        |«      z   S t        j                  d
«       ‰D �cg c]
  } ||«      ‘Œ c}S c c}w c c}w c c}
}	w c c}}	w c c}
}w c c}w )Nc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr!   ©Úid)rC   rM   s     r%   rD   zIResponsesAPIRequestUtils.merge_prompt_management_input.<locals>.<genexpr>`   s   è ø€ Ò*M¸¬2¨d¯8Ñ*MùrE   c              3   óD   •K  — | ]  \  }}t        |«      ‰v sŒ|–— Œ y ­wr!   rT   )rC   ÚindexrM   Úclient_item_idss      €r%   rD   zIResponsesAPIRequestUtils.merge_prompt_management_input.<locals>.<genexpr>a   s$   øè ø€ Ò!t©K¨E°4ÔXZÐ[_ÓX`ÐdsÒXs¤%Ñ!tùs   ƒ ™ zkPrompt management hook returned messages without Responses API input messages; merged messages were ignoredc              3   óö   K  — | ]q  \  }}|j                  d «      |j                  d «      k(  xrE t        |j                  d«      t        «       xs# |j                  d«      |j                  d«      k(  –— Œs y­w)r?   rU   N)r.   r"   rL   )rC   ÚoriginalÚmergeds      r%   rD   zIResponsesAPIRequestUtils.merge_prompt_management_input.<locals>.<genexpr>k   sy   è ø€ ò W
ñ !�˜&ð �L‰L˜Ó  F§J¡J¨vÓ$6Ñ6ò dÜ §¡¨TÓ 2´CÓ8Ð8Òb¸H¿L¹LÈÓ<NÐRX×R\ÑR\Ð]aÓRbÑ<bódñW
ùs   ‚A7A9c              3   óH   •‡K  — | ]  Št        ˆfd „‰D «       «      –— Œ y­w)c              3   ó&   •K  — | ]  }‰|u –— Œ
 y ­wr!   © )rC   r[   rZ   s     €r%   rD   zSResponsesAPIRequestUtils.merge_prompt_management_input.<locals>.<genexpr>.<genexpr>w   s   øè ø€ Ò(WÀ¨°VÔ);Ñ(Wùs   ƒN)rF   )rC   rZ   rQ   s    @€r%   rD   zIResponsesAPIRequestUtils.merge_prompt_management_input.<locals>.<genexpr>w   s   ùè ø€ Ò$uÐ\d¤SÓ(WÈ,Ô(W×%WÑ$uùs   „"é   r   éÿÿÿÿr^   z\Prompt management hook replaced Responses API messages; non-message input items were dropped)r<   rH   r"   rL   ÚtupleÚ	frozensetÚ	enumerateÚlenr   ÚwarningÚallÚzipr)   rU   r.   r#   )rO   rP   rQ   Úshaper=   Úoriginal_itemsÚmessage_positionsÚcorresponding_messagesÚmerged_by_positionrW   rM   Úall_messages_preservedÚpositionÚprefixesÚtrailing_itemsr[   rX   s     `             @r%   Úmerge_prompt_management_inputz6ResponsesAPIRequestUtils.merge_prompt_management_inputU   sc  ù€ ô 0×ZÑZˆÜ�n¤cÔ*Ø2>Ö? w‘E˜'•NÒ?Ð?ä % nÓ 5ˆÜ!*Ñ*MÀÔ*MÓ!MˆÜ!Ó!t¼9À^Ó;TÔ!tÓtÐäÐ Ó!¤S¨Ó%8Ò8Ø2>Ö? w‘E˜'•NÒ?Ð?Ù Ü×"Ñ"Ø}ôð %�^Ð$Ð$ä(+¨LÓ(9¼SÀÓ=NÑ(Nò )
ÔSVñ W
ô %(¨°lÓ$CôW
ó T
Ðñ
 "Ü(,¬SÐ1BÀLÓ-QÓ(RÐô $-¨^Ó#<÷á�E˜4ð 5:Ð=OÑ4O‘Ð(¨Ñ/Ô0ÐUYÑYóð ô
 "%Ó$uÐhtÔ$uÓ!uÐÙ!ô
 (1Ð1BÓ'C÷	ñ $�E˜8ô �> (Ñ+Ó,¨nÙ8=Ð% e¨a¡iÑ0°1Ò4À1Àxð/ñ ðˆHñ ð %3Ð3DÀRÑ3HÈ1Ñ3LÐ3NÐ$OˆNØ'3×o˜VÐ@nÀ(Ç,Á,ÌrÐRXËzÐ[]ÓB^Ð@nÑ`eÐflÓ`mÑ@nÒo¸’DÐo�DÓoÔrvØósñ ð ô 	×ÑØjô	
ð /;Ö; 7‘�g•Ò;Ð;ùòU @ùò @ùóùóùó pùò <s#   §HÂHÄHÅ)HÆ4HÇ1HÚextra_headersÚclient_headersc                 óÊ   — |s| S | st        |«      S t        d„ | D «       «      }i |j                  «       D ��ci c]  \  }}|j                  «       |vsŒ||“Œ c}}¥| ¥S c c}}w )aA  
        Merge headers forwarded by the proxy (`headers` kwarg, set when
        `forward_client_headers_to_llm_api` is enabled) into `extra_headers`.

        `extra_headers` wins on conflicts, since it is set explicitly by the caller.
        Header names are compared case-insensitively, as HTTP defines them.
        c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr!   )Úlower)rC   Únames     r%   rD   zJResponsesAPIRequestUtils.merge_client_forwarded_headers.<locals>.<genexpr>™   s   è ø€ Ò)Q¸4¨$¯*©*¯,Ñ)Qùs   ‚)r)   rb   Úitemsrv   )rr   rs   Úexplicit_namesrw   r   s        r%   Úmerge_client_forwarded_headersz7ResponsesAPIRequestUtils.merge_client_forwarded_headers‰   sr   € ñ Ø Ð ÙÜ˜Ó'Ð'Ü )Ñ)QÀ=Ô)QÓ Qˆð
Ø.<×.BÑ.BÓ.D×k™{˜t UÈÏ
É
ËÐ\jÒHjˆt�U‰{Ókð
àð
ð 	
ùÛks   ¸AÁAÚsupported_paramsÚnon_default_paramsÚdrop_paramsÚcustom_llm_providerÚmodelc           	      ó¬   — | €y i }|D ]  }|| vsŒ||   ||<   Œ |r9t         j                  du s|�|du ry t        j                  d|› d|› d|› d�¬«      ‚y )NTiô  z does not support parameters: z, for model=zf. To drop these, set `litellm.drop_params=True` or for proxy:

`litellm_settings:
 drop_params: true`
)Ústatus_coder=   )Úlitellmr}   ÚUnsupportedParamsError)r{   r|   r}   r~   r   Úunsupported_paramsÚks          r%   Ú_check_valid_argz)ResponsesAPIRequestUtils._check_valid_argŸ   sž   € ð Ð#ØØ$&ÐØ#ò 	>ˆAØÐ(Ò(Ø(:¸1Ñ(=Ð" 1Ò%ð	>ñ Ü×"Ñ" dÑ*¨{Ð/FÈ;ÐZ^ÑK^Øä×4Ñ4Ø #Ø2Ð3Ð3QÐRdÐQeÐeqÐrwÐqxð  ycð  dôð ð	 r'   Úresponses_api_provider_configÚresponse_api_optional_paramsÚallowed_openai_paramsc                 óÀ  — ddl m} |j                  | «      }t        j                  xs |du }t        t        |«      }t        j                  ||xs g z   |||j                  | ¬«       |j                  || |¬«      }	t        |	j                  d«      «      }
i |	j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}¥|
€i nd|
i¥} ||||xs g ¬«      S c c}}w )aS  
        Get optional parameters for the responses API.

        Args:
            params: Dictionary of all parameters
            model: The model name
            responses_api_provider_config: The provider configuration for responses API

        Returns:
            A dictionary of supported parameters for the responses API
        r   )Ú_apply_openai_param_overridesT)r{   r|   r}   r~   r   )rˆ   r   r}   r+   )Úoptional_paramsr|   r‰   )Úlitellm.utilsr‹   Úget_supported_openai_paramsr‚   r}   r
   r)   r<   r†   r~   Úmap_openai_paramsr0   r.   rx   )r   r‡   rˆ   r‰   r}   r‹   r{   Úshould_drop_paramsr|   Úmapped_paramsr+   Úkeyr   Ú%params_with_normalized_stream_optionss                 r%   Ú!get_optional_params_responses_apiz:ResponsesAPIRequestUtils.get_optional_params_responses_api¶   s  € õ& 	@ð #@×"[Ñ"[Ð\aÓ"bÐä$+×$7Ñ$7Ò$N¸;È$Ð;NÐä$(¬Ð/KÓ$LÐä ×1Ñ1Ø-Ð1FÒ1LÈ"ÑMØ1Ø*Ø =× QÑ QØð 	2ô 	
ð  =×NÑNØ)EØØ*ð  Oó  
ˆô !GÀ}×GXÑGXÐYiÓGjÓ kˆð8
Ø,9×,?Ñ,?Ó,A×]™j˜c 5ÀSÐL\ÓE\ˆs�E‰zÓ]ð8
à#Ð+‰rÐ2BÀNÐ1Sð8
Ð-ñ -ØAØ1Ø"7Ò"=¸2ô
ð 	
ùó ^s   Â+CÂ9CÚparamsc                 óÌ  — ddl m} t        t        «      j	                  «       }| j                  dd«      }| j                  di «      }| j                  dd«      }|j                  | ||||D �ci c]  }|d“Œ c}dg¬«      }d	|v rt        j                  |d	   «      }||d	<   d
|v r+ddl m	}	  |	|d
   «      }
|
�|
|d
<   n|j                  d
d«       t        t        |«      S c c}w )a  
        Filter parameters to only include those defined in ResponsesAPIOptionalRequestParams.

        Args:
            params: Dictionary of parameters to filter

        Returns:
            ResponsesAPIOptionalRequestParams instance with only the valid parameters
        r   )ÚPreProcessNonDefaultParamsr~   NÚkwargsÚadditional_drop_paramsrI   )Úpassed_paramsÚspecial_paramsr~   r™   Údefault_param_valuesÚ#additional_endpoint_specific_paramsÚprevious_response_idÚmetadata)Úadd_openai_metadata)r�   r—   r   r   ÚkeysÚpopÚ#base_pre_process_non_default_paramsr<   Ú<decode_previous_response_id_to_original_previous_response_idr    r
   )r•   r—   Ú
valid_keysr~   r›   r™   r…   r|   Údecoded_previous_response_idr    Úconverted_metadatas              r%   Ú)get_requested_response_api_optional_paramzBResponsesAPIRequestUtils.get_requested_response_api_optional_paramï   s  € õ 	=ä*Ô+LÓM×RÑRÓTˆ
Ø%+§Z¡ZÐ0EÀtÓ%LÐØ39·:±:¸hÈÓ3Kˆà:@¿*¹*ÐE]Ð_cÓ:dÐØ$>×$bÑ$bØ Ø)Ø 3Ø#9Ø3=Ö!>¨a ! T¡'Ò!>Ø18°	ð %có %
Ðð "Ð%7Ñ7ä(×eÑeØ&Ð'=Ñ>óð )ð
 :VÐÐ5Ñ6àÐ+Ñ+Ý9á(;Ð<NÈzÑ<ZÓ([ÐØ!Ð-Ø1CÐ" :Ò.à"×&Ñ& z°4Ô8äÔ5Ð7IÓJÐJùò- "?s   Á-
C!Úresponses_api_responseÚlitellm_metadatac                  ó   — y r!   r^   ©r©   r~   rª   s      r%   Ú/_update_responses_api_response_id_with_model_idzHResponsesAPIRequestUtils._update_responses_api_response_id_with_model_id!  ó   € ð 	r'   c                  ó   — y r!   r^   r¬   s      r%   r­   zHResponsesAPIRequestUtils._update_responses_api_response_id_with_model_id*  r®   r'   c                 óÞ  — |xs i }|j                  di «      xs i }|j                  d«      }t        | t        «      r| j                  d«      }nt        | dd«      }|€| S t        j                  |«      r| S t        j                  |||¬«      }t        | t        «      r|| d<   n|| _        |j                  d«      rt        j                  | |¬«      } t        j                  | ||¬«      } | S )zÐUpdate the responses_api_response_id with model_id and custom_llm_provider.

        Handles both ``ResponsesAPIResponse`` objects and plain dictionaries returned
        by some streaming providers.
        Ú
model_inforU   N)Úmodel_idr~   Úresponse_idÚ"encrypted_content_affinity_enabled)Úresponser²   r¬   )
r.   r"   r)   Úgetattrr<   Ú_is_litellm_encoded_response_idÚ _build_responses_api_response_idrU   Ú._update_encrypted_content_item_ids_in_responseÚ!_update_container_ids_in_response)r©   r~   rª   r±   r²   r³   Ú
updated_ids          r%   r­   zHResponsesAPIRequestUtils._update_responses_api_response_id_with_model_id5  s  € ð ,Ò1¨rÐØ,<×,@Ñ,@ÀÈrÓ,RÒ,XÐVXˆ
Ø$Ÿ.™.¨Ó.ˆô Ð,¬dÔ3Ø0×4Ñ4°TÓ:‰Kä!Ð"8¸$ÀÓEˆKð ÐØ)Ð)ä#×CÑCÀKÔPØ)Ð)ä4×UÑUØØ 3Ø#ð Vó 
ˆ
ô Ð,¬dÔ3Ø+5Ð" 4Ò(à(2Ð"Ô%à×ÑÐ DÔEÜ%=×%lÑ%lØ/Ø!ð &mó &Ð"ô ":×![Ñ![Ø#9Ø 3Ø-ð "\ó "
Ðð &Ð%r'   r²   Úitem_idc                 ó‚   — d| › d|› �}t        j                  |j                  d«      «      j                  d«      }d|› �S )z§Encode model_id into an output item ID for encrypted-content items.

        Format: ``encitem_{base64("litellm:model_id:{model_id};item_id:{original_id}")}``
        úlitellm:model_id:z	;item_id:úutf-8Úencitem_©Úbase64Ú	b64encodeÚencodeÚdecode)r²   r¼   Ú	assembledÚencodeds       r%   Ú_build_encrypted_item_idz1ResponsesAPIRequestUtils._build_encrypted_item_idk  sI   € ð /¨x¨j¸	À'ÀÐKˆ	Ü×)Ñ)¨)×*:Ñ*:¸7Ó*CÓD×KÑKÈGÓTˆØ˜'˜Ð#Ð#r'   Ú
encoded_idc                 óž  — | j                  d«      sy	 | t        d«      d }t        |«      dz  }|r|dd|z
  z  z  }t        j                  |j	                  d«      «      j                  d«      }|j                  dd«      }t        |«      dk  ry|d	   j                  d
d«      }|d   j                  dd«      }||dœS # t        $ r Y yw xY w)zÀDecode a litellm-encoded encrypted-content item ID.

        Returns a dict with ``model_id`` and ``item_id`` keys, or ``None`` if
        the string is not a litellm-encoded item ID.
        rÀ   Né   ú=r¿   ú;r_   é   r   r¾   Ú zitem_id:)r²   r¼   )	Ú
startswithrd   rÂ   Ú	b64decoderÄ   rÅ   ÚsplitÚreplaceÚ	Exception)rÉ   ÚcleanedÚmissingÚdecodedÚpartsr²   r¼   s          r%   Ú_decode_encrypted_item_idz2ResponsesAPIRequestUtils._decode_encrypted_item_idu  sÛ   € ð ×$Ñ$ ZÔ0Øð	Ø ¤ Z£Ð!2Ð3ˆGä  ›\¨AÑ-ˆGÙØ˜3 ! g¡+Ñ.Ñ.�Ü#×-Ñ-¨g¯n©n¸WÓ.EÓF×MÑMÈgÓVˆGà"Ÿ=™=¨¨aÓ0ˆEÜ�5‹z˜AŠ~ØØ# A™h×.Ñ.Ð/BÀBÓGˆHØ" 1™X×-Ñ-¨j¸"Ó=ˆGØ (°WÑ=Ð=øÜò 	Ùð	ús   ”A<C  Â.C  Ã 	CÃCÚencrypted_contentc                 ó‚   — d|› �}t        j                  |j                  d«      «      j                  d«      }d|› d| › �S )aG  Wrap encrypted_content with model_id metadata for affinity routing.

        When Codex or other clients send items with encrypted_content but no ID,
        we encode the model_id directly into the encrypted_content itself.

        Format: ``litellm_enc:{base64("model_id:{model_id}")};{original_encrypted_content}``
        ú	model_id:r¿   úlitellm_enc:rÍ   rÁ   )rÚ   r²   rŸ   Úencoded_metadatas       r%   Ú%_wrap_encrypted_content_with_model_idz>ResponsesAPIRequestUtils._wrap_encrypted_content_with_model_id�  sM   € ð & h ZÐ0ˆÜ"(×"2Ñ"2°8·?±?À7Ó3KÓ"L×"SÑ"SÐT[Ó"\ÐØÐ.Ð/¨qÐ1BÐ0CÐDÐDr'   Úwrapped_contentc                 ó˜  — | j                  d«      sd| fS 	 | j                  dd«      }t        |«      dk  rd| fS |d   j                  dd«      }|d   }t        |«      dz  }|r|d	d|z
  z  z  }t	        j
                  |j                  d
«      «      j                  d
«      }|j                  dd«      }||fS # t        $ r d| fcY S w xY w)zØUnwrap encrypted_content to extract model_id and original content.

        Returns:
            Tuple of (model_id, original_encrypted_content).
            If not wrapped, returns (None, original_content).
        rÝ   NrÍ   r_   rÎ   r   rÏ   rË   rÌ   r¿   rÜ   )	rÐ   rÒ   rd   rÓ   rÂ   rÑ   rÄ   rÅ   rÔ   )rà   rØ   Úmetadata_b64Úoriginal_contentrÖ   Údecoded_metadatar²   s          r%   Ú'_unwrap_encrypted_content_with_model_idz@ResponsesAPIRequestUtils._unwrap_encrypted_content_with_model_idœ  sñ   € ð ×)Ñ)¨.Ô9Ø˜Ð(Ð(ð	)à*×0Ñ0°°aÓ8ˆEÜ�5‹z˜AŠ~Ø˜_Ð,Ð,à  ™8×+Ñ+¨N¸BÓ?ˆLØ&+¨A¡hÐô ! Ó.°Ñ2ˆGÙØ  q¨7¡{Ñ 3Ñ3�ä&,×&6Ñ&6°|×7JÑ7JÈ7Ó7SÓ&T×&[Ñ&[Ð\cÓ&dÐØ.×6Ñ6°{ÀBÓGˆHØÐ-Ð-Ð-øÜò 	)Ø˜Ð(Ò(ð	)ús   —#B9 »A=B9 Â9C	ÃC	rµ   r   c                 óò  — |s| S d}t        | t        «      r| j                  d«      }nt        | dd«      }t        |t        «      s| S |D �]
  }t        |t        «      r}|j                  d«      }|j                  d«      }|sŒ9t        |t
        «      sŒJt        j                  ||«      |d<   |sŒft        |t
        «      sŒwt        j                  ||«      |d<   Œ‘t        |dd«      }t        |dd«      }|sŒ®t        |t
        «      sŒ¿	 t        j                  ||«      |_	        |sŒÞt        |t
        «      sŒï	 t        j                  ||«      |_        �Œ | S # t        $ r Y Œ@w xY w# t        $ r Y �Œ+w xY w)ae  Rewrite item IDs for output items that contain ``encrypted_content``.

        Encodes ``model_id`` into the item ID so that follow-up requests can be
        routed back to the originating deployment without any cache lookup.

        For items without an ID (e.g., from Codex), encodes model_id directly
        into the encrypted_content itself.
        NÚoutputrU   rÚ   )r"   r)   r.   r¶   r#   rL   r<   rß   rÈ   rÚ   ÚAttributeErrorrU   )rµ   r²   rç   rM   r¼   rÚ   s         r%   r¹   zGResponsesAPIRequestUtils._update_encrypted_content_item_ids_in_response½  sj  € ñ ØˆOàˆÜ�h¤Ô%Ø—\‘\ (Ó+‰Fä˜X x°Ó6ˆFä˜&¤$Ô'ØˆOàó 	!ˆDÜ˜$¤Ô%ØŸ(™( 4›.�Ø$(§H¡HÐ-@Ó$AÐ!â$¬Ð4EÄsÕ)Kä0H×0nÑ0nØ)¨8ó1�DÐ,Ñ-ò ¤:¨g´sÕ#;Ü%=×%VÑ%VÐW_ÐahÓ%i˜˜Tš
ä! $¨¨dÓ3�Ü$+¨DÐ2EÀtÓ$LÐ!â$¬Ð4EÄsÕ)KðÜ1I×1oÑ1oØ-¨xó2˜Ô.ò ¤:¨g´sÕ#;ð!Ü&>×&WÑ&WÐX`ÐbiÓ&j˜DžGð9	!ð@ ˆøô *ò Ùðûô  .ò !Ú ð!ús$   Ä
EÄ:E)Å	E&Å%E&Å)	E6Å5E6Úrequest_inputc                 ón  — t        | t        «      s| S | D ]�  }t        |t        «      sŒ|j                  d«      }|r/t        |t        «      rt
        j                  |«      }|r|d   |d<   |j                  d«      }|sŒjt        |t        «      sŒ{t
        j                  |«      \  }}||k7  sŒ™||d<   ŒŸ | S )aw  Decode litellm-encoded item IDs in request input back to original IDs.

        Called before forwarding the request to the upstream provider so the
        provider receives the original item IDs and unwrapped encrypted_content.

        Handles both:
        1. Items with encoded IDs (encitem_...)
        2. Items with wrapped encrypted_content (litellm_enc:...)
        rU   r¼   rÚ   )r"   r#   r)   r.   rL   r<   rÙ   rå   )ré   rM   r¼   r×   rÚ   Ú_Ú	unwrappeds          r%   Ú,_restore_encrypted_content_item_ids_in_inputzEResponsesAPIRequestUtils._restore_encrypted_content_item_ids_in_inputø  s½   € ô ˜-¬Ô.Ø Ð à!ò 	>ˆDÜ˜$¤Õ%ØŸ(™( 4›.�Ùœz¨'´3Ô7Ü6×PÑPÐQXÓY�GÙØ%,¨YÑ%7˜˜T™
à$(§H¡HÐ-@Ó$AÐ!Ú$¬Ð4EÄsÕ)Kô 1×XÑXÐYjÓkñØØ!à Ð$5Ó5Ø4=˜Ð0Ò1ð	>ð" Ðr'   r³   c                 óÚ   — t        t        j                  j                  «      j	                  | ||«      }t        j                  |j                  d«      «      j                  d«      }d|› �S )z#Build the responses_api_response_idr¿   Úresp_)	rL   r   Ú%LITELLM_MANAGED_RESPONSE_COMPLETE_STRr   ÚformatrÂ   rÃ   rÄ   rÅ   )r~   r²   r³   Úassembled_idÚbase64_encoded_ids        r%   r¸   z9ResponsesAPIRequestUtils._build_responses_api_response_id  se   € ô $'¤|×'YÑ'Y×'_Ñ'_Ó#`×#gÑ#gØ ¨;ó$
ˆô )/×(8Ñ(8¸×9LÑ9LÈWÓ9UÓ(V×(]Ñ(]Ð^eÓ(fÐØÐ(Ð)Ð*Ð*r'   c                 ó  — 	 | j                  dd«      }t        j                  |j                  d«      «      j	                  d«      }d|vrt        dd| ¬«      S |j                  d«      }d}d}t        |«      dk\  rF|d   }|d	   }|d
   }|j                  dd«      }|j                  dd«      }|j                  dd«      }	n| }	t        |||	¬«      S # t        $ r/}
t        j                  d| |
«       t        dd| ¬«      cY d}
~
S d}
~
ww xY w)z¬
        Decode the responses_api_response_id

        Returns:
            DecodedResponseId: Structured tuple with custom_llm_provider, model_id, and response_id
        rï   rÏ   r¿   rÍ   N©r~   r²   r³   é   r   r_   rÎ   úlitellm:custom_llm_provider:rÜ   zresponse_id:z#Error decoding response_id '%s': %s)rÓ   rÂ   rÑ   rÄ   rÅ   r   rÒ   rd   rÔ   r   Údebug)r³   Ú
cleaned_idÚ
decoded_idrØ   r~   r²   Úcustom_llm_provider_partÚmodel_id_partÚresponse_partÚdecoded_response_idÚes              r%   Ú!_decode_responses_api_response_idz:ResponsesAPIRequestUtils._decode_responses_api_response_id&  s8  € ð)	à +× 3Ñ 3°G¸RÓ @ˆJÜ &× 0Ñ 0°×1BÑ1BÀ7Ó1KÓ L× SÑ SÐT[Ó \ˆJð ˜*Ñ$Ü(Ø(,Ø!Ø +ôð ð &×+Ñ+¨CÓ0ˆEð #'ÐØˆHä�5‹z˜QŠØ27¸±(Ð(Ø',¨Q¡x�Ø',¨Q¡x�à&>×&FÑ&FÐGeÐgiÓ&jÐ#Ø(×0Ñ0°¸bÓA�Ø&3×&;Ñ&;¸NÈBÓ&OÑ#à&1Ð#ä$Ø$7Ø!Ø/ôð øô
 ò 	Ü× Ñ Ð!FÈÐUVÔWÜ$Ø$(ØØ'ôõ ûð	ús%   ‚AC ÁA8C Ã	D
Ã$DÃ?D
ÄD
c                 ó|   — t         j                  | «      }|j                  d«      d uxs |j                  d«      d uS )Nr²   r~   ©r<   r   r.   ©r³   rþ   s     r%   r·   z8ResponsesAPIRequestUtils._is_litellm_encoded_response_id[  sF   € ä%=×%_Ñ%_Ð`kÓ%lÐà×#Ñ# JÓ/°tÐ;ò JØ"×&Ñ&Ð'<Ó=ÀTÐIð	
r'   c                 ó\   — | €yt         j                  | «      }|j                  d«      xs dS )z%Get the model_id from the response_idNr²   r  r  s     r%   Úget_model_id_from_response_idz6ResponsesAPIRequestUtils.get_model_id_from_response_idc  s5   € ð ÐØÜ%=×%_Ñ%_Ð`kÓ%lÐØ"×&Ñ& zÓ2Ò:°dÐ:r'   rž   c                 óP   — t         j                  | «      }|j                  d| «      S )aS  
        Decode the previous_response_id to the original previous_response_id

        Why?
            - LiteLLM encodes the `custom_llm_provider` and `model_id` into the `previous_response_id` this helps with maintaining session consistency when load balancing multiple deployments of the same model.
            - We cannot send the litellm encoded b64 to the upstream llm api, hence we decode it to the original `previous_response_id`

        Args:
            previous_response_id: The previous_response_id to decode

        Returns:
            The original previous_response_id
        r³   r  )rž   rþ   s     r%   r¤   zUResponsesAPIRequestUtils.decode_previous_response_id_to_original_previous_response_idk  s*   € ô" &>×%_Ñ%_Ð`tÓ%uÐØ"×&Ñ& }Ð6JÓKÐKr'   Úcontainer_idc                 ó    — | €dn| }|€dn|}d|› d|› d|› �}t        j                  |j                  d«      «      j                  d«      }d|› �S )z½Build a managed container ID with provider and model info encoded.

        Format: cntr_{base64("litellm:custom_llm_provider:{provider};model_id:{model};container_id:{original}")}
        rÏ   r÷   z
;model_id:z;container_id:r¿   Úcntr_rÁ   )r~   r²   r  Úprovider_partÚ
model_partrò   ró   s          r%   Ú_build_container_idz,ResponsesAPIRequestUtils._build_container_id  so   € ð &9Ð%@™rÐFYˆØ"*Ð"2™B¸ˆ
Ø5°m°_ÀJÈzÈlÐZhÐiuÐhvÐwˆÜ#)×#3Ñ#3°L×4GÑ4GÈÓ4PÓ#Q×#XÑ#XÐY`Ó#aÐØÐ(Ð)Ð*Ð*r'   c                 ór  — 	 | j                  d«      st        dd| ¬«      S | j                  dd«      }t        j                  |j                  d«      «      j                  d«      }|j                  d«      st        dd| ¬«      S d}t        j                  ||«      }|st        dd| ¬«      S |j                  d«      }|j                  d	«      }|d
v rdn|}|d
v rdn|}|j                  d«      }	t        |||	¬«      S # t        $ r/}
t        j                  d| |
«       t        dd| ¬«      cY d}
~
S d}
~
ww xY w)zÙDecode a managed container ID to extract provider, model, and original container ID.

        Returns:
            DecodedResponseId with custom_llm_provider, model_id, and response_id (original container_id)
        r	  Nrõ   rÏ   r¿   zlitellm:zH^litellm:custom_llm_provider:([^;]*);model_id:([^;]*);container_id:(.+)$r_   rÎ   )rÏ   ÚNonerö   z$Error decoding container_id '%s': %s)rÐ   r   rÓ   rÂ   rÑ   rÄ   rÅ   ÚreÚmatchÚgrouprÔ   r   rø   )r  rù   rú   Úpatternr  Úraw_providerÚraw_model_idr~   r²   Úoriginal_container_idrÿ   s              r%   Ú_decode_container_idz-ResponsesAPIRequestUtils._decode_container_id�  sW  € ð3	à×*Ñ*¨7Ô3Ü(Ø(,Ø!Ø ,ôð ð !-× 4Ñ 4°W¸bÓ AˆJÜ &× 0Ñ 0°×1BÑ1BÀ7Ó1KÓ L× SÑ SÐT[Ó \ˆJð ×(Ñ(¨Ô4Ü(Ø(,Ø!Ø ,ôð ð iˆGÜŸ8™8 G¨ZÓ8ˆEáÜ(Ø(,Ø!Ø ,ôð ð #(§+¡+¨a£.ˆLØ"'§+¡+¨a£.ˆLØ1=ÀÑ1M©ÐS_ÐØ&2°lÑ&B™dÈˆHØ+0¯;©;°q«>Ð!ä$Ø$7Ø!Ø1ôð øô
 ò 	Ü× Ñ Ð!GÈÐWXÔYÜ$Ø$(ØØ(ôõ ûð	ús0   ‚C> ¡A#C> Â'C> Â-AC> Ã>	D6Ä$D1Ä+D6Ä1D6c                 óP   — t         j                  | «      }|j                  d| «      S )zêDecode a managed container ID to get the original provider-issued ID.

        This is used when making upstream API calls - we need to send the original
        container ID that the provider issued, not our encoded version.
        r³   )r<   r  r.   )r  r×   s     r%   Údecode_container_id_to_originalz8ResponsesAPIRequestUtils.decode_container_id_to_originalÌ  s%   € ô 2×FÑFÀ|ÓTˆØ�{‰{˜=¨,Ó7Ð7r'   Úannotationsc                 ó\   — | rt        | «      sy| D ]  }t        j                  |||«       Œ y)zNEncode ``container_id`` on each annotation (e.g. ``container_file_citation``).N)r&   r<   Ú#_encode_container_id_on_output_item)r  r~   r²   Úanns       r%   Ú$_encode_container_ids_in_annotationsz=ResponsesAPIRequestUtils._encode_container_ids_in_annotationsÖ  s8   € ñ Ô"5°kÔ"BØØò 	ˆCÜ$×HÑHØØ#Øõñ	r'   rA   c                 óØ   — | syt        | «      r\| D ]V  }t        |«      r't        j                  |j	                  d«      ||«       Œ5t        j                  t        |dd«      ||«       ŒX yy)zKWalk message ``content`` parts and encode citation ``container_id`` values.Nr  )r&   r*   r<   r  r.   r¶   )rA   r~   r²   r1   s       r%   Ú(_encode_container_ids_in_message_contentzAResponsesAPIRequestUtils._encode_container_ids_in_message_contentæ  sp   € ñ ØÜ˜wÔ'Øò �Ü" 4Ô(Ü,×QÑQØŸ™ Ó/Ø+Ø õô -×QÑQÜ  m°TÓ:Ø+Ø õñð (r'   rM   c                 ó&  ‡‡— | €ydt         dt         dz  fˆˆfd„}t        | «      r·| j                  d«      }t        |t         «      r ||«      }|�|| d<   | j                  d«      }t        |«      r0|j                  d«      }t        |t         «      r ||«      }|�||d<   | j                  d«      dk(  r&t        j                  | j                  d«      ‰‰«       yt        | dd«      }t        |t         «      r ||«      }|�	 t        | d|«       t        | dd«      }	|	�t        j                  |	‰‰«       t        | dd«      dk(  r#t        j                  t        | dd«      ‰‰«       yy# t        $ r t        j                  d	d
¬«       Y Œ|w xY w)a1  Mutate one output item (dict or object): wrap raw ``container_id`` as LiteLLM-managed.

        Handles top-level ``container_id`` and nested ``code_interpreter_call.container_id``
        (some wire payloads nest the tool call). Used by non-streaming responses and by
        streaming ``response.output_item.*`` events so UIs see managed IDs incrementally.

        For ``message`` items, also encodes ``container_id`` inside
        ``content[].annotations`` (``container_file_citation``), which is what clients use
        to fetch generated files.
        Nr  r   c                 ó‚   •— t         j                  | «      }|j                  d«      �y t         j                  ‰‰| ¬«      S )Nr~   )r~   r²   r  )r<   r  r.   r  )r  r×   r~   r²   s     €€r%   Ú_maybe_encodezSResponsesAPIRequestUtils._encode_container_id_on_output_item.<locals>._maybe_encode  sH   ø€ Ü5×JÑJÈ<ÓXˆGØ�{‰{Ð0Ó1Ð=ØÜ+×?Ñ?Ø$7Ø!Ø)ð @ó ð r'   Úcode_interpreter_callr3   r=   rA   z3Could not set container_id on streaming output itemT)Úexc_info)rL   r*   r.   r"   r<   r  r¶   ÚsetattrrÔ   r   rø   r  )
rM   r~   r²   r"  ÚcidÚencÚnestedÚncÚcid_attrÚ
nested_objs
    ``       r%   r  z<ResponsesAPIRequestUtils._encode_container_id_on_output_itemþ  s   ù€ ð  ˆ<Øð	¬ð 	´°d±
ö 	ô ˜4Ô ØŸ™ .Ó1ˆCÜ˜#œsÔ#Ù# CÓ(�Ø�?Ø+.�D˜Ñ(Ø ŸH™HÐ%<Ó=ˆFÜ˜vÔ&Ø"ŸJ™J ~Ó6�Ü˜b¤#Ô&Ù'¨Ó+�CØ�Ø14˜˜~Ñ.Ø�x‰x˜Ó 9Ò,Ü(×QÑQØ—H‘H˜YÓ'Ø'Øôð
 ä! $¨¸Ó=ˆÜ�h¤Ô$Ù Ó)ˆCØˆðÜ˜D .°#Ô6ô %,¨DÐ2IÈ4Ó$Pˆ
ØÐ!Ü$×HÑHØØ#Øôô �4˜ Ó&¨)Ò3Ü$×MÑMÜ˜˜i¨Ó.Ø#Øõð 4øô !ò Ü"×(Ñ(ØMØ!%÷ðús   ÄE- Å- FÆFÚ	collectedc                 óZ   — | rt        | «      sy | D ]  }t        j                  ||«       Œ y r!   )r&   r<   Ú'_collect_container_ids_from_output_item)r  r,  r  s      r%   Ú'_collect_container_ids_from_annotationsz@ResponsesAPIRequestUtils._collect_container_ids_from_annotationsK  s4   € ñ
 Ô"5°kÔ"BØØò 	]ˆCÜ$×LÑLÈSÐR[Õ\ñ	]r'   c                 óÔ   — | sy t        | «      rZ| D ]T  }t        |«      r&t        j                  |j	                  d«      |«       Œ4t        j                  t        |dd «      |«       ŒV y y )Nr  )r&   r*   r<   r/  r.   r¶   )rA   r,  r1   s      r%   Ú+_collect_container_ids_from_message_contentzDResponsesAPIRequestUtils._collect_container_ids_from_message_contentU  sj   € ñ
 ØÜ˜wÔ'Øò 
�Ü" 4Ô(Ü,×TÑTØŸ™ Ó/Ø!õô
 -×TÑTÜ  m°TÓ:Ø!õñ
ð (r'   c                 óª  — | €yt        | «      r¾| j                  d«      }t        |t        «      r|r|j	                  |«       | j                  d«      }t        |«      r4|j                  d«      }t        |t        «      r|r|j	                  |«       | j                  d«      dk(  r%t
        j                  | j                  d«      |«       yt        | dd«      }t        |t        «      r|r|j	                  |«       t        | dd«      }|�t
        j                  ||«       t        | dd«      dk(  r"t
        j                  t        | dd«      |«       yy)zDCollect managed or raw ``container_id`` values from one output item.Nr  r#  r3   r=   rA   )	r*   r.   r"   rL   Úaddr<   r1  r¶   r.  )rM   r,  r&  r(  r)  r*  r+  s          r%   r.  z@ResponsesAPIRequestUtils._collect_container_ids_from_output_itemi  s)  € ð ˆ<Øä˜4Ô ØŸ™ .Ó1ˆCÜ˜#œsÔ#©Ø—‘˜cÔ"Ø ŸH™HÐ%<Ó=ˆFÜ˜vÔ&Ø"ŸJ™J ~Ó6�Ü˜b¤#Ô&©2Ø—M‘M "Ô%Ø�x‰x˜Ó 9Ò,Ü(×TÑTØ—H‘H˜YÓ'Øôð ä! $¨¸Ó=ˆÜ�h¤Ô$©Ø�M‰M˜(Ô#ä$+¨DÐ2IÈ4Ó$Pˆ
ØÐ!Ü$×LÑLÈZÐYbÔcä�4˜ Ó&¨)Ò3Ü$×PÑPÜ˜˜i¨Ó.Øõð 4r'   c                 óÚ   — | €g S t        | t        «      r| j                  dg «      }nt        | dg «      xs g }t	        «       }|r|D ]  }t
        j                  ||«       Œ t        |«      S )zBReturn unique container IDs referenced in a Responses API payload.rç   )r"   r)   r.   r¶   Úsetr<   r.  r#   )rµ   rç   r,  rM   s       r%   Ú-collect_container_ids_from_responses_responsezFResponsesAPIRequestUtils.collect_container_ids_from_responses_response�  ss   € ð ÐØˆIä�h¤Ô%Ø—\‘\ (¨BÓ/‰Fä˜X x°Ó4Ò:¸ˆFä%(£Uˆ	ÙØò b�Ü(×PÑPÐQUÐW`Õaðbä�I‹Ðr'   c                 ó  — |xs i }|j                  di «      xs i }|j                  d«      }t        | t        «      r| j                  dg «      }nt        | dg «      }|s| S |D ]  }t        j                  |||¬«       Œ | S )zõEncode container IDs in the response output with provider/model info.

        This walks through all output items and encodes any container_id fields
        so that follow-up container API calls can auto-route to the correct provider.
        r±   rU   rç   )rM   r~   r²   )r.   r"   r)   r¶   r<   r  )r©   r~   rª   r±   r²   rç   rM   s          r%   rº   z:ResponsesAPIRequestUtils._update_container_ids_in_response¡  s    € ð ,Ò1¨rÐØ,<×,@Ñ,@ÀÈrÓ,RÒ,XÐVXˆ
Ø$Ÿ.™.¨Ó.ˆô Ð,¬dÔ3Ø+×/Ñ/°¸"Ó=‰FäÐ3°X¸rÓBˆFáØ)Ð)àò 	ˆDÜ$×HÑHØØ$7Ø!ð Iõ ð	ð &Ð%r'   Útext_formatr   r4   r   c                 ón   — | �2|€0ddl m}  || «      }|� d|d   |d   d   |d   d   |d   d   d	œi}|S |S )
at  
        Convert text_format parameter to text parameter for the responses API.

        Args:
            text_format: Pydantic model class or dict to convert to response format
            text: Existing text parameter (if provided, text_format is ignored)

        Returns:
            ResponseText object with the converted format, or None if conversion fails
        r   )Útype_to_response_format_paramrñ   r3   Újson_schemarw   ÚschemaÚstrict)r3   rw   r<  r=  )Ú litellm.llms.base_llm.base_utilsr:  )r8  r4   r:  Úresponse_formats       r%   Ú!convert_text_format_to_text_paramz:ResponsesAPIRequestUtils.convert_text_format_to_text_paramÂ  sp   € ð Ð" t |ÝVñ &CÀ;Ó%OˆOØÐ*ð Ø /°Ñ 7Ø /°Ñ >¸vÑ FØ"1°-Ñ"@ÀÑ"JØ"1°-Ñ"@ÀÑ"Jñ	ð�ð �Øˆr'   Úsecret_fieldsÚtoolsc                 ór  — ddl m} ddlm} d}| r!t	        | t
        «      r| j                  d«      }d}d}d}|r; ||«      }|j                  |«      }|j                  |«      }|j                  |«      }|r¼|D ]·  }	t	        |	t
        «      sŒ|	j                  d«      dk(  sŒ)|	j                  di «      }
|
sŒ>t	        |
t
        «      sŒO ||
«      }|j                  |«      }|r9|€i }|j                  «       D ]"  \  }}||vri ||<   ||   j                  |«       Œ$ |€i }|j                  |
«       Œ¹ ||||fS )	z¥
        Extract MCP auth headers from the request to pass to MCP server.
        Headers from tools.headers in request body should be passed to MCP server.
        r   )ÚHeaders)ÚMCPRequestHandlerNÚraw_headersr3   ÚmcpÚheaders)Ústarlette.datastructuresrD  ÚAlitellm.proxy._experimental.mcp_server.auth.user_api_key_auth_mcprE  r"   r)   r.   Ú!_get_mcp_auth_header_from_headersÚ)_get_mcp_server_auth_headers_from_headersÚ _get_oauth2_headers_from_headersrx   Úupdate)rA  rB  rD  rE  Úraw_headers_from_requestÚmcp_auth_headerÚmcp_server_auth_headersÚoauth2_headersÚheaders_objÚtoolÚtool_headersÚheaders_obj_from_toolÚtool_mcp_server_auth_headersÚserver_aliasÚheaders_dicts                  r%   Ú extract_mcp_headers_from_requestz9ResponsesAPIRequestUtils.extract_mcp_headers_from_requestä  s�  € õ 	5õ	
ð
 ;?Ð ÙœZ¨´tÔ<Ø'4×'8Ñ'8¸Ó'GÐ$ð '+ˆØDHÐØ04ˆá#Ù!(Ð)AÓ!BˆKØ/×QÑQÐR]Ó^ˆOØ&7×&aÑ&aÐbmÓ&nÐ#Ø.×OÑOÐP[Ó\ˆNáØò F�Ü˜d¤DÕ)¨d¯h©h°vÓ.>À%Ó.GØ#'§8¡8¨I°rÓ#:�LÚ#¬
°<ÄÕ(Fñ 18¸Ó0EÐ-Ø7H×7rÑ7rØ1ó8Ð4ñ 8Ø6Ð>Ø:<Ð 7ð
 ">×!CÑ!CÓ!Eò[ñ !Ø ,Ø ,à#/Ð7NÑ#NØLNÐ$;¸LÑ$IØ 7¸Ñ E× LÑ LÈ\Õ Zð[ð 4Ð;Ø79Ð4Ø0×7Ñ7¸ÕEð1Fð6 Ø#ØØ$ð	
ð 	
r'   )NNr!   )8Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstaticmethodÚobjectrH   rL   r   r#   r   rN   rq   r)   rz   r/   r†   r   r   r”   r   r¨   r   r   r­   rÈ   rÙ   rß   ra   rå   r	   r¹   rí   r¸   r   r   r·   r  r¤   r  r  r  r  r  r  r5  r/  r1  r.  r6  rº   r3   r   r@  r   rZ  r^   r'   r%   r<   r<   >   s|  „ Ù<àð6¸Fð 6Àvò 6ó ð6ð ðUØÐ'Ñ'¨$Ñ.ðUà	ÐÑ	òUó ðUð ð1<ØÐ0Ñ0ð1<àÐ+Ñ,ð1<ð Ð+Ñ,ð1<ð 
ˆf‰ò	1<ó ð1<ðf ð
Ø˜C ˜KÑ(¨4Ñ/ð
à˜S #˜X™¨Ñ-ð
ð 
ˆc�6ˆkÑ	˜TÑ	!ò
ó ð
ð* ðØ˜s™) dÑ*ðà ðð ˜D‘[ðð ! 4™Zð	ð
 òó ðð, ð
 37Ø#'ñ6
Øð6
à'=ð6
ð 'Hð6
ð  $ C™y¨4Ñ/ð	6
ð
 ˜D‘[ð6
ð 
ò6
ó ð6
ðp ð.KØ�S˜#�X‘ð.Kà	*ò.Kó ð.Kðb Øð 37ñØ 4ðà  4™Zðð ˜s C˜x™.¨4Ñ/ðð 
ò	ó ó ðð Øð 37ñØ $ S¨# X¡ðà  4™Zðð ˜s C˜x™.¨4Ñ/ðð 
ˆc�3ˆh‰ò	ó ó ðð ð 37ñ3&Ø 4°t¸CÀ¸H±~Ñ Eð3&à  4™Zð3&ð ˜s C˜x™.¨4Ñ/ð3&ð 
  S¨# X¡Ñ	.ò	3&ó ð3&ðj ð$¨3ð $¸ð $Àò $ó ð$ð ð¨cð °d¸3À¸8±nÀtÑ6Kò ó ðð2 ð
EÀð 
EÐPSð 
EÐX[ò 
Eó ð
Eð ð)Øð)à	ˆs�T‰z˜3ˆÑ	ò)ó ð)ð@ ð8ØÐ.°°S¸&°[Ñ0AÐAÑBð8à˜‘*ð8ð 
Ð% t¨C°¨KÑ'8Ð8Ñ	9ò8ó ð8ðt ðÀFð Èsò ó ðð@ ð
+Ø  4™Zð
+à˜‘*ð
+ð ð
+ð 
ò	
+ó ð
+ð ð2Øð2à	ò2ó ð2ðh ð
°Sð 
¸Tò 
ó ð
ð ð;°3¸±:ð ;À#ÈÁ*ò ;ó ð;ð ðLØ!ðLà	òLó ðLð& ð+Ø  4™Zð+à˜‘*ð+ð ð+ð 
ò	+ó ð+ð  ð9¨3ð 9Ð3Dò 9ó ð9ðv ð8°cð 8¸cò 8ó ð8ð ðØðà  4™Zðð ˜‘*ðð 
ò	ó ðð ðØðà  4™Zðð ˜‘*ðð 
ò	ó ðð. ðJØðJà  4™ZðJð ˜‘*ðJð 
ò	Jó ðJðX ð]Øð]à�s‘8ð]ð 
ò]ó ð]ð ðØðà�s‘8ðð 
òó ðð& ð$Øð$à�s‘8ð$ð 
ò$ó ð$ðL ðÀð È4ÐPSÉ9ò ó ðð  ð 37ñ&Ø 4°t¸CÀ¸H±~Ñ Eð&à  4™Zð&ð ˜s C˜x™.¨4Ñ/ð&ð 
  S¨# X¡Ñ	.ò	&ó ð&ð@ ð *.ñØ˜+Ñ&¨Ñ-°Ñ4ðà�~Ñ&ðð 
�.Ñ	!òó ððB ðC
Ø˜C ˜H‘~¨Ñ,ðC
à˜Ñ $Ñ&ðC
ð 
Øˆd‰
ØˆS�$�s˜C�x‘.Ð Ñ! DÑ(ØˆS�#ˆX‰˜ÑØˆS�#ˆX‰˜Ñð	ñ
òC
ó ñC
r'   r<   c                   ób   — e Zd Zedeez  defd„«       Zedee	e
f   ez  ez  dz  defd„«       Zy)ÚResponseAPILoggingUtilsÚusager   c                 ó8   — t        | t        «      ryd| v rd| v ryy)z1returns True if usage is from OpenAI Response APITÚinput_tokensÚoutput_tokensF)r"   r   )rc  s    r%   Ú_is_response_api_usagez.ResponseAPILoggingUtils._is_response_api_usage,  s'   € ô �eÔ-Ô.ØØ˜UÑ" ¸%Ñ'?ØØr'   Úusage_inputNc                 óh  — | €t        ddd¬«      S t        | t         «      r| S t        | t        «      r t        j	                  | «      st        di | ¤ŽS t        | t        «      r¬t        | «      } | j                  d«      €d| v r| d   | d<   | j                  d«      €d| v r| d   | d<   | j                  d«      €J| j                  d	«      }| j                  d
«      }t        |t        «      rt        |t        «      r||z   | d<   t        di | ¤Ž}n| }|j                  xs d}|j                  xs d}d}|j                  r©t        |j                  t        «      rt        di |j                  ¤Ž}nyt        t        |j                  dd«      t        |j                  dd«      t        |j                  dd«      t        |j                  dd«      t        |j                  dd«      ¬«      }d}t        |dd«      }|r;t        t        |dd«      t        |dd«      t        |dd«      t        |dd«      ¬«      }|j                  xs i j                  «       D �	�
ci c]  \  }	}
|	dvr|	|
“Œ }}	}
t        d||||z   ||dœ|¤Ž}t!        |d«      r#|j"                  �t%        |d|j"                  «       |S c c}
}	w )aë  
        Transforms ResponseAPIUsage or ImageUsage to a Usage object.

        Both have the same spec with input_tokens, output_tokens, and
        input_tokens_details (text_tokens, image_tokens).

        Usage inputs are returned as-is so re-running this helper never drops
        fields. Non-standard provider fields (e.g. xAI's
        server_side_tool_usage_details) are carried onto the returned Usage so
        provider cost calculators can read them after normalization.
        Nr   )Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚinput_tokens_detailsÚinput_token_detailsÚoutput_tokens_detailsÚoutput_token_detailsrl  re  rf  Úcached_tokensÚaudio_tokensÚtext_tokensÚimage_tokensÚcache_write_tokens)rq  rr  rs  rt  ru  Úreasoning_tokens)rv  rt  rs  rr  )rn  rp  rj  rk  rl  Úprompt_tokens_detailsÚcompletion_tokens_details)rj  rk  rl  rw  rx  Úcostr^   )r   r"   r)   rb  rg  r.   Úintr   re  rf  rm  r   r¶   r   Úmodel_extrarx   Úhasattrry  r%  )rh  re  rf  Úresponse_api_usagerj  rk  rw  rx  ro  r’   r   Úextra_usage_fieldsÚ
chat_usages                r%   Ú+_transform_response_api_usage_to_chat_usagezCResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage5  s   € ð ÐÜØØ"#Øôð ô
 �k¤5Ô)ØÐÜ�k¤4Ô(Ô1H×1_Ñ1_Ð`kÔ1lÜÑ'˜;Ñ'Ð'ä�k¤4Ô(Ü˜{Ó+ˆKà�‰Ð5Ó6Ð>ÐCXÐ\gÑCgØ6AÐBWÑ6X�Ð2Ñ3Ø�‰Ð6Ó7Ð?ÐDZÐ^iÑDiØ7BÐCYÑ7Z�Ð3Ñ4Ø�‰˜~Ó.Ð6Ø&1§o¡o°nÓ&E�Ø'2§¡°Ó'G�Ü˜l¬CÔ0´ZÀÌsÔ5SØ2>ÀÑ2N�K Ñ/Ü!1Ñ!@°KÑ!@Ñà!,ÐØ$6×$CÑ$CÒ$HÀqˆØ(:×(HÑ(HÒ(MÈAÐØCGÐØ×2Ò2ÜÐ,×AÑAÄ4ÔHÜ(BÑ(mÐEW×ElÑElÑ(mÑ%ä(BÜ")Ð*<×*QÑ*QÐSbÐdhÓ"iÜ!(Ð);×)PÑ)PÐR`ÐbfÓ!gÜ 'Ð(:×(OÑ(OÐQ^Ð`dÓ eÜ!(Ð);×)PÑ)PÐR`ÐbfÓ!gÜ'.Ð/A×/VÑ/VÐXlÐnrÓ'sô)Ð%ð LPÐ!ÜCJØÐ 7¸óD
Ðñ !Ü(FÜ!(Ð)>Ð@RÐTXÓ!YÜ$Ð%:¸NÈDÓQÜ#Ð$9¸=È$ÓOÜ$Ð%:¸NÈDÓQô	)Ð%ð  2×=Ñ=ÒCÀ×JÑJÓL÷%
á��UØðñ	ð �‰Jð%
Ðñ %
ô "ð 
Ø'Ø/Ø&Ð):Ñ:Ø"7Ø&?ñ
ð !ñ
ˆ
ô Ð% vÔ.Ð3E×3JÑ3JÐ3VÜ�J Ð(:×(?Ñ(?Ô@àÐùó7%
s   ÉJ.)r[  r\  r]  r_  r)   r   r/   rg  r   rL   r`  r   r€  r^   r'   r%   rb  rb  +  si   „ Øð dÐ-=Ñ&=ð À$ò ó ðð ð]Ø˜S &˜[Ñ)Ð,<Ñ<¸uÑDÀtÑKð]à	ò]ó ñ]r'   rb  )2rÂ   r  Úcollections.abcr   r   r   Útypingr   r   r   r	   r
   r   r   Úpydanticr   Útyping_extensionsr   r‚   Úlitellm._loggingr   Ú.litellm.llms.base_llm.responses.transformationr   Úlitellm.types.llms.openair   r   r   r   r   r   r   r   Úlitellm.types.responses.mainr   Úlitellm.types.utilsr   r   r   r   r`  r&   r)   rL   r*   r0   r/   r7   r:   r<   rb  r^   r'   r%   ú<module>rŠ     sæ   ðÛ Û 	ß 7Ñ 7ß N× NÑ Nå Ý $ã Ý +Ý Q÷	÷ 	ó 	õ ;÷ó ð#˜vð #¨&°¸&Ñ1AÑ*Bó #ð#Øð#àˆD��f�ÑÑó#ðNØðNà Ñ%óNðA˜Vð A¨ó Að˜fð ¨ó ÷j
ñ j
÷Zhò hr'   