
    AHj*                       U 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mZmZ d dlmZ d dlmZ d dlmZ d dlZd dlZd dlZd dlmZ d d	lmZ d
ZdZdZdZdZdZ dZ!ejD                  jG                  ejD                  jI                  d      d      Z%d?dZ&d@dZ'dAdZ(dBdZ)dCdZ* ed       G d d             Z+ e+dd       e+dd       e+d d!d" #       e+d$d%d& #       e+d'd()       e+d*d+d, #       e+d-       e+d.       e+d/d0d1 #       e+d2d3d4 #      g
Z,d5e-d6<   dDdEd7Z.dFd8Z/	 	 	 	 	 	 	 	 	 	 	 	 dGd9Z0	 dH	 	 	 	 	 dId:Z1	 	 dHd;d<d=	 	 	 	 	 	 	 	 	 dJd>Z2y)K    )annotations)AnyCallableDictFinalListOptionalSequenceTuple)datetime	timedeltatimezone)Lock)Path)	dataclassN)sap_service_key)_get_httpx_clientz/oauth/tokenAICORE_CONFIGAICORE_HOMEAICORE_PROFILEVCAP_SERVICESaicoreAICORE_SERVICE_KEY~z.aicorec                 >    t        j                  t        t              S N)osgetenvHOME_PATH_ENV_VARDEFAULT_HOME_PATH     T/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/llms/sap/credentials.py	_get_homer$      s    99&(9::r"   c                ~    | }|D ]5  }t        |t              r||vrt        dj                  |            ||   }7 |S )N.)
isinstancedictKeyErrorjoin)dpathcurks       r#   _get_nestedr/      sI    C #t$388D>**!f Jr"   c                    t         j                  j                  |       }|sy 	 t        j                  |      S # t        j
                  $ r Y y w xY wr   )r   environgetjsonloadsJSONDecodeError)var_nameraws     r#   _load_json_envr8   (   sE    
**..
"Czz# s   9 AAc                 (    t        t              xs i S r   )r8   VCAP_SERVICES_ENV_VARr!   r"   r#   
_load_vcapr;   2   s    /06B6r"   c                    t               j                         D ]#  }|D ]  }|j                  d      | k(  s|c c S  % y )Nlabel)r;   valuesr2   )r=   servicessvcs      r#   _get_vcap_servicerA   6   sF    L'')  	Cwww5(
	 r"   T)frozenc                  B    e Zd ZU ded<   dZded<   dZded<   dZded	<   y)
CredentialsValuestrnameNzOptional[Tuple[str, ...]]vcap_keyOptional[str]defaultzOptional[Callable[[str], str]]transform_fn)__name__
__module____qualname____annotations__rG   rI   rJ   r!   r"   r#   rD   rD   >   s'    
I*.H'.!G]!37L07r"   rD   	client_id)clientidclient_secret)clientsecretauth_urlurlc                d    | j                  d      | j                  t              rdz   S t        z   S N/ rstripendswithAUTH_ENDPOINT_SUFFIXrT   s    r#   <lambda>r^   L   .    C232"O 9M"O r"   )rJ   base_url)serviceurls
AI_API_URLc                T    | j                  d      | j                  d      rdz   S dz   S )NrX   z/v2rY   )r[   r\   rT   s    r#   r^   r^   R   s+    Ce$2"1 */"1 r"   resource_grouprI   )rI   cert_url)certurlc                d    | j                  d      | j                  t              rdz   S t        z   S rW   rZ   rT   s    r#   r^   r^   Y   r_   r"   cert_file_pathkey_file_pathcert_str)certificatec                &    | j                  dd      S N\n
replacess    r#   r^   r^   a   s    QYYud=S r"   key_str)keyc                &    | j                  dd      S rm   rp   rr   s    r#   r^   r^   d   s    AIIeT4J r"   zFinal[List[CredentialsValue]]CREDENTIAL_VALUESc                    t        t                     }| xs# t        j                  j	                  t
              } t        j                  t              }|rt        |      n|| dv rdnd|  dz  }|rB|j                         r2	 |j                  d      5 }t        j                  |      cddd       S |s| dvrt        d	| d
| d      i S # 1 sw Y   nxY w'# t        j                  $ r t        | d      w xY w)z
    Loads config JSON from:
      1) $AICORE_CONFIG if set, otherwise
      2) $AICORE_HOME/config.json (or config_<profile>.json when profile is given/not default)
    Returns {} when nothing is found.
    )NrY   rI   zconfig.jsonconfig_z.jsonzutf-8)encodingNz, is not valid JSON. Please fix or remove it!z)Unable to locate profile config file at 'z' in AICORE_HOME '')r   r$   r   r1   r2   PROFILE_ENV_VARr   CONFIG_FILE_ENV_VARexistsopenr3   loadr5   r)   FileNotFoundError)profilehomecfg_envcfg_pathfs        r#   	init_confr   i   s    	D88Gii+,G  	W  33 wiu-		  HOO%	V0 $Ayy|$ $ 7"777zASTXSYYZ[
 	
 I$ $ $## 	VhZ'STUU	Vs$   C C*	C CC "C=c                (    d| j                          S )NAICORE_)upper)rF   s    r#   	_env_namer      s    TZZ\N##r"   c                  | j                   |v r|| j                      || j                      S t        | j                         }||v r
||   ||   S || j                   fD ]  }||v s||   ||   c S  |r7| j                  r+	 t        |d| j                  z         }||S 	 | j
                  S | j
                  S # t        $ r Y | j
                  S w xY w)N)credentials)rF   r   rG   r/   r)   rI   )credkwargsenvconfigservice_likeenv_keyru   vals           r#   _resolve_valuer      s     yyFvdii0<dii   		"G#~#g,27| # &=VC[4#;
 	l,<t}},LMC
  <<4<<	  	 <<		s   B9 9	CCc                   t        |      }t        j                  }d}|s,| xs( t        xs  t	        t
              xs t        t              }i }t        D ]A  }t        |||||      }||j                  r|j                  |      }|||j                  <   C d|j                         v r|j                  d      |d<   |S )a>  
    Resolution order per key:
      kwargs
      > env (AICORE_<NAME>)
      > config (AICORE_<NAME> or plain <name>)
      > service-like source from JSON in $AICORE_SERVICE_KEY (same structure as a VCAP service object)
        falling back to service entry in $VCAP_SERVICES with label 'aicore'
      > default
    N)r   r   r   r   re   rS   )r   r   r1   r   r8   SERVICE_KEY_ENV_VARrA   VCAP_AICORE_SERVICE_NAMErw   r   rJ   rF   keyspop)	service_keyr   r   r   r   r   outr   values	            r#   fetch_credentialsr      s     wF
**CL  ;;12; !!9:	 	 C! tFFYef=%%e,EDII SXXZ''*-JJr"   g      >@<   )timeoutexpiry_buffer_minutesc                  	
 t        d| |d|}|j                  d      
|j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      
rst        d	      d
ud
uxr d
ud
uxr d
ug}t        d |D              dk7  rt        d      t	               d
d
dd
fd	d	fddfd}||d   |d   fS )a  
    Creates a callable that fetches and caches an OAuth2 bearer token
    using credentials from `fetch_credentials()`.

    The callable:
      - Automatically loads credentials via fetch_credentials(profile, **overrides)
      - Fetches a new token only if expired or near expiry
      - Caches token thread-safely with a configurable refresh buffer

    Args:
        profile: Optional AICore profile name
        timeout: HTTP request timeout in seconds (default 30s)
        expiry_buffer_minutes: Refresh the token this many minutes before expiry
        overrides: Any explicit credential overrides (client_id, client_secret, etc.)

    Returns:
        Callable[[], str]: function returning a valid "Bearer <token>" string.
    )r   r   rS   rO   rQ   rj   rt   rh   ri   z@fetch_credentials did not return valid 'auth_url' or 'client_id'Nc              3  2   K   | ]  }t        |        y wr   )bool).0ms     r#   	<genexpr>z$get_token_creator.<locals>.<genexpr>  s     
"q47
"s      zuInvalid credentials: provide exactly one of client_secret, (cert_str & key_str), or (cert_file_path & key_file_path).c                   dd}r|d<   t               }|j                  
|      }	 |j                          |j                         }|d   }t	        |j                  dd            }t        j                  t        j                        t        |      z   }d	| |fS # t        $ r*}t        |d
t        |            }	t        d|	       |d }~ww xY w)Nclient_credentials)
grant_typerO   rQ   )dataaccess_token
expires_ini  )secondszBearer textzToken request failed: )r   postraise_for_statusr3   intr2   r   nowr   utcr   	ExceptiongetattrrE   RuntimeError)	cert_pairr   clientresppayloadr   r   expiry_dateemsgrS   rO   rQ   s             r#   _request_tokenz)get_token_creator.<locals>._request_token  s    2K$1D!"${{8${/		F!!#iikG">2LW[[t<=J",,x||4y7TTK\N+[88 	F$A/C!7u=>AE	Fs   A6B# #	C,%CCc                 .   	r        S rۉrىj                  dd      } j                  dd      }t        j                         5 }t        j                  j                  |d      }t        j                  j                  |d      }t        |d      5 }|j                  |        d d d        t        |d      5 }|j                  |       d d d         ||f      cd d d        S  
f      S # 1 sw Y   NxY w# 1 sw Y   4xY w# 1 sw Y   ,xY w)Nrn   ro   zcert.pemzkey.pemw)r   )rq   tempfileTemporaryDirectoryr   r,   r*   r   write)cert_str_fixedkey_str_fixedtmp	cert_pathkey_pathr   r   rh   rj   rQ   ri   rt   s         r#   _fetch_tokenz'get_token_creator.<locals>._fetch_token-  s   !##%--eT:N#OOE48M,,. G#GGLLj9	77<<Y7)S) ,QGGN+,(C( +AGGM*+%H0EFG G (GHH, ,+ +G Gs=   ADC3&D:C?D3C<	8D?D	DDc                     5  t        j                  t        j                        } | z
  t	              k  r
        \  cd d d        S # 1 sw Y   y xY w)N)minutes)r   r   r   r   r   )r   r   r   locktokentoken_expirys    r#   	get_tokenz$get_token_creator.<locals>.get_token@  sZ     	,,x||,C'#%	:O(PP&2n#|	 	 	s   AAAr`   rd   r!   r   )returnztuple[str, datetime]r   rE   )r   r2   
ValueErrorsumr   )r   r   r   r   	overridesr   modesr   r   r   rS   rh   rj   rO   rQ   ri   rt   r   r   r   s      `    @@@@@@@@@@@@r#   get_token_creatorr      sJ   8 #4 ##4=#K z*H,IOOO4Mz*Hooi(G __%56NOOO4M 9N
 	

 	T!			5'"5	t	#	AT(AE
 
"E
""a'I
 	

 6DE'+LF F&I I&
 
 k*-{;K/LLLr"   r   )r+   Dict[str, Any]r,   zSequence[str]r   r   )r6   rE   r   Optional[Dict[str, Any]])r   r   )r=   rE   r   r   r   )r   rH   r   r   )rF   rE   r   rE   )r   rD   r   r   r   Dict[str, str]r   r   r   r   r   rH   )NN)r   rH   r   rH   r   r   )
r   rH   r   rH   r   floatr   r   r   z"Tuple[Callable[[], str], str, str])3
__future__r   typingr   r   r   r   r   r	   r
   r   r   r   r   	threadingr   pathlibr   dataclassesr   r3   r   r   litellmr   &litellm.llms.custom_httpx.http_handlerr   r]   r}   r   r|   r:   r   r   r,   r*   
expanduserr    r$   r/   r8   r;   rA   rD   rw   rN   r   r   r   r   r   r!   r"   r#   <module>r      s!   " N N N 2 2   !  	  # D% % ! "' # * GGLL!3!3C!8)D ;7 $8 8 8 [-0_&78O %1 %y9O %&_%$3S 8*J; 4 0  F$N$ 
    
	 
   +   H AE##0=##N "&!oM !#oMoMoM 	oM
 oM (oMr"   