
    MiA;                         S SK r S SKJrJrJrJrJrJrJrJ	r	J
r
  S SKJr  S SKrS SKJr  S SKJr  S SKJrJrJrJr  S SKJr  S SKJrJrJr   " S	 S
5      r " S S5      rg)    N)	AnyDictListOptionalTypeUnioncastget_type_hintsoverload)	BaseModel)verbose_logger)BaseResponsesAPIConfig)ResponseAPIUsage!ResponsesAPIOptionalRequestParamsResponsesAPIResponseResponseText)DecodedResponseId)PromptTokensDetailsSpecialEnumsUsagec                      \ rS rSrSr\S\\\      S\	S\\
   S\\   S\4
S j5       r\ S#S\S
\S\S\\\      S\	4
S jj5       r\S\	\\4   S\4S j5       r\\ S#S\S\\   S\\	\\4      S\4S jj5       5       r\\ S#S\	\\4   S\\   S\\	\\4      S\	\\4   4S jj5       5       r\ S#S\\\	\\4   4   S\\   S\\	\\4      S\\\	\\4   4   4S jj5       r\S\\   S\\   S\S\4S j5       r\S\S\4S j5       r\S\\   S\\   4S j5       r\S\S\4S j5       r\ S#S\\\S   \4      S\S    S\S    4S! jj5       rS"rg	)$ResponsesAPIRequestUtils   z2Helper utils for constructing ResponseAPI requestssupported_paramsnon_default_paramsdrop_paramscustom_llm_providermodelc           	          U c  g 0 nUR                  5        H  nX`;  d  M
  X   XV'   M     U(       a:  [        R                  SL d  Ub  USL a  g [        R                  " SU SU SU S3S9eg )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_codemessage)keyslitellmr   UnsupportedParamsError)r   r   r   r   r   unsupported_paramsks          q/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/litellm/responses/utils.py_check_valid_arg)ResponsesAPIRequestUtils._check_valid_arg    s     ##((*A((:(="% + ""d*'K4,?44 #233QRdQeeqrwqx  yc  d      Nresponses_api_provider_configresponse_api_optional_paramsallowed_openai_paramsreturnc                 (   SSK Jn  UR                  U 5      n[        [        U5      n[
        R                  XS=(       d    / -   U[        R                  UR                  U S9  UR                  UU [        R                  S9nU" UUU=(       d    / S9nU$ )a  
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_overrides)r   r   r   r   r   )r,   r   r   )optional_paramsr   r-   )litellm.utilsr0   get_supported_openai_paramsr	   r   r   r(   r#   r   r   map_openai_params)r   r+   r,   r-   r0   r   r   mapped_paramss           r'   !get_optional_params_responses_api:ResponsesAPIRequestUtils.get_optional_params_responses_api9   s    $ 	@ 9TT
 "$(DE 11-1L"M1++ = Q Q 	2 	
 6GG)E++ H 
 6)1"7"=2
 r*   paramsc                    SSK Jn  [        [        5      R	                  5       nU R                  SS5      nU R                  S0 5      nU R                  SS5      nUR                  U UUUU Vs0 s H  ofS_M     snS/S9nS	U;   a  [        R                  US	   5      nXS	'   S
U;   a+  SSK J	n	  U	" US
   5      n
U
b  XS
'   OUR                  S
S5        [        [        U5      $ s  snf )z
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_paramsinput)passed_paramsspecial_paramsr   r<   default_param_values#additional_endpoint_specific_paramsprevious_response_idmetadata)add_openai_metadata)r2   r:   r
   r   r"   pop#base_pre_process_non_default_paramsr   <decode_previous_response_id_to_original_previous_response_idrD   r	   )r8   r:   
valid_keysr   r?   r<   r&   r   decoded_previous_response_idrD   converted_metadatas              r'   )get_requested_response_api_optional_paramBResponsesAPIRequestUtils.get_requested_response_api_optional_paramm   s    	=#$EFKKM
$jj)>EHb1!',Dd!K&JJ$-$7'=7A%Bz!gz%B5<I K  	 "%77+C  ,A  ,A"#9:,( :V56++9!45G
5S!T!-1C:."&&z4857IJJ+ &Cs   -C#responses_api_responselitellm_metadatac                     g N rM   r   rN   s      r'   /_update_responses_api_response_id_with_model_idHResponsesAPIRequestUtils._update_responses_api_response_id_with_model_id        	r*   c                     g rP   rQ   rR   s      r'   rS   rT      rU   r*   c                 ,   U=(       d    0 nUR                  S0 5      =(       d    0 nUR                  S5      n[        U [        5      (       a  U S   OU R                  n[        R                  UUUS9n[        U [        5      (       a  X`S'   U $ X`l        U $ )zUpdate 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_infoid)model_idr   response_id)get
isinstancedictrY   r    _build_responses_api_response_id)rM   r   rN   rX   rZ   r[   
updated_ids          r'   rS   rT      s     ,1r%5%9%9,%K%Qr
>>$'
 0$77 #4('** 	 .NN 3# O 

 ,d33+54( &% )3%%%r*   rZ   r[   c                     [        [        R                  R                  5      R	                  XU5      n[
        R                  " UR                  S5      5      R                  S5      nSU 3$ )z#Build the responses_api_response_idutf-8resp_)	strr   %LITELLM_MANAGED_RESPONSE_COMPLETE_STRvalueformatbase64	b64encodeencodedecode)r   rZ   r[   assembled_idbase64_encoded_ids        r'   r_   9ResponsesAPIRequestUtils._build_responses_api_response_id   sj      >>DD

&$
< 	 "(!1!1,2E2Eg2N!O!V!V"
 ()**r*   c                     U R                  SS5      n[        R                  " UR                  S5      5      R	                  S5      nSU;  a  [        SSU S9$ UR                  S5      nSnSn[        U5      S:  aF  US   nUS	   nUS
   nUR                  SS5      nUR                  SS5      nUR                  SS5      n	OU n	[        UUU	S9$ ! [         a1  n
[        R                  " SU  SU
 35        [        SSU S9s Sn
A
$ Sn
A
ff = f)z
Decode the responses_api_response_id

Returns:
    DecodedResponseId: Structured tuple with custom_llm_provider, model_id, and response_id
rc    rb   ;N)r   rZ   r[      r         zlitellm:custom_llm_provider:z	model_id:zresponse_id:zError decoding response_id 'z': )replacerh   	b64decoderj   rk   r   splitlen	Exceptionr   debug)r[   
cleaned_id
decoded_idpartsr   rZ   custom_llm_provider_partmodel_id_partresponse_partdecoded_response_ides              r'   !_decode_responses_api_response_id:ResponsesAPIRequestUtils._decode_responses_api_response_id   sE   -	$,,Wb9J))**;*;G*DELLWUJ *$((,! +  $$S)E #'H E
a+08( %a %a&>&F&F2B'# )00bA&3&;&;NB&O#&1#$$7!/ 
  	  #?}CPQs!ST$$(' 	s%   AC A6C 
D&D DDc                 h    U c  g[         R                  U 5      nUR                  S5      =(       d    S$ )z%Get the model_id from the response_idNrZ   r   r   r\   )r[   r   s     r'   get_model_id_from_response_id6ResponsesAPIRequestUtils.get_model_id_from_response_id  s8     $FF{S 	 #&&z2:d:r*   rB   c                 P    [         R                  U 5      nUR                  SU 5      $ )a  
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   )rB   r   s     r'   rG   UResponsesAPIRequestUtils.decode_previous_response_id_to_original_previous_response_id'  s0    $ %FF$ 	
 #&&}6JKKr*   text_formatr   textr   c                 t    U b4  Uc1  SSK Jn  U" U 5      nUb   SUS   US   S   US   S   US   S   S	.0nU$ U$ )
a<  
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_paramrg   typejson_schemanameschemastrict)r   r   r   r   ) litellm.llms.base_llm.base_utilsr   )r   r   r   response_formats       r'   !convert_text_format_to_text_param:ResponsesAPIRequestUtils.convert_text_format_to_text_param?  so     "t|V <KHO*  / 7 / >v F"1-"@"J"1-"@"J	 r*   rQ   rP   )__name__
__module____qualname____firstlineno____doc__staticmethodr   r   rd   r   boolr(   r   r   r6   r   rK   r   r   rS   r   r_   r   r   r   rG   r   r^   r   __static_attributes__rQ   r*   r'   r   r      s   <"49-  d^ &c]	
  0 
 6:	11'=1 'H1  (S	2	1
 
1 1f .KS#X.K	*.K .Kb  6: 4%c] #4S>2 
	    6: $S#X%c] #4S>2 
c3h	    6:& %&:DcN&J K&%c]& #4S>2& 
#T#s(^3	4	& &B +%c]+3-+ + 
	+ + 66	6 6p ;8C= ;Xc] ; ; L!L	L L.  *.eD$5t$;<=~& 
.	! r*   r   c                   f    \ rS rSr\S\\\4   S\4S j5       r	\S\
\\\4      S\4S j5       rSrg)	ResponseAPILoggingUtilsib  usager.   c                 J    [        U [        5      (       a  gSU ;   a  SU ;   a  gg)z1returns True if usage is from OpenAI Response APITinput_tokensoutput_tokensF)r]   r   )r   s    r'   _is_response_api_usage.ResponseAPILoggingUtils._is_response_api_usagec  s*     e-..U"%'?r*   usage_inputc                    U c  [        SSSS9$ [        U [        5      (       a  [        S0 U D6OU nUR                  =(       d    SnUR
                  =(       d    SnSnUR                  (       a2  [        UR                  R                  UR                  R                  S9n[        UUX#-   US9n[        US5      (       a$  UR                  b  [        USUR                  5        U$ )z7Tranforms the ResponseAPIUsage object to a Usage objectNr   )prompt_tokenscompletion_tokenstotal_tokens)cached_tokensaudio_tokens)r   r   r   prompt_tokens_detailscostrQ   )r   r]   r^   r   r   r   input_tokens_detailsr   r   r   hasattrr   setattr)r   response_api_usager   r   r   
chat_usages         r'   +_transform_response_api_usage_to_chat_usageCResponseAPILoggingUtils._transform_response_api_usage_to_chat_usagel  s    
 "#  +t,, +{+ 	
 0<<A!3!A!A!FQ?C22$70EESS/DDQQ%! '/&:"7	

 %v..3E3J3J3VJ(:(?(?@r*   rQ   N)r   r   r   r   r   r   r^   r   r   r   r   r   r   r   rQ   r*   r'   r   r   b  sa    eD2B,B&C    "eD*:$:;<"	" "r*   r   )rh   typingr   r   r   r   r   r   r	   r
   r   pydanticr   r#   litellm._loggingr   .litellm.llms.base_llm.responses.transformationr   litellm.types.llms.openair   r   r   r   litellm.types.responses.mainr   litellm.types.utilsr   r   r   r   r   rQ   r*   r'   <module>r      sQ    
 
 
   + Q  ; H HB BJ
- -r*   